Coverage Report

Created: 2026-07-24 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 */