aesacc.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. /*
  2. * This file is adapted from PolarSSL 1.3.19 (GPL)
  3. */
  4. #include "aesni.h"
  5. #include "aesarm.h"
  6. #include <stdint.h>
  7. #include <string.h>
  8. #if defined(AES256) && (AES256 == 1)
  9. #define AES_KEYSIZE 256
  10. #ifdef HAVE_AMD64
  11. #define aeshw_setkey_enc aesni_setkey_enc_256
  12. #endif
  13. #elif defined(AES192) && (AES192 == 1)
  14. #define AES_KEYSIZE 192
  15. #ifdef HAVE_AMD64
  16. #define aeshw_setkey_enc aesni_setkey_enc_192
  17. #endif
  18. #else
  19. #define AES_KEYSIZE 128
  20. #ifdef HAVE_AMD64
  21. #define aeshw_setkey_enc aesni_setkey_enc_128
  22. #endif
  23. #endif
  24. #define AES_NR ((AES_KEYSIZE >> 5) + 6)
  25. #define AES_RKSIZE 272
  26. #ifdef HAVE_AMD64
  27. #define HAVE_HARDAES 1
  28. #define aeshw_supported aesni_supported
  29. #define aeshw_crypt_ecb aesni_crypt_ecb
  30. #define aeshw_inverse_key(a,b) aesni_inverse_key(a,b,AES_NR)
  31. #endif /* HAVE_AMD64 */
  32. #ifdef HAVE_ARM64
  33. #define HAVE_HARDAES 1
  34. #define aeshw_supported aesarm_supported
  35. #define aeshw_crypt_ecb aesarm_crypt_ecb
  36. #include "aesarm_table.h"
  37. #ifndef GET_UINT32_LE
  38. #define GET_UINT32_LE(n,b,i) \
  39. { \
  40. (n) = ( (uint32_t) (b)[(i) ] ) \
  41. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  42. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  43. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  44. }
  45. #endif
  46. static void aeshw_setkey_enc(uint8_t *rk, const uint8_t *key)
  47. {
  48. unsigned int i;
  49. uint32_t *RK;
  50. RK = (uint32_t *) rk;
  51. for( i = 0; i < ( AES_KEYSIZE >> 5 ); i++ )
  52. {
  53. GET_UINT32_LE( RK[i], key, i << 2 );
  54. }
  55. switch( AES_NR )
  56. {
  57. case 10:
  58. for( i = 0; i < 10; i++, RK += 4 )
  59. {
  60. RK[4] = RK[0] ^ RCON[i] ^
  61. ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
  62. ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
  63. ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
  64. ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
  65. RK[5] = RK[1] ^ RK[4];
  66. RK[6] = RK[2] ^ RK[5];
  67. RK[7] = RK[3] ^ RK[6];
  68. }
  69. break;
  70. case 12:
  71. for( i = 0; i < 8; i++, RK += 6 )
  72. {
  73. RK[6] = RK[0] ^ RCON[i] ^
  74. ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
  75. ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
  76. ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
  77. ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
  78. RK[7] = RK[1] ^ RK[6];
  79. RK[8] = RK[2] ^ RK[7];
  80. RK[9] = RK[3] ^ RK[8];
  81. RK[10] = RK[4] ^ RK[9];
  82. RK[11] = RK[5] ^ RK[10];
  83. }
  84. break;
  85. case 14:
  86. for( i = 0; i < 7; i++, RK += 8 )
  87. {
  88. RK[8] = RK[0] ^ RCON[i] ^
  89. ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
  90. ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
  91. ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
  92. ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
  93. RK[9] = RK[1] ^ RK[8];
  94. RK[10] = RK[2] ^ RK[9];
  95. RK[11] = RK[3] ^ RK[10];
  96. RK[12] = RK[4] ^
  97. ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
  98. ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
  99. ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
  100. ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
  101. RK[13] = RK[5] ^ RK[12];
  102. RK[14] = RK[6] ^ RK[13];
  103. RK[15] = RK[7] ^ RK[14];
  104. }
  105. break;
  106. }
  107. }
  108. static void aeshw_inverse_key(uint8_t *invkey, const uint8_t *fwdkey)
  109. {
  110. int i, j;
  111. uint32_t *RK;
  112. uint32_t *SK;
  113. RK = (uint32_t *) invkey;
  114. SK = ((uint32_t *) fwdkey) + AES_NR * 4;
  115. *RK++ = *SK++;
  116. *RK++ = *SK++;
  117. *RK++ = *SK++;
  118. *RK++ = *SK++;
  119. for( i = AES_NR - 1, SK -= 8; i > 0; i--, SK -= 8 )
  120. {
  121. for( j = 0; j < 4; j++, SK++ )
  122. {
  123. *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
  124. RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
  125. RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
  126. RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
  127. }
  128. }
  129. *RK++ = *SK++;
  130. *RK++ = *SK++;
  131. *RK++ = *SK++;
  132. *RK++ = *SK++;
  133. }
  134. #endif /* HAVE_ARM64 */
  135. #ifdef HAVE_HARDAES
  136. static void aeshw_setkey_dec(uint8_t *rk, const uint8_t *key)
  137. {
  138. uint8_t rk_tmp[AES_RKSIZE];
  139. aeshw_setkey_enc(rk_tmp, key);
  140. aeshw_inverse_key(rk, rk_tmp);
  141. }
  142. #endif /* HAVE_HARDAES */
  143. /* OpenSSL assembly functions */
  144. #define AES_MAXNR 14
  145. typedef struct {
  146. uint32_t rd_key[4 * (AES_MAXNR + 1)];
  147. uint32_t rounds;
  148. } AES_KEY;
  149. #if defined(__amd64__) || defined(__x86_64__) || \
  150. defined(__aarch64__)
  151. #define AES_set_encrypt_key vpaes_set_encrypt_key
  152. #define AES_set_decrypt_key vpaes_set_decrypt_key
  153. #define AES_encrypt vpaes_encrypt
  154. #define AES_decrypt vpaes_decrypt
  155. #endif /* VPAES for 64-bit Intel and ARM */
  156. #ifdef __cplusplus
  157. extern "C" {
  158. #endif
  159. int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
  160. AES_KEY *key);
  161. int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
  162. AES_KEY *key);
  163. void AES_encrypt(const unsigned char *in, unsigned char *out,
  164. const AES_KEY *key);
  165. void AES_decrypt(const unsigned char *in, unsigned char *out,
  166. const AES_KEY *key);
  167. #ifdef __cplusplus
  168. }
  169. #endif
  170. static void aes_crypt_ecb( int nr,
  171. unsigned char *rk,
  172. int mode,
  173. const unsigned char input[16],
  174. unsigned char output[16] )
  175. {
  176. if (mode == AES_DECRYPT) {
  177. AES_decrypt(input, output, (AES_KEY *) rk);
  178. } else {
  179. AES_encrypt(input, output, (AES_KEY *) rk);
  180. }
  181. }
  182. static void aes_setkey_enc(uint8_t *rk, const uint8_t *key)
  183. {
  184. AES_set_encrypt_key(key, AES_KEYSIZE, (AES_KEY *) rk);
  185. }
  186. static void aes_setkey_dec(uint8_t *rk, const uint8_t *key)
  187. {
  188. AES_set_decrypt_key(key, AES_KEYSIZE, (AES_KEY *) rk);
  189. }
  190. static void (*crypt_ecb) ( int nr,
  191. unsigned char *rk,
  192. int mode,
  193. const unsigned char input[16],
  194. unsigned char output[16] )
  195. = aes_crypt_ecb;
  196. static void (*setkey_enc) (uint8_t *rk, const uint8_t *key)
  197. = aes_setkey_enc;
  198. static void (*setkey_dec) (uint8_t *rk, const uint8_t *key)
  199. = aes_setkey_dec;
  200. /*
  201. * AESNI-CBC buffer encryption/decryption
  202. */
  203. static void crypt_cbc( int mode,
  204. uint8_t* rk,
  205. uint32_t length,
  206. uint8_t iv[16],
  207. const uint8_t *input,
  208. uint8_t *output )
  209. {
  210. int i;
  211. uint8_t temp[16];
  212. if( mode == AES_DECRYPT )
  213. {
  214. while( length > 0 )
  215. {
  216. memcpy( temp, input, 16 );
  217. crypt_ecb( AES_NR, rk, mode, input, output );
  218. for( i = 0; i < 16; i++ )
  219. output[i] = (uint8_t)( output[i] ^ iv[i] );
  220. memcpy( iv, temp, 16 );
  221. input += 16;
  222. output += 16;
  223. length -= 16;
  224. }
  225. }
  226. else
  227. {
  228. while( length > 0 )
  229. {
  230. for( i = 0; i < 16; i++ )
  231. output[i] = (uint8_t)( input[i] ^ iv[i] );
  232. crypt_ecb( AES_NR, rk, mode, output, output );
  233. memcpy( iv, output, 16 );
  234. input += 16;
  235. output += 16;
  236. length -= 16;
  237. }
  238. }
  239. }
  240. static void aeshw_init(void)
  241. {
  242. #ifdef HAVE_HARDAES
  243. static int done = 0;
  244. if (!done) {
  245. if (aeshw_supported()) {
  246. crypt_ecb = aeshw_crypt_ecb;
  247. setkey_enc = aeshw_setkey_enc;
  248. setkey_dec = aeshw_setkey_dec;
  249. }
  250. done = 1;
  251. }
  252. #endif
  253. }
  254. int AES_support_hwaccel(void)
  255. {
  256. #ifdef HAVE_HARDAES
  257. return aeshw_supported();
  258. #else
  259. return 0;
  260. #endif
  261. }
  262. void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  263. {
  264. uint8_t iv_tmp[16];
  265. uint8_t rk[AES_RKSIZE];
  266. if (key == NULL || iv == NULL)
  267. {
  268. return;
  269. }
  270. aeshw_init();
  271. memcpy(iv_tmp, iv, 16);
  272. setkey_enc(rk, key);
  273. crypt_cbc(AES_ENCRYPT, rk, \
  274. length, iv_tmp, input, output);
  275. }
  276. void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  277. {
  278. uint8_t iv_tmp[16];
  279. uint8_t rk[AES_RKSIZE];
  280. if (key == NULL || iv == NULL)
  281. {
  282. return;
  283. }
  284. aeshw_init();
  285. memcpy(iv_tmp, iv, 16);
  286. setkey_dec(rk, key);
  287. crypt_cbc(AES_DECRYPT, rk, \
  288. length, iv_tmp, input, output);
  289. }
  290. void AES_ECB_encrypt(const uint8_t* input, const uint8_t* key, uint8_t* output, const uint32_t length)
  291. {
  292. uint8_t rk[AES_RKSIZE];
  293. if (key == NULL)
  294. {
  295. return;
  296. }
  297. aeshw_init();
  298. setkey_enc(rk, key);
  299. crypt_ecb(AES_NR, rk, AES_ENCRYPT, input, output);
  300. }
  301. void AES_ECB_decrypt(const uint8_t* input, const uint8_t* key, uint8_t *output, const uint32_t length)
  302. {
  303. uint8_t rk[AES_RKSIZE];
  304. if (key == NULL)
  305. {
  306. return;
  307. }
  308. aeshw_init();
  309. setkey_dec(rk, key);
  310. crypt_ecb(AES_NR, rk, AES_DECRYPT, input, output);
  311. }