#ifndef AESNIKEYINIT_H
|
#define AESNIKEYINIT_H
|
|
#if defined (__GNUC__)
|
#define ALIGN16 __attribute__ ( (aligned (16)))
|
#else
|
#define ALIGN16 __declspec (align (16))
|
#endif
|
|
#include "aesni-key-exp.h"
|
|
typedef struct KEY_SCHEDULE{
|
ALIGN16 unsigned char KEY[16*15];
|
unsigned int nr;
|
} AES_KEY;
|
|
/*!
|
* @brief AES_set_encrypt_key takes the "userKey" and computes it to an allowed AES_Encryption_Key "key" of size "bits"
|
* @param userKey
|
* @param bits
|
* @param key
|
* @return -1 if userKey or key is empty/nullptr
|
* @return 0 if encryption-key got succesfully computed
|
* @return -2 if bits didn't match 128 or 192 or 256 (allowed key sizes)
|
*
|
*/
|
int AES_set_encrypt_key (const unsigned char *userKey,
|
const int bits,
|
AES_KEY *key)
|
{
|
if (!userKey || !key)
|
return -1;
|
|
if (bits == 128)
|
{
|
AES_128_Key_Expansion (userKey,key->KEY);
|
key->nr = 10;
|
return 0;
|
}
|
else if (bits == 192)
|
{
|
AES_192_Key_Expansion (userKey,key->KEY);
|
key->nr = 12;
|
return 0;
|
}
|
else if (bits == 256)
|
{
|
AES_256_Key_Expansion (userKey,key->KEY);
|
key->nr = 14;
|
return 0;
|
}
|
return -2;
|
}
|
|
/*!
|
* @brief AES_set_decrypt_key takes the "userKey" and computes it to an allowed AES_Decryption_Key "key" of size "bits"
|
* @param userKey
|
* @param bits
|
* @param key
|
* @return -1 if userKey or key is empty/nullptr
|
* @return 0 if decryption-key got succesfully computed
|
* @return -2 if bits didn't match 128 or 192 or 256 (allowed key sizes)
|
*
|
*/
|
int AES_set_decrypt_key (const unsigned char *userKey,
|
const int bits,
|
AES_KEY *key)
|
{
|
int nr;
|
AES_KEY temp_key;
|
__m128i *Key_Schedule = (__m128i*)key->KEY;
|
__m128i *Temp_Key_Schedule = (__m128i*)temp_key.KEY;
|
|
if (!userKey || !key)
|
return -1;
|
if (AES_set_encrypt_key(userKey,bits,&temp_key) == -2)
|
return -2;
|
|
nr = temp_key.nr;
|
key->nr = nr;
|
|
Key_Schedule[nr] = Temp_Key_Schedule[0];
|
Key_Schedule[nr-1] = _mm_aesimc_si128(Temp_Key_Schedule[1]);
|
Key_Schedule[nr-2] = _mm_aesimc_si128(Temp_Key_Schedule[2]);
|
Key_Schedule[nr-3] = _mm_aesimc_si128(Temp_Key_Schedule[3]);
|
Key_Schedule[nr-4] = _mm_aesimc_si128(Temp_Key_Schedule[4]);
|
Key_Schedule[nr-5] = _mm_aesimc_si128(Temp_Key_Schedule[5]);
|
Key_Schedule[nr-6] = _mm_aesimc_si128(Temp_Key_Schedule[6]);
|
Key_Schedule[nr-7] = _mm_aesimc_si128(Temp_Key_Schedule[7]);
|
Key_Schedule[nr-8] = _mm_aesimc_si128(Temp_Key_Schedule[8]);
|
Key_Schedule[nr-9] = _mm_aesimc_si128(Temp_Key_Schedule[9]);
|
if(nr>10){
|
Key_Schedule[nr-10] = _mm_aesimc_si128(Temp_Key_Schedule[10]);
|
Key_Schedule[nr-11] = _mm_aesimc_si128(Temp_Key_Schedule[11]);
|
}
|
if(nr>12){
|
Key_Schedule[nr-12] = _mm_aesimc_si128(Temp_Key_Schedule[12]);
|
Key_Schedule[nr-13] = _mm_aesimc_si128(Temp_Key_Schedule[13]);
|
}
|
Key_Schedule[0] = Temp_Key_Schedule[nr];
|
return 0;
|
}
|
|
|
#endif // AESNIKEYINIT_H
|