/* * Copyright (c) 2018 shchmue * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include #include #include #include "Common.hpp" typedef std::vector byte_vector; class Key { public: Key(std::string name, u64 xx_hash, byte_vector hash, u8 length, byte_vector key); // init with hash only Key(std::string name, u64 xx_hash, byte_vector hash, u8 length); // init with key only Key(std::string name, u8 length, byte_vector key); // temp key, no name stored Key(byte_vector key, u8 length); // key to be assigned later Key(std::string name, u8 length); // for declaration only Key(); bool found() const { return is_found; } void set_found() { is_found = true; } // write key to file void save_key(std::ofstream &file); static const size_t get_saved_key_count() { return saved_key_count; } // return CTR-decrypted data byte_vector aes_decrypt_ctr(const byte_vector &data, byte_vector iv); // return ECB-decrypted data byte_vector aes_decrypt_ecb(const byte_vector &data); // return CMAC of data byte_vector cmac(byte_vector data); // find key in buffer by hash, optionally specify start offset void find_key(const byte_vector &buffer); // get key encryption key byte_vector generate_kek(Key &master_key, const Key &kek_seed, const Key &key_seed); byte_vector key; private: std::string name; u64 xx_hash; byte_vector hash; u8 length; bool is_found = false; static size_t saved_key_count; };