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

1.1     ! root        1: /*
        !             2:  ---------------------------------------------------------------------------
        !             3:  Copyright (c) 2003, Dr Brian Gladman, Worcester, UK.   All rights reserved.
        !             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:  ---------------------------------------------------------------------------
        !            30:  Issue Date: 26/08/2003
        !            31: 
        !            32:  This file contains the code for implementing the key schedule for AES
        !            33:  (Rijndael) for block and key sizes of 16, 24, and 32 bytes. See aesopt.h
        !            34:  for further details including optimisation.
        !            35: */
        !            36: 
        !            37: #include "aesopt.h"
        !            38: #include "aestab.h"
        !            39: 
        !            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: 
        !            63: #define ke4(k,i) \
        !            64: {   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+5] = ss[1] ^= ss[0]; \
        !            65:     k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; \
        !            66: }
        !            67: #define kel4(k,i) \
        !            68: {   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+5] = ss[1] ^= ss[0]; \
        !            69:     k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; \
        !            70: }
        !            71: 
        !            72: #define ke6(k,i) \
        !            73: {   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; \
        !            74:     k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; \
        !            75:     k[6*(i)+10] = ss[4] ^= ss[3]; k[6*(i)+11] = ss[5] ^= ss[4]; \
        !            76: }
        !            77: #define kel6(k,i) \
        !            78: {   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 7] = ss[1] ^= ss[0]; \
        !            79:     k[6*(i)+ 8] = ss[2] ^= ss[1]; k[6*(i)+ 9] = ss[3] ^= ss[2]; \
        !            80: }
        !            81: 
        !            82: #define ke8(k,i) \
        !            83: {   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; \
        !            84:     k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; \
        !            85:     k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); k[8*(i)+13] = ss[5] ^= ss[4]; \
        !            86:     k[8*(i)+14] = ss[6] ^= ss[5]; k[8*(i)+15] = ss[7] ^= ss[6]; \
        !            87: }
        !            88: #define kel8(k,i) \
        !            89: {   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 9] = ss[1] ^= ss[0]; \
        !            90:     k[8*(i)+10] = ss[2] ^= ss[1]; k[8*(i)+11] = ss[3] ^= ss[2]; \
        !            91: }
        !            92: 
        !            93: #if defined(ENCRYPTION_KEY_SCHEDULE)
        !            94: 
        !            95: #if defined(AES_128) || defined(AES_VAR)
        !            96: 
        !            97: aes_rval aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])
        !            98: {   aes_32t    ss[4];
        !            99: 
        !           100:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           101:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           102:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           103:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           104: 
        !           105: #if ENC_UNROLL == NONE
        !           106:     {   aes_32t i;
        !           107: 
        !           108:         for(i = 0; i < ((11 * N_COLS - 5) / 4); ++i)
        !           109:             ke4(cx->ks, i);
        !           110:     }
        !           111: #else
        !           112:     ke4(cx->ks, 0);  ke4(cx->ks, 1);
        !           113:     ke4(cx->ks, 2);  ke4(cx->ks, 3);
        !           114:     ke4(cx->ks, 4);  ke4(cx->ks, 5);
        !           115:     ke4(cx->ks, 6);  ke4(cx->ks, 7);
        !           116:     ke4(cx->ks, 8);
        !           117: #endif
        !           118:     kel4(cx->ks, 9);
        !           119:     cx->rn = 10;
        !           120: #if defined( AES_ERR_CHK )
        !           121:     return aes_good;
        !           122: #endif
        !           123: }
        !           124: 
        !           125: #endif
        !           126: 
        !           127: #if defined(AES_192) || defined(AES_VAR)
        !           128: 
        !           129: aes_rval aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1])
        !           130: {   aes_32t    ss[6];
        !           131: 
        !           132:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           133:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           134:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           135:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           136:     cx->ks[4] = ss[4] = word_in(key, 4);
        !           137:     cx->ks[5] = ss[5] = word_in(key, 5);
        !           138: 
        !           139: #if ENC_UNROLL == NONE
        !           140:     {   aes_32t i;
        !           141: 
        !           142:         for(i = 0; i < (13 * N_COLS - 7) / 6; ++i)
        !           143:             ke6(cx->ks, i);
        !           144:     }
        !           145: #else
        !           146:     ke6(cx->ks, 0);  ke6(cx->ks, 1);
        !           147:     ke6(cx->ks, 2);  ke6(cx->ks, 3);
        !           148:     ke6(cx->ks, 4);  ke6(cx->ks, 5);
        !           149:     ke6(cx->ks, 6);
        !           150: #endif
        !           151:     kel6(cx->ks, 7);
        !           152:     cx->rn = 12;
        !           153: #if defined( AES_ERR_CHK )
        !           154:     return aes_good;
        !           155: #endif
        !           156: }
        !           157: 
        !           158: #endif
        !           159: 
        !           160: #if defined(AES_256) || defined(AES_VAR)
        !           161: 
        !           162: aes_rval aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])
        !           163: {   aes_32t    ss[8];
        !           164: 
        !           165:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           166:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           167:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           168:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           169:     cx->ks[4] = ss[4] = word_in(key, 4);
        !           170:     cx->ks[5] = ss[5] = word_in(key, 5);
        !           171:     cx->ks[6] = ss[6] = word_in(key, 6);
        !           172:     cx->ks[7] = ss[7] = word_in(key, 7);
        !           173: 
        !           174: #if ENC_UNROLL == NONE
        !           175:     {   aes_32t i;
        !           176: 
        !           177:         for(i = 0; i < (15 * N_COLS - 9) / 8; ++i)
        !           178:             ke8(cx->ks,  i);
        !           179:     }
        !           180: #else
        !           181:     ke8(cx->ks, 0); ke8(cx->ks, 1);
        !           182:     ke8(cx->ks, 2); ke8(cx->ks, 3);
        !           183:     ke8(cx->ks, 4); ke8(cx->ks, 5);
        !           184: #endif
        !           185:     kel8(cx->ks, 6);
        !           186:     cx->rn = 14;
        !           187: #if defined( AES_ERR_CHK )
        !           188:     return aes_good;
        !           189: #endif
        !           190: }
        !           191: 
        !           192: #endif
        !           193: 
        !           194: #if defined(AES_VAR)
        !           195: 
        !           196: aes_rval aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
        !           197: {
        !           198:     switch(key_len)
        !           199:     {
        !           200: #if defined( AES_ERR_CHK )
        !           201:     case 16: case 128: return aes_encrypt_key128(key, cx);
        !           202:     case 24: case 192: return aes_encrypt_key192(key, cx);
        !           203:     case 32: case 256: return aes_encrypt_key256(key, cx);
        !           204:     default: return aes_error;
        !           205: #else
        !           206:     case 16: case 128: aes_encrypt_key128(key, cx); return;
        !           207:     case 24: case 192: aes_encrypt_key192(key, cx); return;
        !           208:     case 32: case 256: aes_encrypt_key256(key, cx); return;
        !           209: #endif
        !           210:     }
        !           211: }
        !           212: 
        !           213: #endif
        !           214: 
        !           215: #endif
        !           216: 
        !           217: #if defined(DECRYPTION_KEY_SCHEDULE)
        !           218: 
        !           219: #if DEC_ROUND == NO_TABLES
        !           220: #define ff(x)   (x)
        !           221: #else
        !           222: #define ff(x)   inv_mcol(x)
        !           223: #if defined( dec_imvars )
        !           224: #define d_vars  dec_imvars
        !           225: #endif
        !           226: #endif
        !           227: 
        !           228: #if 1
        !           229: #define kdf4(k,i) \
        !           230: {   ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; ss[1] = ss[1] ^ ss[3]; ss[2] = ss[2] ^ ss[3]; ss[3] = ss[3]; \
        !           231:     ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
        !           232:     ss[4] ^= k[4*(i)];   k[4*(i)+4] = ff(ss[4]); ss[4] ^= k[4*(i)+1]; k[4*(i)+5] = ff(ss[4]); \
        !           233:     ss[4] ^= k[4*(i)+2]; k[4*(i)+6] = ff(ss[4]); ss[4] ^= k[4*(i)+3]; k[4*(i)+7] = ff(ss[4]); \
        !           234: }
        !           235: #define kd4(k,i) \
        !           236: {   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
        !           237:     k[4*(i)+4] = ss[4] ^= k[4*(i)]; k[4*(i)+5] = ss[4] ^= k[4*(i)+1]; \
        !           238:     k[4*(i)+6] = ss[4] ^= k[4*(i)+2]; k[4*(i)+7] = ss[4] ^= k[4*(i)+3]; \
        !           239: }
        !           240: #define kdl4(k,i) \
        !           241: {   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
        !           242:     k[4*(i)+4] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; k[4*(i)+5] = ss[1] ^ ss[3]; \
        !           243:     k[4*(i)+6] = ss[0]; k[4*(i)+7] = ss[1]; \
        !           244: }
        !           245: #else
        !           246: #define kdf4(k,i) \
        !           247: {   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+ 4] = ff(ss[0]); ss[1] ^= ss[0]; k[4*(i)+ 5] = ff(ss[1]); \
        !           248:     ss[2] ^= ss[1]; k[4*(i)+ 6] = ff(ss[2]); ss[3] ^= ss[2]; k[4*(i)+ 7] = ff(ss[3]); \
        !           249: }
        !           250: #define kd4(k,i) \
        !           251: {   ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
        !           252:     ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[4*(i)+ 4] = ss[4] ^= k[4*(i)]; \
        !           253:     ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[4] ^= k[4*(i)+ 1]; \
        !           254:     ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[4] ^= k[4*(i)+ 2]; \
        !           255:     ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[4] ^= k[4*(i)+ 3]; \
        !           256: }
        !           257: #define kdl4(k,i) \
        !           258: {   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[4*(i)+ 4] = ss[0]; ss[1] ^= ss[0]; k[4*(i)+ 5] = ss[1]; \
        !           259:     ss[2] ^= ss[1]; k[4*(i)+ 6] = ss[2]; ss[3] ^= ss[2]; k[4*(i)+ 7] = ss[3]; \
        !           260: }
        !           261: #endif
        !           262: 
        !           263: #define kdf6(k,i) \
        !           264: {   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 6] = ff(ss[0]); ss[1] ^= ss[0]; k[6*(i)+ 7] = ff(ss[1]); \
        !           265:     ss[2] ^= ss[1]; k[6*(i)+ 8] = ff(ss[2]); ss[3] ^= ss[2]; k[6*(i)+ 9] = ff(ss[3]); \
        !           266:     ss[4] ^= ss[3]; k[6*(i)+10] = ff(ss[4]); ss[5] ^= ss[4]; k[6*(i)+11] = ff(ss[5]); \
        !           267: }
        !           268: #define kd6(k,i) \
        !           269: {   ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
        !           270:     ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[6*(i)+ 6] = ss[6] ^= k[6*(i)]; \
        !           271:     ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[6] ^= k[6*(i)+ 1]; \
        !           272:     ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[6] ^= k[6*(i)+ 2]; \
        !           273:     ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[6] ^= k[6*(i)+ 3]; \
        !           274:     ss[4] ^= ss[3]; k[6*(i)+10] = ss[6] ^= k[6*(i)+ 4]; \
        !           275:     ss[5] ^= ss[4]; k[6*(i)+11] = ss[6] ^= k[6*(i)+ 5]; \
        !           276: }
        !           277: #define kdl6(k,i) \
        !           278: {   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[6*(i)+ 6] = ss[0]; ss[1] ^= ss[0]; k[6*(i)+ 7] = ss[1]; \
        !           279:     ss[2] ^= ss[1]; k[6*(i)+ 8] = ss[2]; ss[3] ^= ss[2]; k[6*(i)+ 9] = ss[3]; \
        !           280: }
        !           281: 
        !           282: #define kdf8(k,i) \
        !           283: {   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 8] = ff(ss[0]); ss[1] ^= ss[0]; k[8*(i)+ 9] = ff(ss[1]); \
        !           284:     ss[2] ^= ss[1]; k[8*(i)+10] = ff(ss[2]); ss[3] ^= ss[2]; k[8*(i)+11] = ff(ss[3]); \
        !           285:     ss[4] ^= ls_box(ss[3],0); k[8*(i)+12] = ff(ss[4]); ss[5] ^= ss[4]; k[8*(i)+13] = ff(ss[5]); \
        !           286:     ss[6] ^= ss[5]; k[8*(i)+14] = ff(ss[6]); ss[7] ^= ss[6]; k[8*(i)+15] = ff(ss[7]); \
        !           287: }
        !           288: #define kd8(k,i) \
        !           289: {   aes_32t g = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
        !           290:     ss[0] ^= g; g = ff(g); k[8*(i)+ 8] = g ^= k[8*(i)]; \
        !           291:     ss[1] ^= ss[0]; k[8*(i)+ 9] = g ^= k[8*(i)+ 1]; \
        !           292:     ss[2] ^= ss[1]; k[8*(i)+10] = g ^= k[8*(i)+ 2]; \
        !           293:     ss[3] ^= ss[2]; k[8*(i)+11] = g ^= k[8*(i)+ 3]; \
        !           294:     g = ls_box(ss[3],0); \
        !           295:     ss[4] ^= g; g = ff(g); k[8*(i)+12] = g ^= k[8*(i)+ 4]; \
        !           296:     ss[5] ^= ss[4]; k[8*(i)+13] = g ^= k[8*(i)+ 5]; \
        !           297:     ss[6] ^= ss[5]; k[8*(i)+14] = g ^= k[8*(i)+ 6]; \
        !           298:     ss[7] ^= ss[6]; k[8*(i)+15] = g ^= k[8*(i)+ 7]; \
        !           299: }
        !           300: #define kdl8(k,i) \
        !           301: {   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[8*(i)+ 8] = ss[0]; ss[1] ^= ss[0]; k[8*(i)+ 9] = ss[1]; \
        !           302:     ss[2] ^= ss[1]; k[8*(i)+10] = ss[2]; ss[3] ^= ss[2]; k[8*(i)+11] = ss[3]; \
        !           303: }
        !           304: 
        !           305: #if defined(AES_128) || defined(AES_VAR)
        !           306: 
        !           307: aes_rval aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])
        !           308: {   aes_32t    ss[5];
        !           309: #if defined( d_vars )
        !           310:         d_vars;
        !           311: #endif
        !           312:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           313:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           314:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           315:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           316: 
        !           317: #if DEC_UNROLL == NONE
        !           318:     {   aes_32t i;
        !           319: 
        !           320:         for(i = 0; i < (11 * N_COLS - 5) / 4; ++i)
        !           321:             ke4(cx->ks, i);
        !           322:         kel4(cx->ks, 9);
        !           323: #if !(DEC_ROUND == NO_TABLES)
        !           324:         for(i = N_COLS; i < 10 * N_COLS; ++i)
        !           325:             cx->ks[i] = inv_mcol(cx->ks[i]);
        !           326: #endif
        !           327:     }
        !           328: #else
        !           329:     kdf4(cx->ks, 0);  kd4(cx->ks, 1);
        !           330:      kd4(cx->ks, 2);  kd4(cx->ks, 3);
        !           331:      kd4(cx->ks, 4);  kd4(cx->ks, 5);
        !           332:      kd4(cx->ks, 6);  kd4(cx->ks, 7);
        !           333:      kd4(cx->ks, 8); kdl4(cx->ks, 9);
        !           334: #endif
        !           335:     cx->rn = 10;
        !           336: #if defined( AES_ERR_CHK )
        !           337:     return aes_good;
        !           338: #endif
        !           339: }
        !           340: 
        !           341: #endif
        !           342: 
        !           343: #if defined(AES_192) || defined(AES_VAR)
        !           344: 
        !           345: aes_rval aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1])
        !           346: {   aes_32t    ss[7];
        !           347: #if defined( d_vars )
        !           348:         d_vars;
        !           349: #endif
        !           350:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           351:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           352:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           353:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           354: 
        !           355: #if DEC_UNROLL == NONE
        !           356:     cx->ks[4] = ss[4] = word_in(key, 4);
        !           357:     cx->ks[5] = ss[5] = word_in(key, 5);
        !           358:     {   aes_32t i;
        !           359: 
        !           360:         for(i = 0; i < (13 * N_COLS - 7) / 6; ++i)
        !           361:             ke6(cx->ks, i);
        !           362:         kel6(cx->ks, 7);
        !           363: #if !(DEC_ROUND == NO_TABLES)
        !           364:         for(i = N_COLS; i < 12 * N_COLS; ++i)
        !           365:             cx->ks[i] = inv_mcol(cx->ks[i]);
        !           366: #endif
        !           367:     }
        !           368: #else
        !           369:     cx->ks[4] = ff(ss[4] = word_in(key, 4));
        !           370:     cx->ks[5] = ff(ss[5] = word_in(key, 5));
        !           371:     kdf6(cx->ks, 0); kd6(cx->ks, 1);
        !           372:     kd6(cx->ks, 2);  kd6(cx->ks, 3);
        !           373:     kd6(cx->ks, 4);  kd6(cx->ks, 5);
        !           374:     kd6(cx->ks, 6); kdl6(cx->ks, 7);
        !           375: #endif
        !           376:     cx->rn = 12;
        !           377: #if defined( AES_ERR_CHK )
        !           378:     return aes_good;
        !           379: #endif
        !           380: }
        !           381: 
        !           382: #endif
        !           383: 
        !           384: #if defined(AES_256) || defined(AES_VAR)
        !           385: 
        !           386: aes_rval aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])
        !           387: {   aes_32t    ss[8];
        !           388: #if defined( d_vars )
        !           389:         d_vars;
        !           390: #endif
        !           391:     cx->ks[0] = ss[0] = word_in(key, 0);
        !           392:     cx->ks[1] = ss[1] = word_in(key, 1);
        !           393:     cx->ks[2] = ss[2] = word_in(key, 2);
        !           394:     cx->ks[3] = ss[3] = word_in(key, 3);
        !           395: 
        !           396: #if DEC_UNROLL == NONE
        !           397:     cx->ks[4] = ss[4] = word_in(key, 4);
        !           398:     cx->ks[5] = ss[5] = word_in(key, 5);
        !           399:     cx->ks[6] = ss[6] = word_in(key, 6);
        !           400:     cx->ks[7] = ss[7] = word_in(key, 7);
        !           401:     {   aes_32t i;
        !           402: 
        !           403:         for(i = 0; i < (15 * N_COLS - 9) / 8; ++i)
        !           404:             ke8(cx->ks,  i);
        !           405:         kel8(cx->ks,  i);
        !           406: #if !(DEC_ROUND == NO_TABLES)
        !           407:         for(i = N_COLS; i < 14 * N_COLS; ++i)
        !           408:             cx->ks[i] = inv_mcol(cx->ks[i]);
        !           409: 
        !           410: #endif
        !           411:     }
        !           412: #else
        !           413:     cx->ks[4] = ff(ss[4] = word_in(key, 4));
        !           414:     cx->ks[5] = ff(ss[5] = word_in(key, 5));
        !           415:     cx->ks[6] = ff(ss[6] = word_in(key, 6));
        !           416:     cx->ks[7] = ff(ss[7] = word_in(key, 7));
        !           417:     kdf8(cx->ks, 0); kd8(cx->ks, 1);
        !           418:     kd8(cx->ks, 2);  kd8(cx->ks, 3);
        !           419:     kd8(cx->ks, 4);  kd8(cx->ks, 5);
        !           420:     kdl8(cx->ks, 6);
        !           421: #endif
        !           422:     cx->rn = 14;
        !           423: #if defined( AES_ERR_CHK )
        !           424:     return aes_good;
        !           425: #endif
        !           426: }
        !           427: 
        !           428: #endif
        !           429: 
        !           430: #if defined(AES_VAR)
        !           431: 
        !           432: aes_rval aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
        !           433: {
        !           434:     switch(key_len)
        !           435:     {
        !           436: #if defined( AES_ERR_CHK )
        !           437:     case 16: case 128: return aes_decrypt_key128(key, cx);
        !           438:     case 24: case 192: return aes_decrypt_key192(key, cx);
        !           439:     case 32: case 256: return aes_decrypt_key256(key, cx);
        !           440:     default: return aes_error;
        !           441: #else
        !           442:     case 16: case 128: aes_decrypt_key128(key, cx); return;
        !           443:     case 24: case 192: aes_decrypt_key192(key, cx); return;
        !           444:     case 32: case 256: aes_decrypt_key256(key, cx); return;
        !           445: #endif
        !           446:     }
        !           447: }
        !           448: 
        !           449: #endif
        !           450: 
        !           451: #endif
        !           452: 
        !           453: #if defined(__cplusplus)
        !           454: }
        !           455: #endif

unix.superglobalmegacorp.com

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