|
|
1.1 root 1: /*
2: ---------------------------------------------------------------------------
1.1.1.4 ! root 3: Copyright (c) 1998-2006, Brian Gladman, Worcester, UK. All rights reserved.
1.1 root 4:
5: LICENSE TERMS
6:
7: The free distribution and use of this software in both source and binary
8: form is allowed (with or without changes) provided that:
9:
10: 1. distributions of this source code include the above copyright
11: notice, this list of conditions and the following disclaimer;
12:
13: 2. distributions in binary form include the above copyright
14: notice, this list of conditions and the following disclaimer
15: in the documentation and/or other associated materials;
16:
17: 3. the copyright holder's name is not used to endorse products
18: built using this software without specific written permission.
19:
20: ALTERNATIVELY, provided that this notice is retained in full, this product
21: may be distributed under the terms of the GNU General Public License (GPL),
22: in which case the provisions of the GPL apply INSTEAD OF those given above.
23:
24: DISCLAIMER
25:
26: This software is provided 'as is' with no explicit or implied warranties
27: in respect of its properties, including, but not limited to, correctness
28: and/or fitness for purpose.
29: ---------------------------------------------------------------------------
1.1.1.4 ! root 30: Issue 09/09/2006
1.1 root 31: */
32:
1.1.1.2 root 33: #include "Aesopt.h"
34: #include "Aestab.h"
1.1 root 35:
1.1.1.3 root 36: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 37: # include "aes_via_ace.h"
1.1.1.3 root 38: #endif
39:
1.1 root 40: #if defined(__cplusplus)
41: extern "C"
42: {
43: #endif
44:
45: /* Initialise the key schedule from the user supplied key. The key
46: length can be specified in bytes, with legal values of 16, 24
47: and 32, or in bits, with legal values of 128, 192 and 256. These
48: values correspond with Nk values of 4, 6 and 8 respectively.
49:
50: The following macros implement a single cycle in the key
51: schedule generation process. The number of cycles needed
52: for each cx->n_col and nk value is:
53:
54: nk = 4 5 6 7 8
55: ------------------------------
56: cx->n_col = 4 10 9 8 7 7
57: cx->n_col = 5 14 11 10 9 9
58: cx->n_col = 6 19 15 12 11 11
59: cx->n_col = 7 21 19 16 13 14
60: cx->n_col = 8 29 23 19 17 14
61: */
62:
1.1.1.3 root 63: #if (FUNCS_IN_C & ENC_KEYING_IN_C)
1.1 root 64:
1.1.1.3 root 65: #if defined(AES_128) || defined(AES_VAR)
1.1 root 66:
1.1.1.3 root 67: #define ke4(k,i) \
68: { k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
69: k[4*(i)+5] = ss[1] ^= ss[0]; \
70: k[4*(i)+6] = ss[2] ^= ss[1]; \
71: k[4*(i)+7] = ss[3] ^= ss[2]; \
1.1 root 72: }
73:
1.1.1.4 ! root 74: AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])
1.1.1.3 root 75: { uint_32t ss[4];
1.1 root 76:
77: cx->ks[0] = ss[0] = word_in(key, 0);
78: cx->ks[1] = ss[1] = word_in(key, 1);
79: cx->ks[2] = ss[2] = word_in(key, 2);
80: cx->ks[3] = ss[3] = word_in(key, 3);
81:
82: #if ENC_UNROLL == NONE
1.1.1.3 root 83: { uint_32t i;
84: for(i = 0; i < 9; ++i)
1.1 root 85: ke4(cx->ks, i);
86: }
87: #else
88: ke4(cx->ks, 0); ke4(cx->ks, 1);
89: ke4(cx->ks, 2); ke4(cx->ks, 3);
90: ke4(cx->ks, 4); ke4(cx->ks, 5);
91: ke4(cx->ks, 6); ke4(cx->ks, 7);
92: ke4(cx->ks, 8);
93: #endif
1.1.1.3 root 94: ke4(cx->ks, 9);
95: cx->inf.l = 0;
96: cx->inf.b[0] = 10 * 16;
97:
98: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 99: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 100: cx->inf.b[1] = 0xff;
101: #endif
102:
1.1 root 103: #if defined( AES_ERR_CHK )
1.1.1.3 root 104: return EXIT_SUCCESS;
1.1 root 105: #endif
106: }
107:
108: #endif
109:
110: #if defined(AES_192) || defined(AES_VAR)
111:
1.1.1.3 root 112: #define kef6(k,i) \
113: { k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
114: k[6*(i)+ 7] = ss[1] ^= ss[0]; \
115: k[6*(i)+ 8] = ss[2] ^= ss[1]; \
116: k[6*(i)+ 9] = ss[3] ^= ss[2]; \
117: }
118:
119: #define ke6(k,i) \
120: { kef6(k,i); \
121: k[6*(i)+10] = ss[4] ^= ss[3]; \
122: k[6*(i)+11] = ss[5] ^= ss[4]; \
123: }
124:
1.1.1.4 ! root 125: AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1])
1.1.1.3 root 126: { uint_32t ss[6];
1.1 root 127:
128: cx->ks[0] = ss[0] = word_in(key, 0);
129: cx->ks[1] = ss[1] = word_in(key, 1);
130: cx->ks[2] = ss[2] = word_in(key, 2);
131: cx->ks[3] = ss[3] = word_in(key, 3);
132: cx->ks[4] = ss[4] = word_in(key, 4);
133: cx->ks[5] = ss[5] = word_in(key, 5);
134:
135: #if ENC_UNROLL == NONE
1.1.1.3 root 136: { uint_32t i;
137: for(i = 0; i < 7; ++i)
1.1 root 138: ke6(cx->ks, i);
139: }
140: #else
141: ke6(cx->ks, 0); ke6(cx->ks, 1);
142: ke6(cx->ks, 2); ke6(cx->ks, 3);
143: ke6(cx->ks, 4); ke6(cx->ks, 5);
144: ke6(cx->ks, 6);
145: #endif
1.1.1.3 root 146: kef6(cx->ks, 7);
147: cx->inf.l = 0;
148: cx->inf.b[0] = 12 * 16;
149:
150: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 151: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 152: cx->inf.b[1] = 0xff;
153: #endif
154:
1.1 root 155: #if defined( AES_ERR_CHK )
1.1.1.3 root 156: return EXIT_SUCCESS;
1.1 root 157: #endif
158: }
159:
160: #endif
161:
162: #if defined(AES_256) || defined(AES_VAR)
163:
1.1.1.3 root 164: #define kef8(k,i) \
165: { k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
166: k[8*(i)+ 9] = ss[1] ^= ss[0]; \
167: k[8*(i)+10] = ss[2] ^= ss[1]; \
168: k[8*(i)+11] = ss[3] ^= ss[2]; \
169: }
170:
171: #define ke8(k,i) \
172: { kef8(k,i); \
173: k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \
174: k[8*(i)+13] = ss[5] ^= ss[4]; \
175: k[8*(i)+14] = ss[6] ^= ss[5]; \
176: k[8*(i)+15] = ss[7] ^= ss[6]; \
177: }
178:
1.1.1.4 ! root 179: AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])
1.1.1.3 root 180: { uint_32t ss[8];
1.1 root 181:
182: cx->ks[0] = ss[0] = word_in(key, 0);
183: cx->ks[1] = ss[1] = word_in(key, 1);
184: cx->ks[2] = ss[2] = word_in(key, 2);
185: cx->ks[3] = ss[3] = word_in(key, 3);
186: cx->ks[4] = ss[4] = word_in(key, 4);
187: cx->ks[5] = ss[5] = word_in(key, 5);
188: cx->ks[6] = ss[6] = word_in(key, 6);
189: cx->ks[7] = ss[7] = word_in(key, 7);
190:
191: #if ENC_UNROLL == NONE
1.1.1.3 root 192: { uint_32t i;
193: for(i = 0; i < 6; ++i)
1.1 root 194: ke8(cx->ks, i);
195: }
196: #else
197: ke8(cx->ks, 0); ke8(cx->ks, 1);
198: ke8(cx->ks, 2); ke8(cx->ks, 3);
199: ke8(cx->ks, 4); ke8(cx->ks, 5);
200: #endif
1.1.1.3 root 201: kef8(cx->ks, 6);
202: cx->inf.l = 0;
203: cx->inf.b[0] = 14 * 16;
204:
205: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 206: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 207: cx->inf.b[1] = 0xff;
208: #endif
209:
1.1 root 210: #if defined( AES_ERR_CHK )
1.1.1.3 root 211: return EXIT_SUCCESS;
1.1 root 212: #endif
213: }
214:
215: #endif
216:
217: #if defined(AES_VAR)
218:
1.1.1.4 ! root 219: AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
1.1 root 220: {
221: switch(key_len)
222: {
223: #if defined( AES_ERR_CHK )
224: case 16: case 128: return aes_encrypt_key128(key, cx);
225: case 24: case 192: return aes_encrypt_key192(key, cx);
226: case 32: case 256: return aes_encrypt_key256(key, cx);
1.1.1.3 root 227: default: return EXIT_FAILURE;
1.1 root 228: #else
229: case 16: case 128: aes_encrypt_key128(key, cx); return;
230: case 24: case 192: aes_encrypt_key192(key, cx); return;
231: case 32: case 256: aes_encrypt_key256(key, cx); return;
232: #endif
233: }
234: }
235:
236: #endif
237:
238: #endif
239:
1.1.1.3 root 240: #if (FUNCS_IN_C & DEC_KEYING_IN_C)
241:
242: /* this is used to store the decryption round keys */
243: /* in forward or reverse order */
244:
245: #ifdef AES_REV_DKS
246: #define v(n,i) ((n) - (i) + 2 * ((i) & 3))
247: #else
248: #define v(n,i) (i)
249: #endif
1.1 root 250:
251: #if DEC_ROUND == NO_TABLES
252: #define ff(x) (x)
253: #else
254: #define ff(x) inv_mcol(x)
255: #if defined( dec_imvars )
256: #define d_vars dec_imvars
257: #endif
258: #endif
259:
1.1.1.3 root 260: #if defined(AES_128) || defined(AES_VAR)
261:
262: #define k4e(k,i) \
263: { k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
264: k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \
265: k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \
266: k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \
267: }
268:
1.1 root 269: #if 1
1.1.1.3 root 270:
1.1 root 271: #define kdf4(k,i) \
1.1.1.3 root 272: { ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
273: ss[1] = ss[1] ^ ss[3]; \
274: ss[2] = ss[2] ^ ss[3]; \
275: ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
276: ss[i % 4] ^= ss[4]; \
277: ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \
278: ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \
279: ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \
280: ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \
1.1 root 281: }
1.1.1.3 root 282:
1.1 root 283: #define kd4(k,i) \
1.1.1.3 root 284: { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
285: ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
286: k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \
287: k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \
288: k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \
289: k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \
1.1 root 290: }
1.1.1.3 root 291:
1.1 root 292: #define kdl4(k,i) \
293: { ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
1.1.1.3 root 294: k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
295: k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \
296: k[v(40,(4*(i))+6)] = ss[0]; \
297: k[v(40,(4*(i))+7)] = ss[1]; \
1.1 root 298: }
1.1.1.3 root 299:
1.1 root 300: #else
1.1.1.3 root 301:
1.1 root 302: #define kdf4(k,i) \
1.1.1.3 root 303: { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \
304: ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \
305: ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \
306: ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \
1.1 root 307: }
1.1.1.3 root 308:
1.1 root 309: #define kd4(k,i) \
310: { ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
1.1.1.3 root 311: ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \
312: ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \
313: ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \
314: ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \
1.1 root 315: }
316:
1.1.1.3 root 317: #define kdl4(k,i) \
318: { ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \
319: ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \
320: ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \
321: ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \
1.1 root 322: }
323:
1.1.1.3 root 324: #endif
1.1 root 325:
1.1.1.4 ! root 326: AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])
1.1.1.3 root 327: { uint_32t ss[5];
1.1 root 328: #if defined( d_vars )
329: d_vars;
330: #endif
1.1.1.3 root 331: cx->ks[v(40,(0))] = ss[0] = word_in(key, 0);
332: cx->ks[v(40,(1))] = ss[1] = word_in(key, 1);
333: cx->ks[v(40,(2))] = ss[2] = word_in(key, 2);
334: cx->ks[v(40,(3))] = ss[3] = word_in(key, 3);
1.1 root 335:
336: #if DEC_UNROLL == NONE
1.1.1.3 root 337: { uint_32t i;
338: for(i = 0; i < 10; ++i)
339: k4e(cx->ks, i);
1.1 root 340: #if !(DEC_ROUND == NO_TABLES)
341: for(i = N_COLS; i < 10 * N_COLS; ++i)
342: cx->ks[i] = inv_mcol(cx->ks[i]);
343: #endif
344: }
345: #else
346: kdf4(cx->ks, 0); kd4(cx->ks, 1);
347: kd4(cx->ks, 2); kd4(cx->ks, 3);
348: kd4(cx->ks, 4); kd4(cx->ks, 5);
349: kd4(cx->ks, 6); kd4(cx->ks, 7);
350: kd4(cx->ks, 8); kdl4(cx->ks, 9);
351: #endif
1.1.1.3 root 352: cx->inf.l = 0;
353: cx->inf.b[0] = 10 * 16;
354:
355: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 356: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 357: cx->inf.b[1] = 0xff;
358: #endif
359:
1.1 root 360: #if defined( AES_ERR_CHK )
1.1.1.3 root 361: return EXIT_SUCCESS;
1.1 root 362: #endif
363: }
364:
365: #endif
366:
367: #if defined(AES_192) || defined(AES_VAR)
368:
1.1.1.3 root 369: #define k6ef(k,i) \
370: { k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
371: k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \
372: k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \
373: k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \
374: }
375:
376: #define k6e(k,i) \
377: { k6ef(k,i); \
378: k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \
379: k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \
380: }
381:
382: #define kdf6(k,i) \
383: { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \
384: ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \
385: ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \
386: ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \
387: ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \
388: ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \
389: }
390:
391: #define kd6(k,i) \
392: { ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
393: ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \
394: ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \
395: ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \
396: ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \
397: ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \
398: ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \
399: }
400:
401: #define kdl6(k,i) \
402: { ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \
403: ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \
404: ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \
405: ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \
406: }
407:
1.1.1.4 ! root 408: AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1])
1.1.1.3 root 409: { uint_32t ss[7];
1.1 root 410: #if defined( d_vars )
411: d_vars;
412: #endif
1.1.1.3 root 413: cx->ks[v(48,(0))] = ss[0] = word_in(key, 0);
414: cx->ks[v(48,(1))] = ss[1] = word_in(key, 1);
415: cx->ks[v(48,(2))] = ss[2] = word_in(key, 2);
416: cx->ks[v(48,(3))] = ss[3] = word_in(key, 3);
1.1 root 417:
418: #if DEC_UNROLL == NONE
1.1.1.3 root 419: cx->ks[v(48,(4))] = ss[4] = word_in(key, 4);
420: cx->ks[v(48,(5))] = ss[5] = word_in(key, 5);
421: { uint_32t i;
422:
423: for(i = 0; i < 7; ++i)
424: k6e(cx->ks, i);
425: k6ef(cx->ks, 7);
1.1 root 426: #if !(DEC_ROUND == NO_TABLES)
427: for(i = N_COLS; i < 12 * N_COLS; ++i)
428: cx->ks[i] = inv_mcol(cx->ks[i]);
429: #endif
430: }
431: #else
1.1.1.3 root 432: cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4));
433: cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5));
1.1 root 434: kdf6(cx->ks, 0); kd6(cx->ks, 1);
435: kd6(cx->ks, 2); kd6(cx->ks, 3);
436: kd6(cx->ks, 4); kd6(cx->ks, 5);
437: kd6(cx->ks, 6); kdl6(cx->ks, 7);
438: #endif
1.1.1.3 root 439: cx->inf.l = 0;
440: cx->inf.b[0] = 12 * 16;
441:
442: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 443: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 444: cx->inf.b[1] = 0xff;
445: #endif
446:
1.1 root 447: #if defined( AES_ERR_CHK )
1.1.1.3 root 448: return EXIT_SUCCESS;
1.1 root 449: #endif
450: }
451:
452: #endif
453:
454: #if defined(AES_256) || defined(AES_VAR)
455:
1.1.1.3 root 456: #define k8ef(k,i) \
457: { k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
458: k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \
459: k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \
460: k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \
461: }
462:
463: #define k8e(k,i) \
464: { k8ef(k,i); \
465: k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \
466: k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \
467: k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \
468: k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \
469: }
470:
471: #define kdf8(k,i) \
472: { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \
473: ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \
474: ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \
475: ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \
476: ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \
477: ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \
478: ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \
479: ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \
480: }
481:
482: #define kd8(k,i) \
483: { ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
484: ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \
485: ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \
486: ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \
487: ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \
488: ss[8] = ls_box(ss[3],0); \
489: ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \
490: ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \
491: ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \
492: ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \
493: }
494:
495: #define kdl8(k,i) \
496: { ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \
497: ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \
498: ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \
499: ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \
500: }
501:
1.1.1.4 ! root 502: AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])
1.1.1.3 root 503: { uint_32t ss[9];
1.1 root 504: #if defined( d_vars )
505: d_vars;
506: #endif
1.1.1.3 root 507: cx->ks[v(56,(0))] = ss[0] = word_in(key, 0);
508: cx->ks[v(56,(1))] = ss[1] = word_in(key, 1);
509: cx->ks[v(56,(2))] = ss[2] = word_in(key, 2);
510: cx->ks[v(56,(3))] = ss[3] = word_in(key, 3);
1.1 root 511:
512: #if DEC_UNROLL == NONE
1.1.1.3 root 513: cx->ks[v(56,(4))] = ss[4] = word_in(key, 4);
514: cx->ks[v(56,(5))] = ss[5] = word_in(key, 5);
515: cx->ks[v(56,(6))] = ss[6] = word_in(key, 6);
516: cx->ks[v(56,(7))] = ss[7] = word_in(key, 7);
517: { uint_32t i;
518:
519: for(i = 0; i < 6; ++i)
520: k8e(cx->ks, i);
521: k8ef(cx->ks, 6);
1.1 root 522: #if !(DEC_ROUND == NO_TABLES)
523: for(i = N_COLS; i < 14 * N_COLS; ++i)
524: cx->ks[i] = inv_mcol(cx->ks[i]);
525:
526: #endif
527: }
528: #else
1.1.1.3 root 529: cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4));
530: cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5));
531: cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6));
532: cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7));
1.1 root 533: kdf8(cx->ks, 0); kd8(cx->ks, 1);
534: kd8(cx->ks, 2); kd8(cx->ks, 3);
535: kd8(cx->ks, 4); kd8(cx->ks, 5);
536: kdl8(cx->ks, 6);
537: #endif
1.1.1.3 root 538: cx->inf.l = 0;
539: cx->inf.b[0] = 14 * 16;
540:
541: #ifdef USE_VIA_ACE_IF_PRESENT
1.1.1.4 ! root 542: if(VIA_ACE_AVAILABLE)
1.1.1.3 root 543: cx->inf.b[1] = 0xff;
544: #endif
545:
1.1 root 546: #if defined( AES_ERR_CHK )
1.1.1.3 root 547: return EXIT_SUCCESS;
1.1 root 548: #endif
549: }
550:
551: #endif
552:
553: #if defined(AES_VAR)
554:
1.1.1.4 ! root 555: AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
1.1 root 556: {
557: switch(key_len)
558: {
559: #if defined( AES_ERR_CHK )
560: case 16: case 128: return aes_decrypt_key128(key, cx);
561: case 24: case 192: return aes_decrypt_key192(key, cx);
562: case 32: case 256: return aes_decrypt_key256(key, cx);
1.1.1.3 root 563: default: return EXIT_FAILURE;
1.1 root 564: #else
565: case 16: case 128: aes_decrypt_key128(key, cx); return;
566: case 24: case 192: aes_decrypt_key192(key, cx); return;
567: case 32: case 256: aes_decrypt_key256(key, cx); return;
568: #endif
569: }
570: }
571:
572: #endif
573:
574: #endif
575:
576: #if defined(__cplusplus)
577: }
578: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.