#include "key.h" #include "../global.h" #include "HardDriveSerialNumber.h" #include "md5.h" #include "aes.hpp" key::key() { m_crypt = new uint8_t[48]; } key::~key() { if (m_crypt) delete m_crypt; } std::string key::gen_gts_sn(void) { return g_gno; } std::string key::gen_rtc_sn(void) { return std::to_string(g_ScanSerial); } std::string key::gen_hd_sn(void) { MasterHardDiskSerial* diskSerial = new MasterHardDiskSerial(); std::vector Serial; diskSerial->GetSerialNo(Serial); delete diskSerial; std::string sn; sn.resize(8); for (unsigned int i = 0; i < 8; i++) sn[i] = Serial[i]; return sn; } void key::InitKey() { //#ifdef _DEBUG m_gts_sn = ""; m_rtc_sn = ""; //#else m_gts_sn = gen_gts_sn(); m_rtc_sn = gen_rtc_sn(); //#endif m_hd_sn = gen_hd_sn(); } std::string key::get_key(const uint8_t *crypt) { m_gts_sn.resize(16); m_rtc_sn.resize(16); m_hd_sn.resize(16); if (crypt) { for (int i = 0; i < 48; i++) m_crypt[i] = crypt[i]; struct AES_ctx ctx; AES_init_ctx(&ctx, crypt_key); AES_ECB_decrypt(&ctx, m_crypt); AES_ECB_decrypt(&ctx, m_crypt + 16); AES_ECB_decrypt(&ctx, m_crypt + 32); for (int i = 0; i < 16; i++) m_gts_sn[i] = m_crypt[i]; for (int i = 0; i < 16; i++) m_rtc_sn[i] = m_crypt[i + 16]; for (int i = 0; i < 16; i++) m_hd_sn[i] = m_crypt[i + 32]; } m_key.resize(16); for (int i = 0; i < 16; i++) m_key[i] = m_gts_sn[i] ^ m_rtc_sn[i]; for (int i = 0; i < 16; i++) m_key[i] ^= m_hd_sn[i]; m_key = md5(m_key); return m_key; } uint8_t * key::get_crypt(void) { struct AES_ctx ctx; m_gts_sn.resize(16); m_rtc_sn.resize(16); m_hd_sn.resize(16); for (int i = 0; i < 16; i++) m_crypt[i] = m_gts_sn[i]; for (int i = 16; i < 32; i++) m_crypt[i] = m_rtc_sn[i - 16]; for (int i = 32; i < 48; i++) m_crypt[i] = m_hd_sn[i - 32]; AES_init_ctx(&ctx, crypt_key); AES_ECB_encrypt(&ctx, m_crypt); AES_ECB_encrypt(&ctx, m_crypt + 16); AES_ECB_encrypt(&ctx, m_crypt + 32); return m_crypt; } void key::aes_encrypt(uint8_t *data) { struct AES_ctx ctx; AES_init_ctx(&ctx, crypt_key); AES_ECB_encrypt(&ctx, data); } void key::aes_decrypt(uint8_t *data) { struct AES_ctx ctx; AES_init_ctx(&ctx, crypt_key); AES_ECB_decrypt(&ctx, data); }