From f9665896e3deb6c449c764ba8b30f700abe36cd5 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Tue, 20 Oct 2015 03:11:50 +0300 Subject: cxx: implement "boxes" --- utils/decrypt_bmp.cpp | 177 +++++++++++++++++++------------------------------- 1 file changed, 66 insertions(+), 111 deletions(-) (limited to 'utils/decrypt_bmp.cpp') diff --git a/utils/decrypt_bmp.cpp b/utils/decrypt_bmp.cpp index 802283d..559b5d5 100644 --- a/utils/decrypt_bmp.cpp +++ b/utils/decrypt_bmp.cpp @@ -8,8 +8,6 @@ #include "file_cmd_parser.hpp" -#include - #include #include @@ -47,43 +45,35 @@ namespace std::vector src_buf; src_buf.reserve(size); - src_buf.assign(std::istreambuf_iterator(ifs), - std::istreambuf_iterator()); + src_buf.assign( + std::istreambuf_iterator(ifs), + std::istreambuf_iterator()); return src_buf; } - void write_file(const std::string& path, const std::vector& src) + void write_file( + const std::string& path, + const std::vector& src) { std::ofstream ofs; ofs.exceptions(std::ofstream::badbit | std::ofstream::failbit); ofs.open(path, std::ofstream::binary); - ofs.write(src.data(), src.size()); + ofs.write(reinterpret_cast(src.data()), src.size()); } - template - bool decrypt_bmp_with_algorithm( - const AesNI_BoxKey& box_key, - aesni::Mode mode, + void decrypt_bmp( + aesni::Box& box, std::deque& args) { - AesNI_BoxBlock iv; - AesNI_BoxBlock* iv_ptr = nullptr; - - if (aesni::mode_requires_initialization_vector(mode)) - { - if (args.empty()) - return false; - - aesni::from_string(iv.aes_block, args.front()); - iv_ptr = &iv; - args.pop_front(); - } - - if (args.size() != 2) - return false; + if (args.empty()) + throw_src_path_required(); + const auto src_path = args.front(); + args.pop_front(); - const auto src_path = args[0]; - const auto dest_path = args[1]; + if (args.empty()) + throw_dest_path_required(); + const auto dest_path = args.front(); + args.pop_front(); const auto src_buf = read_file(src_path); @@ -93,79 +83,44 @@ namespace const auto cipherpixels = src_buf.data() + header_size; const auto cipherpixels_size = src_buf.size() - header_size; - AesNI_Box box; - - aesni_box_init( - &box, - algorithm, - &box_key, - mode, - iv_ptr, - aesni::ErrorDetailsThrowsInDestructor()); - - std::size_t pixels_size; - - aesni_box_decrypt_buffer( - &box, - cipherpixels, - cipherpixels_size, - nullptr, - &pixels_size, - aesni::ErrorDetailsThrowsInDestructor()); - - std::vector dest_buf; - dest_buf.resize(header_size + pixels_size); - std::memcpy(dest_buf.data(), src_buf.data(), header_size); - - aesni_box_decrypt_buffer( - &box, - cipherpixels, - cipherpixels_size, - dest_buf.data() + header_size, - &pixels_size, - aesni::ErrorDetailsThrowsInDestructor()); - - dest_buf.resize(header_size + pixels_size); - write_file(dest_path, dest_buf); + const auto pixels = box.decrypt_buffer( + cipherpixels, cipherpixels_size); + + std::vector dest_buf(header_size + pixels.size()); + std::memcpy(&dest_buf[0], bmp_header, header_size); + std::memcpy(&dest_buf[0] + header_size, pixels.data(), pixels.size()); - return true; + write_file(dest_path, dest_buf); } - bool decrypt_bmp( + void decrypt_bmp( aesni::Algorithm algorithm, aesni::Mode mode, std::deque& args) { if (args.empty()) - return false; + throw_key_required(); + + aesni::Box::Key key; + aesni::Box::parse_key(key, algorithm, args.front()); + args.pop_front(); + + if (aesni::mode_requires_initialization_vector(mode)) + { + if (args.empty()) + throw_iv_required(); - AesNI_BoxKey box_key; + aesni::Box::Block iv; + aesni::Box::parse_block(iv, algorithm, args.front()); + args.pop_front(); - switch (algorithm) + decrypt_bmp( + aesni::Box(algorithm, key, mode, iv), args); + } + else { - case AESNI_AES128: - aesni::from_string( - box_key.aes128_key, args.front()); - args.pop_front(); - return decrypt_bmp_with_algorithm( - box_key, mode, args); - - case AESNI_AES192: - aesni::from_string( - box_key.aes192_key, args.front()); - args.pop_front(); - return decrypt_bmp_with_algorithm( - box_key, mode, args); - - case AESNI_AES256: - aesni::from_string( - box_key.aes256_key, args.front()); - args.pop_front(); - return decrypt_bmp_with_algorithm( - box_key, mode, args); - - default: - return false; + decrypt_bmp( + aesni::Box(algorithm, key), args); } } } @@ -175,38 +130,38 @@ int main(int argc, char** argv) try { CommandLineParser cmd_parser("decrypt_bmp.exe"); - cmd_parser.parse(argc, argv); - - if (cmd_parser.requested_help()) + try { - std::cout << cmd_parser; - return 0; - } + cmd_parser.parse(argc, argv); + + if (cmd_parser.requested_help()) + { + std::cout << cmd_parser; + return 0; + } - std::deque args{ std::make_move_iterator(cmd_parser.args.begin()), - std::make_move_iterator(cmd_parser.args.end()) }; + std::deque args( + std::make_move_iterator(cmd_parser.args.begin()), + std::make_move_iterator(cmd_parser.args.end())); - if (!decrypt_bmp(cmd_parser.algorithm, cmd_parser.mode, args)) + decrypt_bmp(cmd_parser.algorithm, cmd_parser.mode, args); + } + catch (const boost::program_options::error& e) { - std::cout << cmd_parser; + std::cerr << "Usage error: " << e.what() << "\n"; + std::cerr << cmd_parser; + return 1; + } + catch (const aesni::Error& e) + { + std::cerr << e; return 1; } - - return 0; - } - catch (const boost::program_options::error& e) - { - std::cerr << "Usage error: " << e.what() << "\n"; - return 1; - } - catch (const aesni::Error& e) - { - std::cerr << e; - return 1; } catch (const std::exception& e) { std::cerr << e.what() << "\n"; return 1; } + return 0; } -- cgit v1.2.3