aesacc.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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. #include <assert.h>
  9. #if defined(AES256) && (AES256 == 1)
  10. #define AES_KEYSIZE 256
  11. #ifdef HAVE_AMD64
  12. #define aeshw_setkey_enc aesni_setkey_enc_256
  13. #endif
  14. #elif defined(AES192) && (AES192 == 1)
  15. #define AES_KEYSIZE 192
  16. #ifdef HAVE_AMD64
  17. #define aeshw_setkey_enc aesni_setkey_enc_192
  18. #endif
  19. #else
  20. #define AES_KEYSIZE 128
  21. #ifdef HAVE_AMD64
  22. #define aeshw_setkey_enc aesni_setkey_enc_128
  23. #endif
  24. #endif
  25. #define AES_NR ((AES_KEYSIZE >> 5) + 6)
  26. #define AES_RKSIZE 272
  27. #ifdef HAVE_AMD64
  28. #define HAVE_HARDAES 1
  29. #define aeshw_supported aesni_supported
  30. #define aeshw_crypt_ecb aesni_crypt_ecb
  31. #define aeshw_inverse_key(a,b) aesni_inverse_key(a,b,AES_NR)
  32. #endif /* HAVE_AMD64 */
  33. #ifdef HAVE_ARM64
  34. #define HAVE_HARDAES 1
  35. #define aeshw_supported aesarm_supported
  36. #define aeshw_crypt_ecb aesarm_crypt_ecb
  37. #include "aesarm_table.h"
  38. #ifndef GET_UINT32_LE
  39. #define GET_UINT32_LE(n,b,i) \
  40. { \
  41. (n) = ( (uint32_t) (b)[(i) ] ) \
  42. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  43. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  44. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  45. }
  46. #endif
  47. static void aeshw_setkey_enc(uint8_t *rk, const uint8_t *key)
  48. {
  49. unsigned int i;
  50. uint32_t *RK;
  51. RK = (uint32_t *) rk;
  52. for( i = 0; i < ( AES_KEYSIZE >> 5 ); i++ )
  53. {
  54. GET_UINT32_LE( RK[i], key, i << 2 );
  55. }
  56. switch( AES_NR )
  57. {
  58. case 10:
  59. for( i = 0; i < 10; i++, RK += 4 )
  60. {
  61. RK[4] = RK[0] ^ RCON[i] ^
  62. ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
  63. ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
  64. ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
  65. ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
  66. RK[5] = RK[1] ^ RK[4];
  67. RK[6] = RK[2] ^ RK[5];
  68. RK[7] = RK[3] ^ RK[6];
  69. }
  70. break;
  71. case 12:
  72. for( i = 0; i < 8; i++, RK += 6 )
  73. {
  74. RK[6] = RK[0] ^ RCON[i] ^
  75. ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
  76. ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
  77. ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
  78. ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
  79. RK[7] = RK[1] ^ RK[6];
  80. RK[8] = RK[2] ^ RK[7];
  81. RK[9] = RK[3] ^ RK[8];
  82. RK[10] = RK[4] ^ RK[9];
  83. RK[11] = RK[5] ^ RK[10];
  84. }
  85. break;
  86. case 14:
  87. for( i = 0; i < 7; i++, RK += 8 )
  88. {
  89. RK[8] = RK[0] ^ RCON[i] ^
  90. ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
  91. ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
  92. ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
  93. ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
  94. RK[9] = RK[1] ^ RK[8];
  95. RK[10] = RK[2] ^ RK[9];
  96. RK[11] = RK[3] ^ RK[10];
  97. RK[12] = RK[4] ^
  98. ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
  99. ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
  100. ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
  101. ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
  102. RK[13] = RK[5] ^ RK[12];
  103. RK[14] = RK[6] ^ RK[13];
  104. RK[15] = RK[7] ^ RK[14];
  105. }
  106. break;
  107. }
  108. }
  109. static void aeshw_inverse_key(uint8_t *invkey, const uint8_t *fwdkey)
  110. {
  111. int i, j;
  112. uint32_t *RK;
  113. uint32_t *SK;
  114. RK = (uint32_t *) invkey;
  115. SK = ((uint32_t *) fwdkey) + AES_NR * 4;
  116. *RK++ = *SK++;
  117. *RK++ = *SK++;
  118. *RK++ = *SK++;
  119. *RK++ = *SK++;
  120. for( i = AES_NR - 1, SK -= 8; i > 0; i--, SK -= 8 )
  121. {
  122. for( j = 0; j < 4; j++, SK++ )
  123. {
  124. *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
  125. RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
  126. RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
  127. RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
  128. }
  129. }
  130. *RK++ = *SK++;
  131. *RK++ = *SK++;
  132. *RK++ = *SK++;
  133. *RK++ = *SK++;
  134. }
  135. #endif /* HAVE_ARM64 */
  136. #ifdef HAVE_HARDAES
  137. static void aeshw_setkey_dec(uint8_t *rk, const uint8_t *key)
  138. {
  139. uint8_t rk_tmp[AES_RKSIZE];
  140. aeshw_setkey_enc(rk_tmp, key);
  141. aeshw_inverse_key(rk, rk_tmp);
  142. }
  143. static void aeshw_encrypt_ecb( int nr,
  144. unsigned char *rk,
  145. const unsigned char input[16],
  146. unsigned char output[16] )
  147. {
  148. aeshw_crypt_ecb(nr, rk, AES_ENCRYPT, input, output);
  149. }
  150. static void aeshw_decrypt_ecb( int nr,
  151. unsigned char *rk,
  152. const unsigned char input[16],
  153. unsigned char output[16] )
  154. {
  155. aeshw_crypt_ecb(nr, rk, AES_DECRYPT, input, output);
  156. }
  157. #endif /* HAVE_HARDAES */
  158. /* OpenSSL assembly functions */
  159. #define AES_MAXNR 14
  160. typedef struct {
  161. uint32_t rd_key[4 * (AES_MAXNR + 1)];
  162. uint32_t rounds;
  163. } AES_KEY;
  164. #if defined(__amd64__) || defined(__x86_64__) || \
  165. defined(__aarch64__)
  166. #define AES_set_encrypt_key vpaes_set_encrypt_key
  167. #define AES_set_decrypt_key vpaes_set_decrypt_key
  168. #define AES_encrypt vpaes_encrypt
  169. #define AES_decrypt vpaes_decrypt
  170. #endif /* VPAES for 64-bit Intel and ARM */
  171. #ifdef __cplusplus
  172. extern "C" {
  173. #endif
  174. int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
  175. AES_KEY *key);
  176. int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
  177. AES_KEY *key);
  178. void AES_encrypt(const unsigned char *in, unsigned char *out,
  179. const AES_KEY *key);
  180. void AES_decrypt(const unsigned char *in, unsigned char *out,
  181. const AES_KEY *key);
  182. #ifdef __cplusplus
  183. }
  184. #endif
  185. static void aes_encrypt_ecb( int nr,
  186. unsigned char *rk,
  187. const unsigned char input[16],
  188. unsigned char output[16] )
  189. {
  190. AES_encrypt(input, output, (AES_KEY *) rk);
  191. }
  192. static void aes_decrypt_ecb( int nr,
  193. unsigned char *rk,
  194. const unsigned char input[16],
  195. unsigned char output[16] )
  196. {
  197. AES_decrypt(input, output, (AES_KEY *) rk);
  198. }
  199. static void aes_setkey_enc(uint8_t *rk, const uint8_t *key)
  200. {
  201. AES_set_encrypt_key(key, AES_KEYSIZE, (AES_KEY *) rk);
  202. }
  203. static void aes_setkey_dec(uint8_t *rk, const uint8_t *key)
  204. {
  205. AES_set_decrypt_key(key, AES_KEYSIZE, (AES_KEY *) rk);
  206. }
  207. static void (*encrypt_ecb) ( int nr,
  208. unsigned char *rk,
  209. const unsigned char input[16],
  210. unsigned char output[16] )
  211. = aes_encrypt_ecb;
  212. static void (*decrypt_ecb) ( int nr,
  213. unsigned char *rk,
  214. const unsigned char input[16],
  215. unsigned char output[16] )
  216. = aes_decrypt_ecb;
  217. static void (*setkey_enc) (uint8_t *rk, const uint8_t *key)
  218. = aes_setkey_enc;
  219. static void (*setkey_dec) (uint8_t *rk, const uint8_t *key)
  220. = aes_setkey_dec;
  221. /*
  222. * AESNI-CBC buffer encryption/decryption
  223. */
  224. static void encrypt_cbc( uint8_t* rk,
  225. uint32_t length,
  226. uint8_t iv[16],
  227. const uint8_t *input,
  228. uint8_t *output )
  229. {
  230. int i;
  231. uint8_t temp[16];
  232. while( length > 0 )
  233. {
  234. for( i = 0; i < 16; i++ )
  235. output[i] = (uint8_t)( input[i] ^ iv[i] );
  236. encrypt_ecb( AES_NR, rk, output, output );
  237. memcpy( iv, output, 16 );
  238. input += 16;
  239. output += 16;
  240. length -= 16;
  241. }
  242. }
  243. static void decrypt_cbc( uint8_t* rk,
  244. uint32_t length,
  245. uint8_t iv[16],
  246. const uint8_t *input,
  247. uint8_t *output )
  248. {
  249. int i;
  250. uint8_t temp[16];
  251. while( length > 0 )
  252. {
  253. memcpy( temp, input, 16 );
  254. decrypt_ecb( AES_NR, rk, input, output );
  255. for( i = 0; i < 16; i++ )
  256. output[i] = (uint8_t)( output[i] ^ iv[i] );
  257. memcpy( iv, temp, 16 );
  258. input += 16;
  259. output += 16;
  260. length -= 16;
  261. }
  262. }
  263. static void aeshw_init(void)
  264. {
  265. #ifdef HAVE_HARDAES
  266. static int done = 0;
  267. if (!done) {
  268. if (aeshw_supported()) {
  269. encrypt_ecb = aeshw_encrypt_ecb;
  270. decrypt_ecb = aeshw_decrypt_ecb;
  271. setkey_enc = aeshw_setkey_enc;
  272. setkey_dec = aeshw_setkey_dec;
  273. }
  274. done = 1;
  275. }
  276. #endif
  277. }
  278. int AES_support_hwaccel(void)
  279. {
  280. #ifdef HAVE_HARDAES
  281. return aeshw_supported();
  282. #else
  283. return 0;
  284. #endif
  285. }
  286. void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  287. {
  288. uint8_t iv_tmp[16];
  289. static uint8_t rk[AES_RKSIZE];
  290. assert(iv!=NULL);
  291. aeshw_init();
  292. memcpy(iv_tmp, iv, 16);
  293. if(key!= NULL)
  294. setkey_enc(rk, key);
  295. encrypt_cbc(rk, length, iv_tmp, input, output);
  296. }
  297. void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  298. {
  299. uint8_t iv_tmp[16];
  300. static uint8_t rk[AES_RKSIZE];
  301. assert(iv!=NULL);
  302. aeshw_init();
  303. memcpy(iv_tmp, iv, 16);
  304. if(key!= NULL)
  305. {
  306. setkey_dec(rk, key);
  307. }
  308. decrypt_cbc(rk, length, iv_tmp, input, output);
  309. }
  310. void AES_ECB_encrypt_buffer(const uint8_t* input, const uint8_t* key, uint8_t* output)
  311. {
  312. static uint8_t rk[AES_RKSIZE];
  313. aeshw_init();
  314. if(key!=NULL)
  315. setkey_enc(rk, key);
  316. encrypt_ecb(AES_NR, rk, input, output);
  317. }
  318. void AES_ECB_decrypt_buffer(const uint8_t* input, const uint8_t* key, uint8_t *output)
  319. {
  320. static uint8_t rk[AES_RKSIZE];
  321. aeshw_init();
  322. if(key!=NULL)
  323. setkey_dec(rk, key);
  324. decrypt_ecb(AES_NR, rk, input, output);
  325. }
  326. static void encrypt_cfb( uint8_t* rk,
  327. uint32_t length,size_t *iv_off,
  328. uint8_t iv[16],
  329. const uint8_t *input,
  330. uint8_t *output )
  331. {
  332. int c;
  333. size_t n = *iv_off;
  334. while( length-- )
  335. {
  336. if( n == 0 )
  337. encrypt_ecb( AES_NR, rk, iv, iv );
  338. iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
  339. n = ( n + 1 ) & 0x0F;
  340. }
  341. *iv_off = n;
  342. }
  343. static void decrypt_cfb( uint8_t* rk,
  344. uint32_t length,size_t *iv_off,
  345. uint8_t iv[16],
  346. const uint8_t *input,
  347. uint8_t *output )
  348. {
  349. int c;
  350. size_t n = *iv_off;
  351. while( length-- )
  352. {
  353. if( n == 0 )
  354. encrypt_ecb( AES_NR, rk, iv, iv );
  355. c = *input++;
  356. *output++ = (unsigned char)( c ^ iv[n] );
  357. iv[n] = (unsigned char) c;
  358. n = ( n + 1 ) & 0x0F;
  359. }
  360. *iv_off = n;
  361. }
  362. void AES_CFB_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  363. {
  364. uint8_t iv_tmp[16];
  365. static uint8_t rk[AES_RKSIZE];
  366. assert(iv!=NULL);
  367. aeshw_init();
  368. memcpy(iv_tmp, iv, 16);
  369. if(key!= NULL)
  370. setkey_enc(rk, key);
  371. size_t offset=0;
  372. encrypt_cfb(rk, length,&offset, iv_tmp, input, output);
  373. }
  374. void AES_CFB_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
  375. {
  376. uint8_t iv_tmp[16];
  377. static uint8_t rk[AES_RKSIZE];
  378. assert(iv!=NULL);
  379. aeshw_init();
  380. memcpy(iv_tmp, iv, 16);
  381. if(key!= NULL)
  382. {
  383. setkey_enc(rk, key);//its enc again,not typo
  384. }
  385. size_t offset=0;
  386. decrypt_cfb(rk, length,&offset, iv_tmp, input, output);
  387. }