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