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