aeskey.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /*
  2. ---------------------------------------------------------------------------
  3. Copyright (c) 2003, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
  4. All rights reserved.
  5. LICENSE TERMS
  6. The free distribution and use of this software in both source and binary
  7. form is allowed (with or without changes) provided that:
  8. 1. distributions of this source code include the above copyright
  9. notice, this list of conditions and the following disclaimer;
  10. 2. distributions in binary form include the above copyright
  11. notice, this list of conditions and the following disclaimer
  12. in the documentation and/or other associated materials;
  13. 3. the copyright holder's name is not used to endorse products
  14. built using this software without specific written permission.
  15. ALTERNATIVELY, provided that this notice is retained in full, this product
  16. may be distributed under the terms of the GNU General Public License (GPL),
  17. in which case the provisions of the GPL apply INSTEAD OF those given above.
  18. DISCLAIMER
  19. This software is provided 'as is' with no explicit or implied warranties
  20. in respect of its properties, including, but not limited to, correctness
  21. and/or fitness for purpose.
  22. ---------------------------------------------------------------------------
  23. Issue Date: 26/08/2003
  24. This file contains the code for implementing the key schedule for AES
  25. (Rijndael) for block and key sizes of 16, 24, and 32 bytes. See aesopt.h
  26. for further details including optimisation.
  27. */
  28. #include "aesopt.h"
  29. #if defined(__cplusplus)
  30. extern "C"
  31. {
  32. #endif
  33. /* Initialise the key schedule from the user supplied key. The key
  34. length can be specified in bytes, with legal values of 16, 24
  35. and 32, or in bits, with legal values of 128, 192 and 256. These
  36. values correspond with Nk values of 4, 6 and 8 respectively.
  37. The following macros implement a single cycle in the key
  38. schedule generation process. The number of cycles needed
  39. for each cx->n_col and nk value is:
  40. nk = 4 5 6 7 8
  41. ------------------------------
  42. cx->n_col = 4 10 9 8 7 7
  43. cx->n_col = 5 14 11 10 9 9
  44. cx->n_col = 6 19 15 12 11 11
  45. cx->n_col = 7 21 19 16 13 14
  46. cx->n_col = 8 29 23 19 17 14
  47. */
  48. #define ke4(k,i) \
  49. { k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+5] = ss[1] ^= ss[0]; \
  50. k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; \
  51. }
  52. #define kel4(k,i) \
  53. { k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+5] = ss[1] ^= ss[0]; \
  54. k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; \
  55. }
  56. #define ke6(k,i) \
  57. { k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; \
  58. k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; \
  59. k[6*(i)+10] = ss[4] ^= ss[3]; k[6*(i)+11] = ss[5] ^= ss[4]; \
  60. }
  61. #define kel6(k,i) \
  62. { k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; \
  63. k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; \
  64. }
  65. #define ke8(k,i) \
  66. { k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; \
  67. k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; \
  68. k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); k[8*(i)+13] = ss[5] ^= ss[4]; \
  69. k[8*(i)+14] = ss[6] ^= ss[5]; k[8*(i)+15] = ss[7] ^= ss[6]; \
  70. }
  71. #define kel8(k,i) \
  72. { k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; \
  73. k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; \
  74. }
  75. #if defined(ENCRYPTION_KEY_SCHEDULE)
  76. #if defined(AES_128) || defined(AES_VAR)
  77. aes_rval aes_encrypt_key128(const void *in_key, aes_encrypt_ctx cx[1])
  78. { aes_32t ss[4];
  79. cx->ks[0] = ss[0] = word_in(in_key, 0);
  80. cx->ks[1] = ss[1] = word_in(in_key, 1);
  81. cx->ks[2] = ss[2] = word_in(in_key, 2);
  82. cx->ks[3] = ss[3] = word_in(in_key, 3);
  83. #if ENC_UNROLL == NONE
  84. { aes_32t i;
  85. for(i = 0; i < ((11 * N_COLS - 1) / 4); ++i)
  86. ke4(cx->ks, i);
  87. }
  88. #else
  89. ke4(cx->ks, 0); ke4(cx->ks, 1);
  90. ke4(cx->ks, 2); ke4(cx->ks, 3);
  91. ke4(cx->ks, 4); ke4(cx->ks, 5);
  92. ke4(cx->ks, 6); ke4(cx->ks, 7);
  93. ke4(cx->ks, 8); kel4(cx->ks, 9);
  94. #endif
  95. /* cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] is zero for a 256 bit */
  96. /* key and must be non-zero for 128 and 192 bits keys */
  97. cx->ks[53] = cx->ks[45] = 0;
  98. cx->ks[52] = 10;
  99. #ifdef AES_ERR_CHK
  100. return aes_good;
  101. #endif
  102. }
  103. #endif
  104. #if defined(AES_192) || defined(AES_VAR)
  105. aes_rval aes_encrypt_key192(const void *in_key, aes_encrypt_ctx cx[1])
  106. { aes_32t ss[6];
  107. cx->ks[0] = ss[0] = word_in(in_key, 0);
  108. cx->ks[1] = ss[1] = word_in(in_key, 1);
  109. cx->ks[2] = ss[2] = word_in(in_key, 2);
  110. cx->ks[3] = ss[3] = word_in(in_key, 3);
  111. cx->ks[4] = ss[4] = word_in(in_key, 4);
  112. cx->ks[5] = ss[5] = word_in(in_key, 5);
  113. #if ENC_UNROLL == NONE
  114. { aes_32t i;
  115. for(i = 0; i < (13 * N_COLS - 1) / 6; ++i)
  116. ke6(cx->ks, i);
  117. }
  118. #else
  119. ke6(cx->ks, 0); ke6(cx->ks, 1);
  120. ke6(cx->ks, 2); ke6(cx->ks, 3);
  121. ke6(cx->ks, 4); ke6(cx->ks, 5);
  122. ke6(cx->ks, 6); kel6(cx->ks, 7);
  123. #endif
  124. /* cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] is zero for a 256 bit */
  125. /* key and must be non-zero for 128 and 192 bits keys */
  126. cx->ks[53] = cx->ks[45];
  127. cx->ks[52] = 12;
  128. #ifdef AES_ERR_CHK
  129. return aes_good;
  130. #endif
  131. }
  132. #endif
  133. #if defined(AES_256) || defined(AES_VAR)
  134. aes_rval aes_encrypt_key256(const void *in_key, aes_encrypt_ctx cx[1])
  135. { aes_32t ss[8];
  136. cx->ks[0] = ss[0] = word_in(in_key, 0);
  137. cx->ks[1] = ss[1] = word_in(in_key, 1);
  138. cx->ks[2] = ss[2] = word_in(in_key, 2);
  139. cx->ks[3] = ss[3] = word_in(in_key, 3);
  140. cx->ks[4] = ss[4] = word_in(in_key, 4);
  141. cx->ks[5] = ss[5] = word_in(in_key, 5);
  142. cx->ks[6] = ss[6] = word_in(in_key, 6);
  143. cx->ks[7] = ss[7] = word_in(in_key, 7);
  144. #if ENC_UNROLL == NONE
  145. { aes_32t i;
  146. for(i = 0; i < (15 * N_COLS - 1) / 8; ++i)
  147. ke8(cx->ks, i);
  148. }
  149. #else
  150. ke8(cx->ks, 0); ke8(cx->ks, 1);
  151. ke8(cx->ks, 2); ke8(cx->ks, 3);
  152. ke8(cx->ks, 4); ke8(cx->ks, 5);
  153. kel8(cx->ks, 6);
  154. #endif
  155. #ifdef AES_ERR_CHK
  156. return aes_good;
  157. #endif
  158. }
  159. #endif
  160. #if defined(AES_VAR)
  161. aes_rval aes_encrypt_key(const void *in_key, int key_len, aes_encrypt_ctx cx[1])
  162. {
  163. switch(key_len)
  164. {
  165. #ifdef AES_ERR_CHK
  166. case 16: case 128: return aes_encrypt_key128(in_key, cx);
  167. case 24: case 192: return aes_encrypt_key192(in_key, cx);
  168. case 32: case 256: return aes_encrypt_key256(in_key, cx);
  169. default: return aes_error;
  170. #else
  171. case 16: case 128: aes_encrypt_key128(in_key, cx); return;
  172. case 24: case 192: aes_encrypt_key192(in_key, cx); return;
  173. case 32: case 256: aes_encrypt_key256(in_key, cx); return;
  174. #endif
  175. }
  176. }
  177. #endif
  178. #endif
  179. #if defined(DECRYPTION_KEY_SCHEDULE)
  180. #if DEC_ROUND == NO_TABLES
  181. #define ff(x) (x)
  182. #else
  183. #define ff(x) inv_mcol(x)
  184. #ifdef dec_imvars
  185. #define d_vars dec_imvars
  186. #endif
  187. #endif
  188. #if 1
  189. #define kdf4(k,i) \
  190. { ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; ss[1] = ss[1] ^ ss[3]; ss[2] = ss[2] ^ ss[3]; ss[3] = ss[3]; \
  191. ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
  192. ss[4] ^= k[4*(i)]; k[4*(i)+4] = ff(ss[4]); ss[4] ^= k[4*(i)+1]; k[4*(i)+5] = ff(ss[4]); \
  193. ss[4] ^= k[4*(i)+2]; k[4*(i)+6] = ff(ss[4]); ss[4] ^= k[4*(i)+3]; k[4*(i)+7] = ff(ss[4]); \
  194. }
  195. #define kd4(k,i) \
  196. { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
  197. k[4*(i)+4] = ss[4] ^= k[4*(i)]; k[4*(i)+5] = ss[4] ^= k[4*(i)+1]; \
  198. k[4*(i)+6] = ss[4] ^= k[4*(i)+2]; k[4*(i)+7] = ss[4] ^= k[4*(i)+3]; \
  199. }
  200. #define kdl4(k,i) \
  201. { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
  202. k[4*(i)+4] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; k[4*(i)+5] = ss[1] ^ ss[3]; \
  203. k[4*(i)+6] = ss[0]; k[4*(i)+7] = ss[1]; \
  204. }
  205. #else
  206. #define kdf4(k,i) \
  207. { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+ 4] = ff(ss[0]); ss[1] ^= ss[0]; k[4*(i)+ 5] = ff(ss[1]); \
  208. ss[2] ^= ss[1]; k[4*(i)+ 6] = ff(ss[2]); ss[3] ^= ss[2]; k[4*(i)+ 7] = ff(ss[3]); \
  209. }
  210. #define kd4(k,i) \
  211. { ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
  212. ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[4*(i)+ 4] = ss[4] ^= k[4*(i)]; \
  213. ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[4] ^= k[4*(i)+ 1]; \
  214. ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[4] ^= k[4*(i)+ 2]; \
  215. ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[4] ^= k[4*(i)+ 3]; \
  216. }
  217. #define kdl4(k,i) \
  218. { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+ 4] = ss[0]; ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[1]; \
  219. ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[2]; ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[3]; \
  220. }
  221. #endif
  222. #define kdf6(k,i) \
  223. { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 6] = ff(ss[0]); ss[1] ^= ss[0]; k[6*(i)+ 7] = ff(ss[1]); \
  224. ss[2] ^= ss[1]; k[6*(i)+ 8] = ff(ss[2]); ss[3] ^= ss[2]; k[6*(i)+ 9] = ff(ss[3]); \
  225. ss[4] ^= ss[3]; k[6*(i)+10] = ff(ss[4]); ss[5] ^= ss[4]; k[6*(i)+11] = ff(ss[5]); \
  226. }
  227. #define kd6(k,i) \
  228. { ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
  229. ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[6*(i)+ 6] = ss[6] ^= k[6*(i)]; \
  230. ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[6] ^= k[6*(i)+ 1]; \
  231. ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[6] ^= k[6*(i)+ 2]; \
  232. ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[6] ^= k[6*(i)+ 3]; \
  233. ss[4] ^= ss[3]; k[6*(i)+10] = ss[6] ^= k[6*(i)+ 4]; \
  234. ss[5] ^= ss[4]; k[6*(i)+11] = ss[6] ^= k[6*(i)+ 5]; \
  235. }
  236. #define kdl6(k,i) \
  237. { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 6] = ss[0]; ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[1]; \
  238. ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[2]; ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[3]; \
  239. }
  240. #define kdf8(k,i) \
  241. { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 8] = ff(ss[0]); ss[1] ^= ss[0]; k[8*(i)+ 9] = ff(ss[1]); \
  242. ss[2] ^= ss[1]; k[8*(i)+10] = ff(ss[2]); ss[3] ^= ss[2]; k[8*(i)+11] = ff(ss[3]); \
  243. ss[4] ^= ls_box(ss[3],0); k[8*(i)+12] = ff(ss[4]); ss[5] ^= ss[4]; k[8*(i)+13] = ff(ss[5]); \
  244. ss[6] ^= ss[5]; k[8*(i)+14] = ff(ss[6]); ss[7] ^= ss[6]; k[8*(i)+15] = ff(ss[7]); \
  245. }
  246. #define kd8(k,i) \
  247. { aes_32t g = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
  248. ss[0] ^= g; g = ff(g); k[8*(i)+ 8] = g ^= k[8*(i)]; \
  249. ss[1] ^= ss[0]; k[8*(i)+ 9] = g ^= k[8*(i)+ 1]; \
  250. ss[2] ^= ss[1]; k[8*(i)+10] = g ^= k[8*(i)+ 2]; \
  251. ss[3] ^= ss[2]; k[8*(i)+11] = g ^= k[8*(i)+ 3]; \
  252. g = ls_box(ss[3],0); \
  253. ss[4] ^= g; g = ff(g); k[8*(i)+12] = g ^= k[8*(i)+ 4]; \
  254. ss[5] ^= ss[4]; k[8*(i)+13] = g ^= k[8*(i)+ 5]; \
  255. ss[6] ^= ss[5]; k[8*(i)+14] = g ^= k[8*(i)+ 6]; \
  256. ss[7] ^= ss[6]; k[8*(i)+15] = g ^= k[8*(i)+ 7]; \
  257. }
  258. #define kdl8(k,i) \
  259. { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 8] = ss[0]; ss[1] ^= ss[0]; k[8*(i)+ 9] = ss[1]; \
  260. ss[2] ^= ss[1]; k[8*(i)+10] = ss[2]; ss[3] ^= ss[2]; k[8*(i)+11] = ss[3]; \
  261. }
  262. #if defined(AES_128) || defined(AES_VAR)
  263. aes_rval aes_decrypt_key128(const void *in_key, aes_decrypt_ctx cx[1])
  264. { aes_32t ss[5];
  265. #ifdef d_vars
  266. d_vars;
  267. #endif
  268. cx->ks[0] = ss[0] = word_in(in_key, 0);
  269. cx->ks[1] = ss[1] = word_in(in_key, 1);
  270. cx->ks[2] = ss[2] = word_in(in_key, 2);
  271. cx->ks[3] = ss[3] = word_in(in_key, 3);
  272. #if DEC_UNROLL == NONE
  273. { aes_32t i;
  274. for(i = 0; i < (11 * N_COLS - 1) / 4; ++i)
  275. ke4(cx->ks, i);
  276. #if !(DEC_ROUND == NO_TABLES)
  277. for(i = N_COLS; i < 10 * N_COLS; ++i)
  278. cx->ks[i] = inv_mcol(cx->ks[i]);
  279. #endif
  280. }
  281. #else
  282. kdf4(cx->ks, 0); kd4(cx->ks, 1);
  283. kd4(cx->ks, 2); kd4(cx->ks, 3);
  284. kd4(cx->ks, 4); kd4(cx->ks, 5);
  285. kd4(cx->ks, 6); kd4(cx->ks, 7);
  286. kd4(cx->ks, 8); kdl4(cx->ks, 9);
  287. #endif
  288. /* cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] is zero for a 256 bit */
  289. /* key and must be non-zero for 128 and 192 bits keys */
  290. cx->ks[53] = cx->ks[45] = 0;
  291. cx->ks[52] = 10;
  292. #ifdef AES_ERR_CHK
  293. return aes_good;
  294. #endif
  295. }
  296. #endif
  297. #if defined(AES_192) || defined(AES_VAR)
  298. aes_rval aes_decrypt_key192(const void *in_key, aes_decrypt_ctx cx[1])
  299. { aes_32t ss[7];
  300. #ifdef d_vars
  301. d_vars;
  302. #endif
  303. cx->ks[0] = ss[0] = word_in(in_key, 0);
  304. cx->ks[1] = ss[1] = word_in(in_key, 1);
  305. cx->ks[2] = ss[2] = word_in(in_key, 2);
  306. cx->ks[3] = ss[3] = word_in(in_key, 3);
  307. #if DEC_UNROLL == NONE
  308. cx->ks[4] = ss[4] = word_in(in_key, 4);
  309. cx->ks[5] = ss[5] = word_in(in_key, 5);
  310. { aes_32t i;
  311. for(i = 0; i < (13 * N_COLS - 1) / 6; ++i)
  312. ke6(cx->ks, i);
  313. #if !(DEC_ROUND == NO_TABLES)
  314. for(i = N_COLS; i < 12 * N_COLS; ++i)
  315. cx->ks[i] = inv_mcol(cx->ks[i]);
  316. #endif
  317. }
  318. #else
  319. cx->ks[4] = ff(ss[4] = word_in(in_key, 4));
  320. cx->ks[5] = ff(ss[5] = word_in(in_key, 5));
  321. kdf6(cx->ks, 0); kd6(cx->ks, 1);
  322. kd6(cx->ks, 2); kd6(cx->ks, 3);
  323. kd6(cx->ks, 4); kd6(cx->ks, 5);
  324. kd6(cx->ks, 6); kdl6(cx->ks, 7);
  325. #endif
  326. /* cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] is zero for a 256 bit */
  327. /* key and must be non-zero for 128 and 192 bits keys */
  328. cx->ks[53] = cx->ks[45];
  329. cx->ks[52] = 12;
  330. #ifdef AES_ERR_CHK
  331. return aes_good;
  332. #endif
  333. }
  334. #endif
  335. #if defined(AES_256) || defined(AES_VAR)
  336. aes_rval aes_decrypt_key256(const void *in_key, aes_decrypt_ctx cx[1])
  337. { aes_32t ss[8];
  338. #ifdef d_vars
  339. d_vars;
  340. #endif
  341. cx->ks[0] = ss[0] = word_in(in_key, 0);
  342. cx->ks[1] = ss[1] = word_in(in_key, 1);
  343. cx->ks[2] = ss[2] = word_in(in_key, 2);
  344. cx->ks[3] = ss[3] = word_in(in_key, 3);
  345. #if DEC_UNROLL == NONE
  346. cx->ks[4] = ss[4] = word_in(in_key, 4);
  347. cx->ks[5] = ss[5] = word_in(in_key, 5);
  348. cx->ks[6] = ss[6] = word_in(in_key, 6);
  349. cx->ks[7] = ss[7] = word_in(in_key, 7);
  350. { aes_32t i;
  351. for(i = 0; i < (15 * N_COLS - 1) / 8; ++i)
  352. ke8(cx->ks, i);
  353. #if !(DEC_ROUND == NO_TABLES)
  354. for(i = N_COLS; i < 14 * N_COLS; ++i)
  355. cx->ks[i] = inv_mcol(cx->ks[i]);
  356. #endif
  357. }
  358. #else
  359. cx->ks[4] = ff(ss[4] = word_in(in_key, 4));
  360. cx->ks[5] = ff(ss[5] = word_in(in_key, 5));
  361. cx->ks[6] = ff(ss[6] = word_in(in_key, 6));
  362. cx->ks[7] = ff(ss[7] = word_in(in_key, 7));
  363. kdf8(cx->ks, 0); kd8(cx->ks, 1);
  364. kd8(cx->ks, 2); kd8(cx->ks, 3);
  365. kd8(cx->ks, 4); kd8(cx->ks, 5);
  366. kdl8(cx->ks, 6);
  367. #endif
  368. #ifdef AES_ERR_CHK
  369. return aes_good;
  370. #endif
  371. }
  372. #endif
  373. #if defined(AES_VAR)
  374. aes_rval aes_decrypt_key(const void *in_key, int key_len, aes_decrypt_ctx cx[1])
  375. {
  376. switch(key_len)
  377. {
  378. #ifdef AES_ERR_CHK
  379. case 16: case 128: return aes_decrypt_key128(in_key, cx);
  380. case 24: case 192: return aes_decrypt_key192(in_key, cx);
  381. case 32: case 256: return aes_decrypt_key256(in_key, cx);
  382. default: return aes_error;
  383. #else
  384. case 16: case 128: aes_decrypt_key128(in_key, cx); return;
  385. case 24: case 192: aes_decrypt_key192(in_key, cx); return;
  386. case 32: case 256: aes_decrypt_key256(in_key, cx); return;
  387. #endif
  388. }
  389. }
  390. #endif
  391. #endif
  392. #if defined(__cplusplus)
  393. }
  394. #endif