135 lines
2.2 KiB
C++
135 lines
2.2 KiB
C++
#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<char> 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);
|
|
}
|