2017-09-19 04:34:08 -04:00
|
|
|
|
2014-04-29 11:37:15 -04:00
|
|
|
// AesCfb128Decryptor.cpp
|
|
|
|
|
|
|
|
// Implements the cAesCfb128Decryptor class decrypting data using AES CFB-128
|
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "AesCfb128Decryptor.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-03-08 11:37:36 -05:00
|
|
|
cAesCfb128Decryptor::cAesCfb128Decryptor(void) :
|
2014-04-29 11:37:15 -04:00
|
|
|
m_IsValid(false)
|
|
|
|
{
|
2021-03-28 08:34:57 -04:00
|
|
|
#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)
|
2021-03-08 11:37:36 -05:00
|
|
|
if (!CryptAcquireContext(&m_Aes, nullptr, nullptr, PROV_RSA_AES, CRYPT_VERIFYCONTEXT))
|
|
|
|
{
|
|
|
|
throw std::system_error(GetLastError(), std::system_category());
|
|
|
|
}
|
|
|
|
#else
|
2017-08-30 10:00:06 -04:00
|
|
|
mbedtls_aes_init(&m_Aes);
|
2021-03-08 11:37:36 -05:00
|
|
|
#endif
|
2014-04-29 11:37:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cAesCfb128Decryptor::~cAesCfb128Decryptor()
|
|
|
|
{
|
2021-03-08 11:37:36 -05:00
|
|
|
// Clear the leftover in-memory data, so that they can't be accessed by a backdoor:
|
2021-03-28 08:34:57 -04:00
|
|
|
#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)
|
2021-03-08 11:37:36 -05:00
|
|
|
CryptReleaseContext(m_Aes, 0);
|
|
|
|
#else
|
2017-08-30 10:00:06 -04:00
|
|
|
mbedtls_aes_free(&m_Aes);
|
2021-03-08 11:37:36 -05:00
|
|
|
#endif
|
2014-04-29 11:37:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cAesCfb128Decryptor::Init(const Byte a_Key[16], const Byte a_IV[16])
|
|
|
|
{
|
|
|
|
ASSERT(!IsValid()); // Cannot Init twice
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2021-03-28 08:34:57 -04:00
|
|
|
#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)
|
2021-03-08 11:37:36 -05:00
|
|
|
struct Key
|
|
|
|
{
|
|
|
|
PUBLICKEYSTRUC Header;
|
|
|
|
DWORD Length;
|
|
|
|
Byte Key[16];
|
|
|
|
} Key;
|
|
|
|
|
|
|
|
const DWORD Mode = CRYPT_MODE_CFB;
|
|
|
|
Key.Header = { PLAINTEXTKEYBLOB, CUR_BLOB_VERSION, 0, CALG_AES_128 };
|
|
|
|
Key.Length = 16;
|
|
|
|
std::copy_n(a_Key, 16, Key.Key);
|
|
|
|
|
|
|
|
CryptImportKey(m_Aes, reinterpret_cast<const BYTE *>(&Key), sizeof(Key), 0, 0, &m_Key);
|
|
|
|
CryptSetKeyParam(m_Key, KP_MODE, reinterpret_cast<const BYTE *>(&Mode), 0);
|
|
|
|
CryptSetKeyParam(m_Key, KP_IV, a_IV, 0);
|
|
|
|
#else
|
|
|
|
std::copy_n(a_IV, 16, m_IV);
|
2017-08-30 10:00:06 -04:00
|
|
|
mbedtls_aes_setkey_enc(&m_Aes, a_Key, 128);
|
2021-03-08 11:37:36 -05:00
|
|
|
#endif
|
|
|
|
|
2014-04-29 11:37:15 -04:00
|
|
|
m_IsValid = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-03-08 11:37:36 -05:00
|
|
|
void cAesCfb128Decryptor::ProcessData(std::byte * const a_EncryptedIn, const size_t a_Length)
|
2014-04-29 11:37:15 -04:00
|
|
|
{
|
|
|
|
ASSERT(IsValid()); // Must Init() first
|
2021-03-08 11:37:36 -05:00
|
|
|
|
2021-03-28 08:34:57 -04:00
|
|
|
#if PLATFORM_CRYPTOGRAPHY && defined(_WIN32)
|
2021-03-08 11:37:36 -05:00
|
|
|
ASSERT(a_Length <= std::numeric_limits<DWORD>::max());
|
|
|
|
|
|
|
|
DWORD Length = static_cast<DWORD>(a_Length);
|
|
|
|
CryptDecrypt(m_Key, 0, FALSE, 0, reinterpret_cast<BYTE *>(a_EncryptedIn), &Length);
|
|
|
|
#else
|
|
|
|
mbedtls_aes_crypt_cfb8(&m_Aes, MBEDTLS_AES_DECRYPT, a_Length, m_IV, reinterpret_cast<unsigned char *>(a_EncryptedIn), reinterpret_cast<unsigned char *>(a_EncryptedIn));
|
|
|
|
#endif
|
2014-04-29 11:37:15 -04:00
|
|
|
}
|