aeskey.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. /*
  2. ---------------------------------------------------------------------------
  3. Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved.
  4. The redistribution and use of this software (with or without changes)
  5. is allowed without the payment of fees or royalties provided that:
  6. source code distributions include the above copyright notice, this
  7. list of conditions and the following disclaimer;
  8. binary distributions include the above copyright notice, this list
  9. of conditions and the following disclaimer in their documentation.
  10. This software is provided 'as is' with no explicit or implied warranties
  11. in respect of its operation, including, but not limited to, correctness
  12. and fitness for purpose.
  13. ---------------------------------------------------------------------------
  14. Issue Date: 20/12/2007
  15. */
  16. #include "aesopt.h"
  17. #include "aestab.h"
  18. #if defined( USE_INTEL_AES_IF_PRESENT )
  19. # include "aes_ni.h"
  20. #else
  21. /* map names here to provide the external API ('name' -> 'aes_name') */
  22. # define aes_xi(x) aes_ ## x
  23. #endif
  24. #ifdef USE_VIA_ACE_IF_PRESENT
  25. # include "aes_via_ace.h"
  26. #endif
  27. #if defined(__cplusplus)
  28. extern "C"
  29. {
  30. #endif
  31. /* Initialise the key schedule from the user supplied key. The key
  32. length can be specified in bytes, with legal values of 16, 24
  33. and 32, or in bits, with legal values of 128, 192 and 256. These
  34. values correspond with Nk values of 4, 6 and 8 respectively.
  35. The following macros implement a single cycle in the key
  36. schedule generation process. The number of cycles needed
  37. for each cx->n_col and nk value is:
  38. nk = 4 5 6 7 8
  39. ------------------------------
  40. cx->n_col = 4 10 9 8 7 7
  41. cx->n_col = 5 14 11 10 9 9
  42. cx->n_col = 6 19 15 12 11 11
  43. cx->n_col = 7 21 19 16 13 14
  44. cx->n_col = 8 29 23 19 17 14
  45. */
  46. #if defined( REDUCE_CODE_SIZE )
  47. # define ls_box ls_sub
  48. uint32_t ls_sub(const uint32_t t, const uint32_t n);
  49. # define inv_mcol im_sub
  50. uint32_t im_sub(const uint32_t x);
  51. # ifdef ENC_KS_UNROLL
  52. # undef ENC_KS_UNROLL
  53. # endif
  54. # ifdef DEC_KS_UNROLL
  55. # undef DEC_KS_UNROLL
  56. # endif
  57. #endif
  58. #if (FUNCS_IN_C & ENC_KEYING_IN_C)
  59. #if defined(AES_128) || defined( AES_VAR )
  60. #define ke4(k,i) \
  61. { k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
  62. k[4*(i)+5] = ss[1] ^= ss[0]; \
  63. k[4*(i)+6] = ss[2] ^= ss[1]; \
  64. k[4*(i)+7] = ss[3] ^= ss[2]; \
  65. }
  66. AES_RETURN aes_xi(encrypt_key128)(const unsigned char *key, aes_encrypt_ctx cx[1])
  67. { uint32_t ss[4];
  68. cx->ks[0] = ss[0] = word_in(key, 0);
  69. cx->ks[1] = ss[1] = word_in(key, 1);
  70. cx->ks[2] = ss[2] = word_in(key, 2);
  71. cx->ks[3] = ss[3] = word_in(key, 3);
  72. #ifdef ENC_KS_UNROLL
  73. ke4(cx->ks, 0); ke4(cx->ks, 1);
  74. ke4(cx->ks, 2); ke4(cx->ks, 3);
  75. ke4(cx->ks, 4); ke4(cx->ks, 5);
  76. ke4(cx->ks, 6); ke4(cx->ks, 7);
  77. ke4(cx->ks, 8);
  78. #else
  79. { uint32_t i;
  80. for(i = 0; i < 9; ++i)
  81. ke4(cx->ks, i);
  82. }
  83. #endif
  84. ke4(cx->ks, 9);
  85. cx->inf.l = 0;
  86. cx->inf.b[0] = 10 * 16;
  87. #ifdef USE_VIA_ACE_IF_PRESENT
  88. if(VIA_ACE_AVAILABLE)
  89. cx->inf.b[1] = 0xff;
  90. #endif
  91. return EXIT_SUCCESS;
  92. }
  93. #endif
  94. #if defined(AES_192) || defined( AES_VAR )
  95. #define kef6(k,i) \
  96. { k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
  97. k[6*(i)+ 7] = ss[1] ^= ss[0]; \
  98. k[6*(i)+ 8] = ss[2] ^= ss[1]; \
  99. k[6*(i)+ 9] = ss[3] ^= ss[2]; \
  100. }
  101. #define ke6(k,i) \
  102. { kef6(k,i); \
  103. k[6*(i)+10] = ss[4] ^= ss[3]; \
  104. k[6*(i)+11] = ss[5] ^= ss[4]; \
  105. }
  106. AES_RETURN aes_xi(encrypt_key192)(const unsigned char *key, aes_encrypt_ctx cx[1])
  107. { uint32_t ss[6];
  108. cx->ks[0] = ss[0] = word_in(key, 0);
  109. cx->ks[1] = ss[1] = word_in(key, 1);
  110. cx->ks[2] = ss[2] = word_in(key, 2);
  111. cx->ks[3] = ss[3] = word_in(key, 3);
  112. cx->ks[4] = ss[4] = word_in(key, 4);
  113. cx->ks[5] = ss[5] = word_in(key, 5);
  114. #ifdef ENC_KS_UNROLL
  115. ke6(cx->ks, 0); ke6(cx->ks, 1);
  116. ke6(cx->ks, 2); ke6(cx->ks, 3);
  117. ke6(cx->ks, 4); ke6(cx->ks, 5);
  118. ke6(cx->ks, 6);
  119. #else
  120. { uint32_t i;
  121. for(i = 0; i < 7; ++i)
  122. ke6(cx->ks, i);
  123. }
  124. #endif
  125. kef6(cx->ks, 7);
  126. cx->inf.l = 0;
  127. cx->inf.b[0] = 12 * 16;
  128. #ifdef USE_VIA_ACE_IF_PRESENT
  129. if(VIA_ACE_AVAILABLE)
  130. cx->inf.b[1] = 0xff;
  131. #endif
  132. return EXIT_SUCCESS;
  133. }
  134. #endif
  135. #if defined(AES_256) || defined( AES_VAR )
  136. #define kef8(k,i) \
  137. { k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
  138. k[8*(i)+ 9] = ss[1] ^= ss[0]; \
  139. k[8*(i)+10] = ss[2] ^= ss[1]; \
  140. k[8*(i)+11] = ss[3] ^= ss[2]; \
  141. }
  142. #define ke8(k,i) \
  143. { kef8(k,i); \
  144. k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \
  145. k[8*(i)+13] = ss[5] ^= ss[4]; \
  146. k[8*(i)+14] = ss[6] ^= ss[5]; \
  147. k[8*(i)+15] = ss[7] ^= ss[6]; \
  148. }
  149. AES_RETURN aes_xi(encrypt_key256)(const unsigned char *key, aes_encrypt_ctx cx[1])
  150. { uint32_t ss[8];
  151. cx->ks[0] = ss[0] = word_in(key, 0);
  152. cx->ks[1] = ss[1] = word_in(key, 1);
  153. cx->ks[2] = ss[2] = word_in(key, 2);
  154. cx->ks[3] = ss[3] = word_in(key, 3);
  155. cx->ks[4] = ss[4] = word_in(key, 4);
  156. cx->ks[5] = ss[5] = word_in(key, 5);
  157. cx->ks[6] = ss[6] = word_in(key, 6);
  158. cx->ks[7] = ss[7] = word_in(key, 7);
  159. #ifdef ENC_KS_UNROLL
  160. ke8(cx->ks, 0); ke8(cx->ks, 1);
  161. ke8(cx->ks, 2); ke8(cx->ks, 3);
  162. ke8(cx->ks, 4); ke8(cx->ks, 5);
  163. #else
  164. { uint32_t i;
  165. for(i = 0; i < 6; ++i)
  166. ke8(cx->ks, i);
  167. }
  168. #endif
  169. kef8(cx->ks, 6);
  170. cx->inf.l = 0;
  171. cx->inf.b[0] = 14 * 16;
  172. #ifdef USE_VIA_ACE_IF_PRESENT
  173. if(VIA_ACE_AVAILABLE)
  174. cx->inf.b[1] = 0xff;
  175. #endif
  176. return EXIT_SUCCESS;
  177. }
  178. #endif
  179. #endif
  180. #if (FUNCS_IN_C & DEC_KEYING_IN_C)
  181. /* this is used to store the decryption round keys */
  182. /* in forward or reverse order */
  183. #ifdef AES_REV_DKS
  184. #define v(n,i) ((n) - (i) + 2 * ((i) & 3))
  185. #else
  186. #define v(n,i) (i)
  187. #endif
  188. #if DEC_ROUND == NO_TABLES
  189. #define ff(x) (x)
  190. #else
  191. #define ff(x) inv_mcol(x)
  192. #if defined( dec_imvars )
  193. #define d_vars dec_imvars
  194. #endif
  195. #endif
  196. #if defined(AES_128) || defined( AES_VAR )
  197. #define k4e(k,i) \
  198. { k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
  199. k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \
  200. k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \
  201. k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \
  202. }
  203. #if 1
  204. #define kdf4(k,i) \
  205. { ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
  206. ss[1] = ss[1] ^ ss[3]; \
  207. ss[2] = ss[2] ^ ss[3]; \
  208. ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
  209. ss[i % 4] ^= ss[4]; \
  210. ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \
  211. ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \
  212. ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \
  213. ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \
  214. }
  215. #define kd4(k,i) \
  216. { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
  217. ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
  218. k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \
  219. k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \
  220. k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \
  221. k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \
  222. }
  223. #define kdl4(k,i) \
  224. { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
  225. k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
  226. k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \
  227. k[v(40,(4*(i))+6)] = ss[0]; \
  228. k[v(40,(4*(i))+7)] = ss[1]; \
  229. }
  230. #else
  231. #define kdf4(k,i) \
  232. { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \
  233. ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \
  234. ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \
  235. ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \
  236. }
  237. #define kd4(k,i) \
  238. { ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
  239. ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \
  240. ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \
  241. ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \
  242. ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \
  243. }
  244. #define kdl4(k,i) \
  245. { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \
  246. ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \
  247. ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \
  248. ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \
  249. }
  250. #endif
  251. AES_RETURN aes_xi(decrypt_key128)(const unsigned char *key, aes_decrypt_ctx cx[1])
  252. { uint32_t ss[5];
  253. #if defined( d_vars )
  254. d_vars;
  255. #endif
  256. cx->ks[v(40,(0))] = ss[0] = word_in(key, 0);
  257. cx->ks[v(40,(1))] = ss[1] = word_in(key, 1);
  258. cx->ks[v(40,(2))] = ss[2] = word_in(key, 2);
  259. cx->ks[v(40,(3))] = ss[3] = word_in(key, 3);
  260. #ifdef DEC_KS_UNROLL
  261. kdf4(cx->ks, 0); kd4(cx->ks, 1);
  262. kd4(cx->ks, 2); kd4(cx->ks, 3);
  263. kd4(cx->ks, 4); kd4(cx->ks, 5);
  264. kd4(cx->ks, 6); kd4(cx->ks, 7);
  265. kd4(cx->ks, 8); kdl4(cx->ks, 9);
  266. #else
  267. { uint32_t i;
  268. for(i = 0; i < 10; ++i)
  269. k4e(cx->ks, i);
  270. #if !(DEC_ROUND == NO_TABLES)
  271. for(i = N_COLS; i < 10 * N_COLS; ++i)
  272. cx->ks[i] = inv_mcol(cx->ks[i]);
  273. #endif
  274. }
  275. #endif
  276. cx->inf.l = 0;
  277. cx->inf.b[0] = 10 * 16;
  278. #ifdef USE_VIA_ACE_IF_PRESENT
  279. if(VIA_ACE_AVAILABLE)
  280. cx->inf.b[1] = 0xff;
  281. #endif
  282. return EXIT_SUCCESS;
  283. }
  284. #endif
  285. #if defined(AES_192) || defined( AES_VAR )
  286. #define k6ef(k,i) \
  287. { k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
  288. k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \
  289. k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \
  290. k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \
  291. }
  292. #define k6e(k,i) \
  293. { k6ef(k,i); \
  294. k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \
  295. k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \
  296. }
  297. #define kdf6(k,i) \
  298. { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \
  299. ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \
  300. ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \
  301. ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \
  302. ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \
  303. ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \
  304. }
  305. #define kd6(k,i) \
  306. { ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
  307. ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \
  308. ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \
  309. ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \
  310. ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \
  311. ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \
  312. ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \
  313. }
  314. #define kdl6(k,i) \
  315. { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \
  316. ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \
  317. ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \
  318. ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \
  319. }
  320. AES_RETURN aes_xi(decrypt_key192)(const unsigned char *key, aes_decrypt_ctx cx[1])
  321. { uint32_t ss[7];
  322. #if defined( d_vars )
  323. d_vars;
  324. #endif
  325. cx->ks[v(48,(0))] = ss[0] = word_in(key, 0);
  326. cx->ks[v(48,(1))] = ss[1] = word_in(key, 1);
  327. cx->ks[v(48,(2))] = ss[2] = word_in(key, 2);
  328. cx->ks[v(48,(3))] = ss[3] = word_in(key, 3);
  329. #ifdef DEC_KS_UNROLL
  330. cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4));
  331. cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5));
  332. kdf6(cx->ks, 0); kd6(cx->ks, 1);
  333. kd6(cx->ks, 2); kd6(cx->ks, 3);
  334. kd6(cx->ks, 4); kd6(cx->ks, 5);
  335. kd6(cx->ks, 6); kdl6(cx->ks, 7);
  336. #else
  337. cx->ks[v(48,(4))] = ss[4] = word_in(key, 4);
  338. cx->ks[v(48,(5))] = ss[5] = word_in(key, 5);
  339. { uint32_t i;
  340. for(i = 0; i < 7; ++i)
  341. k6e(cx->ks, i);
  342. k6ef(cx->ks, 7);
  343. #if !(DEC_ROUND == NO_TABLES)
  344. for(i = N_COLS; i < 12 * N_COLS; ++i)
  345. cx->ks[i] = inv_mcol(cx->ks[i]);
  346. #endif
  347. }
  348. #endif
  349. cx->inf.l = 0;
  350. cx->inf.b[0] = 12 * 16;
  351. #ifdef USE_VIA_ACE_IF_PRESENT
  352. if(VIA_ACE_AVAILABLE)
  353. cx->inf.b[1] = 0xff;
  354. #endif
  355. return EXIT_SUCCESS;
  356. }
  357. #endif
  358. #if defined(AES_256) || defined( AES_VAR )
  359. #define k8ef(k,i) \
  360. { k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
  361. k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \
  362. k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \
  363. k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \
  364. }
  365. #define k8e(k,i) \
  366. { k8ef(k,i); \
  367. k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \
  368. k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \
  369. k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \
  370. k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \
  371. }
  372. #define kdf8(k,i) \
  373. { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \
  374. ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \
  375. ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \
  376. ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \
  377. ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \
  378. ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \
  379. ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \
  380. ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \
  381. }
  382. #define kd8(k,i) \
  383. { ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
  384. ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \
  385. ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \
  386. ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \
  387. ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \
  388. ss[8] = ls_box(ss[3],0); \
  389. ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \
  390. ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \
  391. ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \
  392. ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \
  393. }
  394. #define kdl8(k,i) \
  395. { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \
  396. ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \
  397. ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \
  398. ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \
  399. }
  400. AES_RETURN aes_xi(decrypt_key256)(const unsigned char *key, aes_decrypt_ctx cx[1])
  401. { uint32_t ss[9];
  402. #if defined( d_vars )
  403. d_vars;
  404. #endif
  405. cx->ks[v(56,(0))] = ss[0] = word_in(key, 0);
  406. cx->ks[v(56,(1))] = ss[1] = word_in(key, 1);
  407. cx->ks[v(56,(2))] = ss[2] = word_in(key, 2);
  408. cx->ks[v(56,(3))] = ss[3] = word_in(key, 3);
  409. #ifdef DEC_KS_UNROLL
  410. cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4));
  411. cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5));
  412. cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6));
  413. cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7));
  414. kdf8(cx->ks, 0); kd8(cx->ks, 1);
  415. kd8(cx->ks, 2); kd8(cx->ks, 3);
  416. kd8(cx->ks, 4); kd8(cx->ks, 5);
  417. kdl8(cx->ks, 6);
  418. #else
  419. cx->ks[v(56,(4))] = ss[4] = word_in(key, 4);
  420. cx->ks[v(56,(5))] = ss[5] = word_in(key, 5);
  421. cx->ks[v(56,(6))] = ss[6] = word_in(key, 6);
  422. cx->ks[v(56,(7))] = ss[7] = word_in(key, 7);
  423. { uint32_t i;
  424. for(i = 0; i < 6; ++i)
  425. k8e(cx->ks, i);
  426. k8ef(cx->ks, 6);
  427. #if !(DEC_ROUND == NO_TABLES)
  428. for(i = N_COLS; i < 14 * N_COLS; ++i)
  429. cx->ks[i] = inv_mcol(cx->ks[i]);
  430. #endif
  431. }
  432. #endif
  433. cx->inf.l = 0;
  434. cx->inf.b[0] = 14 * 16;
  435. #ifdef USE_VIA_ACE_IF_PRESENT
  436. if(VIA_ACE_AVAILABLE)
  437. cx->inf.b[1] = 0xff;
  438. #endif
  439. return EXIT_SUCCESS;
  440. }
  441. #endif
  442. #endif
  443. #if defined( AES_VAR )
  444. AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
  445. {
  446. switch(key_len)
  447. {
  448. case 16: case 128: return aes_encrypt_key128(key, cx);
  449. case 24: case 192: return aes_encrypt_key192(key, cx);
  450. case 32: case 256: return aes_encrypt_key256(key, cx);
  451. default: return EXIT_FAILURE;
  452. }
  453. }
  454. AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
  455. {
  456. switch(key_len)
  457. {
  458. case 16: case 128: return aes_decrypt_key128(key, cx);
  459. case 24: case 192: return aes_decrypt_key192(key, cx);
  460. case 32: case 256: return aes_decrypt_key256(key, cx);
  461. default: return EXIT_FAILURE;
  462. }
  463. }
  464. #endif
  465. #if defined(__cplusplus)
  466. }
  467. #endif