diff options
Diffstat (limited to 'utils/decrypt_file.cpp')
-rw-r--r-- | utils/decrypt_file.cpp | 172 |
1 files changed, 61 insertions, 111 deletions
diff --git a/utils/decrypt_file.cpp b/utils/decrypt_file.cpp index d8c42c4..092b249 100644 --- a/utils/decrypt_file.cpp +++ b/utils/decrypt_file.cpp @@ -8,8 +8,6 @@ #include "file_cmd_parser.hpp" -#include <aesni/all.h> - #include <aesnixx/all.hpp> #include <boost/program_options.hpp> @@ -44,118 +42,70 @@ namespace std::vector<char> src_buf; src_buf.reserve(size); - src_buf.assign(std::istreambuf_iterator<char>(ifs), - std::istreambuf_iterator<char>()); + src_buf.assign( + std::istreambuf_iterator<char>(ifs), + std::istreambuf_iterator<char>()); return src_buf; } - void write_file(const std::string& path, const std::vector<char>& src) + void write_file( + const std::string& path, + const std::vector<unsigned char>& 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<const char*>(src.data()), src.size()); } - template <aesni::Algorithm algorithm> - bool decrypt_file_with_algorithm( - const AesNI_BoxKey& box_key, - aesni::Mode mode, + void decrypt_file( + aesni::Box& box, std::deque<std::string>& args) { - AesNI_BoxBlock iv; - AesNI_BoxBlock* iv_ptr = nullptr; - - if (aesni::mode_requires_initialization_vector(mode)) - { - if (args.empty()) - return false; - - aesni::from_string<algorithm>(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); - - AesNI_Box box; - - aesni_box_init( - &box, - algorithm, - &box_key, - mode, - iv_ptr, - aesni::ErrorDetailsThrowsInDestructor()); - - std::size_t dest_size; - - aesni_box_decrypt_buffer( - &box, - src_buf.data(), - src_buf.size(), - nullptr, - &dest_size, - aesni::ErrorDetailsThrowsInDestructor()); - - std::vector<char> dest_buf; - dest_buf.resize(dest_size); - - aesni_box_decrypt_buffer( - &box, - src_buf.data(), - src_buf.size(), - dest_buf.data(), - &dest_size, - aesni::ErrorDetailsThrowsInDestructor()); - - dest_buf.resize(dest_size); + const auto dest_buf = box.decrypt_buffer( + src_buf.data(), src_buf.size()); write_file(dest_path, dest_buf); - - return true; } - bool decrypt_file( + void decrypt_file( aesni::Algorithm algorithm, aesni::Mode mode, std::deque<std::string>& args) { if (args.empty()) - return false; + throw_key_required(); - AesNI_BoxKey box_key; + aesni::Box::Key key; + aesni::Box::parse_key(key, algorithm, args.front()); + args.pop_front(); - switch (algorithm) + if (aesni::mode_requires_initialization_vector(mode)) { - case AESNI_AES128: - aesni::from_string<AESNI_AES128>( - box_key.aes128_key, args.front()); - args.pop_front(); - return decrypt_file_with_algorithm<AESNI_AES128>( - box_key, mode, args); - - case AESNI_AES192: - aesni::from_string<AESNI_AES192>( - box_key.aes192_key, args.front()); - args.pop_front(); - return decrypt_file_with_algorithm<AESNI_AES192>( - box_key, mode, args); - - case AESNI_AES256: - aesni::from_string<AESNI_AES256>( - box_key.aes256_key, args.front()); - args.pop_front(); - return decrypt_file_with_algorithm<AESNI_AES256>( - box_key, mode, args); - - default: - return false; + if (args.empty()) + throw_iv_required(); + + aesni::Box::Block iv; + aesni::Box::parse_block(iv, algorithm, args.front()); + args.pop_front(); + + decrypt_file( + aesni::Box(algorithm, key, mode, iv), args); + } + else + { + decrypt_file( + aesni::Box(algorithm, key), args); } } } @@ -165,38 +115,38 @@ int main(int argc, char** argv) try { CommandLineParser cmd_parser("decrypt_file.exe"); - cmd_parser.parse(argc, argv); - - if (cmd_parser.requested_help()) + try { - std::cout << cmd_parser; - return 0; - } + cmd_parser.parse(argc, argv); - std::deque<std::string> args{ std::make_move_iterator(cmd_parser.args.begin()), - std::make_move_iterator(cmd_parser.args.end()) }; + if (cmd_parser.requested_help()) + { + std::cout << cmd_parser; + return 0; + } - if (!decrypt_file(cmd_parser.algorithm, cmd_parser.mode, args)) + std::deque<std::string> args( + std::make_move_iterator(cmd_parser.args.begin()), + std::make_move_iterator(cmd_parser.args.end())); + + decrypt_file(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; } |