Annotation of truecrypt/crypto/aeskey.c, revision 1.1.1.5

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.