16877Sda73024 /*
26877Sda73024 * ---------------------------------------------------------------------------
36877Sda73024 * Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved.
46877Sda73024 *
56877Sda73024 * LICENSE TERMS
66877Sda73024 *
76877Sda73024 * The free distribution and use of this software is allowed (with or without
86877Sda73024 * changes) provided that:
96877Sda73024 *
106877Sda73024 * 1. source code distributions include the above copyright notice, this
116877Sda73024 * list of conditions and the following disclaimer;
126877Sda73024 *
136877Sda73024 * 2. binary distributions include the above copyright notice, this list
146877Sda73024 * of conditions and the following disclaimer in their documentation;
156877Sda73024 *
166877Sda73024 * 3. the name of the copyright holder is not used to endorse products
176877Sda73024 * built using this software without specific written permission.
186877Sda73024 *
196877Sda73024 * DISCLAIMER
206877Sda73024 *
216877Sda73024 * This software is provided 'as is' with no explicit or implied warranties
226877Sda73024 * in respect of its properties, including, but not limited to, correctness
236877Sda73024 * and/or fitness for purpose.
246877Sda73024 * ---------------------------------------------------------------------------
256877Sda73024 * Issue Date: 20/12/2007
266877Sda73024 */
276877Sda73024
286877Sda73024 #include "aes_impl.h"
296877Sda73024 #include "aesopt.h"
306877Sda73024 #include "aestab.h"
316877Sda73024 #include "aestab2.h"
326877Sda73024
336877Sda73024 /*
346877Sda73024 * Initialise the key schedule from the user supplied key. The key
356877Sda73024 * length can be specified in bytes, with legal values of 16, 24
366877Sda73024 * and 32, or in bits, with legal values of 128, 192 and 256. These
376877Sda73024 * values correspond with Nk values of 4, 6 and 8 respectively.
386877Sda73024 *
396877Sda73024 * The following macros implement a single cycle in the key
406877Sda73024 * schedule generation process. The number of cycles needed
416877Sda73024 * for each cx->n_col and nk value is:
426877Sda73024 *
436877Sda73024 * nk = 4 5 6 7 8
446877Sda73024 * ------------------------------
456877Sda73024 * cx->n_col = 4 10 9 8 7 7
466877Sda73024 * cx->n_col = 5 14 11 10 9 9
476877Sda73024 * cx->n_col = 6 19 15 12 11 11
486877Sda73024 * cx->n_col = 7 21 19 16 13 14
496877Sda73024 * cx->n_col = 8 29 23 19 17 14
506877Sda73024 */
516877Sda73024
526877Sda73024 /*
536877Sda73024 * OpenSolaris changes
546877Sda73024 * 1. Added header files aes_impl.h and aestab2.h
556877Sda73024 * 2. Changed uint_8t and uint_32t to uint8_t and uint32_t
566877Sda73024 * 3. Remove code under ifdef USE_VIA_ACE_IF_PRESENT (always undefined)
576877Sda73024 * 4. Removed always-defined ifdefs FUNCS_IN_C, ENC_KEYING_IN_C,
586877Sda73024 * AES_128, AES_192, AES_256, AES_VAR defines
596877Sda73024 * 5. Changed aes_encrypt_key* aes_decrypt_key* functions to "static void"
606877Sda73024 * 6. Changed N_COLS to MAX_AES_NB
616877Sda73024 * 7. Replaced functions aes_encrypt_key and aes_decrypt_key with
62*9392Sopensolaris@drydog.com * OpenSolaris-compatible functions rijndael_key_setup_enc_amd64 and
63*9392Sopensolaris@drydog.com * rijndael_key_setup_dec_amd64
646877Sda73024 * 8. cstyled code and removed lint warnings
656877Sda73024 */
666877Sda73024
676877Sda73024 #if defined(REDUCE_CODE_SIZE)
686877Sda73024 #define ls_box ls_sub
696877Sda73024 uint32_t ls_sub(const uint32_t t, const uint32_t n);
706877Sda73024 #define inv_mcol im_sub
716877Sda73024 uint32_t im_sub(const uint32_t x);
726877Sda73024 #ifdef ENC_KS_UNROLL
736877Sda73024 #undef ENC_KS_UNROLL
746877Sda73024 #endif
756877Sda73024 #ifdef DEC_KS_UNROLL
766877Sda73024 #undef DEC_KS_UNROLL
776877Sda73024 #endif
786877Sda73024 #endif /* REDUCE_CODE_SIZE */
796877Sda73024
806877Sda73024
816877Sda73024 #define ke4(k, i) \
826877Sda73024 { k[4 * (i) + 4] = ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \
836877Sda73024 k[4 * (i) + 5] = ss[1] ^= ss[0]; \
846877Sda73024 k[4 * (i) + 6] = ss[2] ^= ss[1]; \
856877Sda73024 k[4 * (i) + 7] = ss[3] ^= ss[2]; \
866877Sda73024 }
876877Sda73024
886877Sda73024 static void
aes_encrypt_key128(const unsigned char * key,uint32_t rk[])896877Sda73024 aes_encrypt_key128(const unsigned char *key, uint32_t rk[])
906877Sda73024 {
916877Sda73024 uint32_t ss[4];
926877Sda73024
936877Sda73024 rk[0] = ss[0] = word_in(key, 0);
946877Sda73024 rk[1] = ss[1] = word_in(key, 1);
956877Sda73024 rk[2] = ss[2] = word_in(key, 2);
966877Sda73024 rk[3] = ss[3] = word_in(key, 3);
976877Sda73024
986877Sda73024 #ifdef ENC_KS_UNROLL
996877Sda73024 ke4(rk, 0); ke4(rk, 1);
1006877Sda73024 ke4(rk, 2); ke4(rk, 3);
1016877Sda73024 ke4(rk, 4); ke4(rk, 5);
1026877Sda73024 ke4(rk, 6); ke4(rk, 7);
1036877Sda73024 ke4(rk, 8);
1046877Sda73024 #else
1056877Sda73024 {
1066877Sda73024 uint32_t i;
1076877Sda73024 for (i = 0; i < 9; ++i)
1086877Sda73024 ke4(rk, i);
1096877Sda73024 }
1106877Sda73024 #endif /* ENC_KS_UNROLL */
1116877Sda73024 ke4(rk, 9);
1126877Sda73024 }
1136877Sda73024
1146877Sda73024
1156877Sda73024 #define kef6(k, i) \
1166877Sda73024 { k[6 * (i) + 6] = ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \
1176877Sda73024 k[6 * (i) + 7] = ss[1] ^= ss[0]; \
1186877Sda73024 k[6 * (i) + 8] = ss[2] ^= ss[1]; \
1196877Sda73024 k[6 * (i) + 9] = ss[3] ^= ss[2]; \
1206877Sda73024 }
1216877Sda73024
1226877Sda73024 #define ke6(k, i) \
1236877Sda73024 { kef6(k, i); \
1246877Sda73024 k[6 * (i) + 10] = ss[4] ^= ss[3]; \
1256877Sda73024 k[6 * (i) + 11] = ss[5] ^= ss[4]; \
1266877Sda73024 }
1276877Sda73024
1286877Sda73024 static void
aes_encrypt_key192(const unsigned char * key,uint32_t rk[])1296877Sda73024 aes_encrypt_key192(const unsigned char *key, uint32_t rk[])
1306877Sda73024 {
1316877Sda73024 uint32_t ss[6];
1326877Sda73024
1336877Sda73024 rk[0] = ss[0] = word_in(key, 0);
1346877Sda73024 rk[1] = ss[1] = word_in(key, 1);
1356877Sda73024 rk[2] = ss[2] = word_in(key, 2);
1366877Sda73024 rk[3] = ss[3] = word_in(key, 3);
1376877Sda73024 rk[4] = ss[4] = word_in(key, 4);
1386877Sda73024 rk[5] = ss[5] = word_in(key, 5);
1396877Sda73024
1406877Sda73024 #ifdef ENC_KS_UNROLL
1416877Sda73024 ke6(rk, 0); ke6(rk, 1);
1426877Sda73024 ke6(rk, 2); ke6(rk, 3);
1436877Sda73024 ke6(rk, 4); ke6(rk, 5);
1446877Sda73024 ke6(rk, 6);
1456877Sda73024 #else
1466877Sda73024 {
1476877Sda73024 uint32_t i;
1486877Sda73024 for (i = 0; i < 7; ++i)
1496877Sda73024 ke6(rk, i);
1506877Sda73024 }
1516877Sda73024 #endif /* ENC_KS_UNROLL */
1526877Sda73024 kef6(rk, 7);
1536877Sda73024 }
1546877Sda73024
1556877Sda73024
1566877Sda73024
1576877Sda73024 #define kef8(k, i) \
1586877Sda73024 { k[8 * (i) + 8] = ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \
1596877Sda73024 k[8 * (i) + 9] = ss[1] ^= ss[0]; \
1606877Sda73024 k[8 * (i) + 10] = ss[2] ^= ss[1]; \
1616877Sda73024 k[8 * (i) + 11] = ss[3] ^= ss[2]; \
1626877Sda73024 }
1636877Sda73024
1646877Sda73024 #define ke8(k, i) \
1656877Sda73024 { kef8(k, i); \
1666877Sda73024 k[8 * (i) + 12] = ss[4] ^= ls_box(ss[3], 0); \
1676877Sda73024 k[8 * (i) + 13] = ss[5] ^= ss[4]; \
1686877Sda73024 k[8 * (i) + 14] = ss[6] ^= ss[5]; \
1696877Sda73024 k[8 * (i) + 15] = ss[7] ^= ss[6]; \
1706877Sda73024 }
1716877Sda73024
1726877Sda73024 static void
aes_encrypt_key256(const unsigned char * key,uint32_t rk[])1736877Sda73024 aes_encrypt_key256(const unsigned char *key, uint32_t rk[])
1746877Sda73024 {
1756877Sda73024 uint32_t ss[8];
1766877Sda73024
1776877Sda73024 rk[0] = ss[0] = word_in(key, 0);
1786877Sda73024 rk[1] = ss[1] = word_in(key, 1);
1796877Sda73024 rk[2] = ss[2] = word_in(key, 2);
1806877Sda73024 rk[3] = ss[3] = word_in(key, 3);
1816877Sda73024 rk[4] = ss[4] = word_in(key, 4);
1826877Sda73024 rk[5] = ss[5] = word_in(key, 5);
1836877Sda73024 rk[6] = ss[6] = word_in(key, 6);
1846877Sda73024 rk[7] = ss[7] = word_in(key, 7);
1856877Sda73024
1866877Sda73024 #ifdef ENC_KS_UNROLL
1876877Sda73024 ke8(rk, 0); ke8(rk, 1);
1886877Sda73024 ke8(rk, 2); ke8(rk, 3);
1896877Sda73024 ke8(rk, 4); ke8(rk, 5);
1906877Sda73024 #else
1916877Sda73024 {
1926877Sda73024 uint32_t i;
1936877Sda73024 for (i = 0; i < 6; ++i)
1946877Sda73024 ke8(rk, i);
1956877Sda73024 }
1966877Sda73024 #endif /* ENC_KS_UNROLL */
1976877Sda73024 kef8(rk, 6);
1986877Sda73024 }
1996877Sda73024
2006877Sda73024
2016877Sda73024 /*
2026877Sda73024 * Expand the cipher key into the encryption key schedule.
2036877Sda73024 *
2046877Sda73024 * Return the number of rounds for the given cipher key size.
2056877Sda73024 * The size of the key schedule depends on the number of rounds
2066877Sda73024 * (which can be computed from the size of the key), i.e. 4 * (Nr + 1).
2076877Sda73024 *
2086877Sda73024 * Parameters:
2096877Sda73024 * rk AES key schedule 32-bit array to be initialized
2106877Sda73024 * cipherKey User key
2116877Sda73024 * keyBits AES key size (128, 192, or 256 bits)
2126877Sda73024 */
2136877Sda73024 int
rijndael_key_setup_enc_amd64(uint32_t rk[],const uint32_t cipherKey[],int keyBits)214*9392Sopensolaris@drydog.com rijndael_key_setup_enc_amd64(uint32_t rk[], const uint32_t cipherKey[],
215*9392Sopensolaris@drydog.com int keyBits)
2166877Sda73024 {
2176877Sda73024 switch (keyBits) {
2186877Sda73024 case 128:
2196877Sda73024 aes_encrypt_key128((unsigned char *)&cipherKey[0], rk);
2206877Sda73024 return (10);
2216877Sda73024 case 192:
2226877Sda73024 aes_encrypt_key192((unsigned char *)&cipherKey[0], rk);
2236877Sda73024 return (12);
2246877Sda73024 case 256:
2256877Sda73024 aes_encrypt_key256((unsigned char *)&cipherKey[0], rk);
2266877Sda73024 return (14);
2276877Sda73024 default: /* should never get here */
2286877Sda73024 break;
2296877Sda73024 }
2306877Sda73024
2316877Sda73024 return (0);
2326877Sda73024 }
2336877Sda73024
2346877Sda73024
2356877Sda73024 /* this is used to store the decryption round keys */
2366877Sda73024 /* in forward or reverse order */
2376877Sda73024
2386877Sda73024 #ifdef AES_REV_DKS
2396877Sda73024 #define v(n, i) ((n) - (i) + 2 * ((i) & 3))
2406877Sda73024 #else
2416877Sda73024 #define v(n, i) (i)
2426877Sda73024 #endif
2436877Sda73024
2446877Sda73024 #if DEC_ROUND == NO_TABLES
2456877Sda73024 #define ff(x) (x)
2466877Sda73024 #else
2476877Sda73024 #define ff(x) inv_mcol(x)
2486877Sda73024 #if defined(dec_imvars)
2496877Sda73024 #define d_vars dec_imvars
2506877Sda73024 #endif
2516877Sda73024 #endif /* FUNCS_IN_C & DEC_KEYING_IN_C */
2526877Sda73024
2536877Sda73024
2546877Sda73024 #define k4e(k, i) \
2556877Sda73024 { k[v(40, (4 * (i)) + 4)] = ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \
2566877Sda73024 k[v(40, (4 * (i)) + 5)] = ss[1] ^= ss[0]; \
2576877Sda73024 k[v(40, (4 * (i)) + 6)] = ss[2] ^= ss[1]; \
2586877Sda73024 k[v(40, (4 * (i)) + 7)] = ss[3] ^= ss[2]; \
2596877Sda73024 }
2606877Sda73024
2616877Sda73024 #if 1
2626877Sda73024
2636877Sda73024 #define kdf4(k, i) \
2646877Sda73024 { ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
2656877Sda73024 ss[1] = ss[1] ^ ss[3]; \
2666877Sda73024 ss[2] = ss[2] ^ ss[3]; \
2676877Sda73024 ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \
2686877Sda73024 ss[i % 4] ^= ss[4]; \
2696877Sda73024 ss[4] ^= k[v(40, (4 * (i)))]; k[v(40, (4 * (i)) + 4)] = ff(ss[4]); \
2706877Sda73024 ss[4] ^= k[v(40, (4 * (i)) + 1)]; k[v(40, (4 * (i)) + 5)] = ff(ss[4]); \
2716877Sda73024 ss[4] ^= k[v(40, (4 * (i)) + 2)]; k[v(40, (4 * (i)) + 6)] = ff(ss[4]); \
2726877Sda73024 ss[4] ^= k[v(40, (4 * (i)) + 3)]; k[v(40, (4 * (i)) + 7)] = ff(ss[4]); \
2736877Sda73024 }
2746877Sda73024
2756877Sda73024 #define kd4(k, i) \
2766877Sda73024 { ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \
2776877Sda73024 ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
2786877Sda73024 k[v(40, (4 * (i)) + 4)] = ss[4] ^= k[v(40, (4 * (i)))]; \
2796877Sda73024 k[v(40, (4 * (i)) + 5)] = ss[4] ^= k[v(40, (4 * (i)) + 1)]; \
2806877Sda73024 k[v(40, (4 * (i)) + 6)] = ss[4] ^= k[v(40, (4 * (i)) + 2)]; \
2816877Sda73024 k[v(40, (4 * (i)) + 7)] = ss[4] ^= k[v(40, (4 * (i)) + 3)]; \
2826877Sda73024 }
2836877Sda73024
2846877Sda73024 #define kdl4(k, i) \
2856877Sda73024 { ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \
2866877Sda73024 ss[i % 4] ^= ss[4]; \
2876877Sda73024 k[v(40, (4 * (i)) + 4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
2886877Sda73024 k[v(40, (4 * (i)) + 5)] = ss[1] ^ ss[3]; \
2896877Sda73024 k[v(40, (4 * (i)) + 6)] = ss[0]; \
2906877Sda73024 k[v(40, (4 * (i)) + 7)] = ss[1]; \
2916877Sda73024 }
2926877Sda73024
2936877Sda73024 #else
2946877Sda73024
2956877Sda73024 #define kdf4(k, i) \
2966877Sda73024 { ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \
2976877Sda73024 k[v(40, (4 * (i)) + 4)] = ff(ss[0]); \
2986877Sda73024 ss[1] ^= ss[0]; k[v(40, (4 * (i)) + 5)] = ff(ss[1]); \
2996877Sda73024 ss[2] ^= ss[1]; k[v(40, (4 * (i)) + 6)] = ff(ss[2]); \
3006877Sda73024 ss[3] ^= ss[2]; k[v(40, (4 * (i)) + 7)] = ff(ss[3]); \
3016877Sda73024 }
3026877Sda73024
3036877Sda73024 #define kd4(k, i) \
3046877Sda73024 { ss[4] = ls_box(ss[3], 3) ^ t_use(r, c)[i]; \
3056877Sda73024 ss[0] ^= ss[4]; \
3066877Sda73024 ss[4] = ff(ss[4]); \
3076877Sda73024 k[v(40, (4 * (i)) + 4)] = ss[4] ^= k[v(40, (4 * (i)))]; \
3086877Sda73024 ss[1] ^= ss[0]; \
3096877Sda73024 k[v(40, (4 * (i)) + 5)] = ss[4] ^= k[v(40, (4 * (i)) + 1)]; \
3106877Sda73024 ss[2] ^= ss[1]; \
3116877Sda73024 k[v(40, (4 * (i)) + 6)] = ss[4] ^= k[v(40, (4 * (i)) + 2)]; \
3126877Sda73024 ss[3] ^= ss[2]; \
3136877Sda73024 k[v(40, (4 * (i)) + 7)] = ss[4] ^= k[v(40, (4 * (i)) + 3)]; \
3146877Sda73024 }
3156877Sda73024
3166877Sda73024 #define kdl4(k, i) \
3176877Sda73024 { ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \
3186877Sda73024 k[v(40, (4 * (i)) + 4)] = ss[0]; \
3196877Sda73024 ss[1] ^= ss[0]; k[v(40, (4 * (i)) + 5)] = ss[1]; \
3206877Sda73024 ss[2] ^= ss[1]; k[v(40, (4 * (i)) + 6)] = ss[2]; \
3216877Sda73024 ss[3] ^= ss[2]; k[v(40, (4 * (i)) + 7)] = ss[3]; \
3226877Sda73024 }
3236877Sda73024
3246877Sda73024 #endif
3256877Sda73024
3266877Sda73024 static void
aes_decrypt_key128(const unsigned char * key,uint32_t rk[])3276877Sda73024 aes_decrypt_key128(const unsigned char *key, uint32_t rk[])
3286877Sda73024 {
3296877Sda73024 uint32_t ss[5];
3306877Sda73024 #if defined(d_vars)
3316877Sda73024 d_vars;
3326877Sda73024 #endif
3336877Sda73024 rk[v(40, (0))] = ss[0] = word_in(key, 0);
3346877Sda73024 rk[v(40, (1))] = ss[1] = word_in(key, 1);
3356877Sda73024 rk[v(40, (2))] = ss[2] = word_in(key, 2);
3366877Sda73024 rk[v(40, (3))] = ss[3] = word_in(key, 3);
3376877Sda73024
3386877Sda73024 #ifdef DEC_KS_UNROLL
3396877Sda73024 kdf4(rk, 0); kd4(rk, 1);
3406877Sda73024 kd4(rk, 2); kd4(rk, 3);
3416877Sda73024 kd4(rk, 4); kd4(rk, 5);
3426877Sda73024 kd4(rk, 6); kd4(rk, 7);
3436877Sda73024 kd4(rk, 8); kdl4(rk, 9);
3446877Sda73024 #else
3456877Sda73024 {
3466877Sda73024 uint32_t i;
3476877Sda73024 for (i = 0; i < 10; ++i)
3486877Sda73024 k4e(rk, i);
3496877Sda73024 #if !(DEC_ROUND == NO_TABLES)
3506877Sda73024 for (i = MAX_AES_NB; i < 10 * MAX_AES_NB; ++i)
3516877Sda73024 rk[i] = inv_mcol(rk[i]);
3526877Sda73024 #endif
3536877Sda73024 }
3546877Sda73024 #endif /* DEC_KS_UNROLL */
3556877Sda73024 }
3566877Sda73024
3576877Sda73024
3586877Sda73024
3596877Sda73024 #define k6ef(k, i) \
3606877Sda73024 { k[v(48, (6 * (i)) + 6)] = ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \
3616877Sda73024 k[v(48, (6 * (i)) + 7)] = ss[1] ^= ss[0]; \
3626877Sda73024 k[v(48, (6 * (i)) + 8)] = ss[2] ^= ss[1]; \
3636877Sda73024 k[v(48, (6 * (i)) + 9)] = ss[3] ^= ss[2]; \
3646877Sda73024 }
3656877Sda73024
3666877Sda73024 #define k6e(k, i) \
3676877Sda73024 { k6ef(k, i); \
3686877Sda73024 k[v(48, (6 * (i)) + 10)] = ss[4] ^= ss[3]; \
3696877Sda73024 k[v(48, (6 * (i)) + 11)] = ss[5] ^= ss[4]; \
3706877Sda73024 }
3716877Sda73024
3726877Sda73024 #define kdf6(k, i) \
3736877Sda73024 { ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \
3746877Sda73024 k[v(48, (6 * (i)) + 6)] = ff(ss[0]); \
3756877Sda73024 ss[1] ^= ss[0]; k[v(48, (6 * (i)) + 7)] = ff(ss[1]); \
3766877Sda73024 ss[2] ^= ss[1]; k[v(48, (6 * (i)) + 8)] = ff(ss[2]); \
3776877Sda73024 ss[3] ^= ss[2]; k[v(48, (6 * (i)) + 9)] = ff(ss[3]); \
3786877Sda73024 ss[4] ^= ss[3]; k[v(48, (6 * (i)) + 10)] = ff(ss[4]); \
3796877Sda73024 ss[5] ^= ss[4]; k[v(48, (6 * (i)) + 11)] = ff(ss[5]); \
3806877Sda73024 }
3816877Sda73024
3826877Sda73024 #define kd6(k, i) \
3836877Sda73024 { ss[6] = ls_box(ss[5], 3) ^ t_use(r, c)[i]; \
3846877Sda73024 ss[0] ^= ss[6]; ss[6] = ff(ss[6]); \
3856877Sda73024 k[v(48, (6 * (i)) + 6)] = ss[6] ^= k[v(48, (6 * (i)))]; \
3866877Sda73024 ss[1] ^= ss[0]; \
3876877Sda73024 k[v(48, (6 * (i)) + 7)] = ss[6] ^= k[v(48, (6 * (i)) + 1)]; \
3886877Sda73024 ss[2] ^= ss[1]; \
3896877Sda73024 k[v(48, (6 * (i)) + 8)] = ss[6] ^= k[v(48, (6 * (i)) + 2)]; \
3906877Sda73024 ss[3] ^= ss[2]; \
3916877Sda73024 k[v(48, (6 * (i)) + 9)] = ss[6] ^= k[v(48, (6 * (i)) + 3)]; \
3926877Sda73024 ss[4] ^= ss[3]; \
3936877Sda73024 k[v(48, (6 * (i)) + 10)] = ss[6] ^= k[v(48, (6 * (i)) + 4)]; \
3946877Sda73024 ss[5] ^= ss[4]; \
3956877Sda73024 k[v(48, (6 * (i)) + 11)] = ss[6] ^= k[v(48, (6 * (i)) + 5)]; \
3966877Sda73024 }
3976877Sda73024
3986877Sda73024 #define kdl6(k, i) \
3996877Sda73024 { ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \
4006877Sda73024 k[v(48, (6 * (i)) + 6)] = ss[0]; \
4016877Sda73024 ss[1] ^= ss[0]; k[v(48, (6 * (i)) + 7)] = ss[1]; \
4026877Sda73024 ss[2] ^= ss[1]; k[v(48, (6 * (i)) + 8)] = ss[2]; \
4036877Sda73024 ss[3] ^= ss[2]; k[v(48, (6 * (i)) + 9)] = ss[3]; \
4046877Sda73024 }
4056877Sda73024
4066877Sda73024 static void
aes_decrypt_key192(const unsigned char * key,uint32_t rk[])4076877Sda73024 aes_decrypt_key192(const unsigned char *key, uint32_t rk[])
4086877Sda73024 {
4096877Sda73024 uint32_t ss[7];
4106877Sda73024 #if defined(d_vars)
4116877Sda73024 d_vars;
4126877Sda73024 #endif
4136877Sda73024 rk[v(48, (0))] = ss[0] = word_in(key, 0);
4146877Sda73024 rk[v(48, (1))] = ss[1] = word_in(key, 1);
4156877Sda73024 rk[v(48, (2))] = ss[2] = word_in(key, 2);
4166877Sda73024 rk[v(48, (3))] = ss[3] = word_in(key, 3);
4176877Sda73024
4186877Sda73024 #ifdef DEC_KS_UNROLL
4196877Sda73024 ss[4] = word_in(key, 4);
4206877Sda73024 rk[v(48, (4))] = ff(ss[4]);
4216877Sda73024 ss[5] = word_in(key, 5);
4226877Sda73024 rk[v(48, (5))] = ff(ss[5]);
4236877Sda73024 kdf6(rk, 0); kd6(rk, 1);
4246877Sda73024 kd6(rk, 2); kd6(rk, 3);
4256877Sda73024 kd6(rk, 4); kd6(rk, 5);
4266877Sda73024 kd6(rk, 6); kdl6(rk, 7);
4276877Sda73024 #else
4286877Sda73024 rk[v(48, (4))] = ss[4] = word_in(key, 4);
4296877Sda73024 rk[v(48, (5))] = ss[5] = word_in(key, 5);
4306877Sda73024 {
4316877Sda73024 uint32_t i;
4326877Sda73024
4336877Sda73024 for (i = 0; i < 7; ++i)
4346877Sda73024 k6e(rk, i);
4356877Sda73024 k6ef(rk, 7);
4366877Sda73024 #if !(DEC_ROUND == NO_TABLES)
4376877Sda73024 for (i = MAX_AES_NB; i < 12 * MAX_AES_NB; ++i)
4386877Sda73024 rk[i] = inv_mcol(rk[i]);
4396877Sda73024 #endif
4406877Sda73024 }
4416877Sda73024 #endif
4426877Sda73024 }
4436877Sda73024
4446877Sda73024
4456877Sda73024
4466877Sda73024 #define k8ef(k, i) \
4476877Sda73024 { k[v(56, (8 * (i)) + 8)] = ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \
4486877Sda73024 k[v(56, (8 * (i)) + 9)] = ss[1] ^= ss[0]; \
4496877Sda73024 k[v(56, (8 * (i)) + 10)] = ss[2] ^= ss[1]; \
4506877Sda73024 k[v(56, (8 * (i)) + 11)] = ss[3] ^= ss[2]; \
4516877Sda73024 }
4526877Sda73024
4536877Sda73024 #define k8e(k, i) \
4546877Sda73024 { k8ef(k, i); \
4556877Sda73024 k[v(56, (8 * (i)) + 12)] = ss[4] ^= ls_box(ss[3], 0); \
4566877Sda73024 k[v(56, (8 * (i)) + 13)] = ss[5] ^= ss[4]; \
4576877Sda73024 k[v(56, (8 * (i)) + 14)] = ss[6] ^= ss[5]; \
4586877Sda73024 k[v(56, (8 * (i)) + 15)] = ss[7] ^= ss[6]; \
4596877Sda73024 }
4606877Sda73024
4616877Sda73024 #define kdf8(k, i) \
4626877Sda73024 { ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \
4636877Sda73024 k[v(56, (8 * (i)) + 8)] = ff(ss[0]); \
4646877Sda73024 ss[1] ^= ss[0]; k[v(56, (8 * (i)) + 9)] = ff(ss[1]); \
4656877Sda73024 ss[2] ^= ss[1]; k[v(56, (8 * (i)) + 10)] = ff(ss[2]); \
4666877Sda73024 ss[3] ^= ss[2]; k[v(56, (8 * (i)) + 11)] = ff(ss[3]); \
4676877Sda73024 ss[4] ^= ls_box(ss[3], 0); k[v(56, (8 * (i)) + 12)] = ff(ss[4]); \
4686877Sda73024 ss[5] ^= ss[4]; k[v(56, (8 * (i)) + 13)] = ff(ss[5]); \
4696877Sda73024 ss[6] ^= ss[5]; k[v(56, (8 * (i)) + 14)] = ff(ss[6]); \
4706877Sda73024 ss[7] ^= ss[6]; k[v(56, (8 * (i)) + 15)] = ff(ss[7]); \
4716877Sda73024 }
4726877Sda73024
4736877Sda73024 #define kd8(k, i) \
4746877Sda73024 { ss[8] = ls_box(ss[7], 3) ^ t_use(r, c)[i]; \
4756877Sda73024 ss[0] ^= ss[8]; \
4766877Sda73024 ss[8] = ff(ss[8]); \
4776877Sda73024 k[v(56, (8 * (i)) + 8)] = ss[8] ^= k[v(56, (8 * (i)))]; \
4786877Sda73024 ss[1] ^= ss[0]; \
4796877Sda73024 k[v(56, (8 * (i)) + 9)] = ss[8] ^= k[v(56, (8 * (i)) + 1)]; \
4806877Sda73024 ss[2] ^= ss[1]; \
4816877Sda73024 k[v(56, (8 * (i)) + 10)] = ss[8] ^= k[v(56, (8 * (i)) + 2)]; \
4826877Sda73024 ss[3] ^= ss[2]; \
4836877Sda73024 k[v(56, (8 * (i)) + 11)] = ss[8] ^= k[v(56, (8 * (i)) + 3)]; \
4846877Sda73024 ss[8] = ls_box(ss[3], 0); \
4856877Sda73024 ss[4] ^= ss[8]; \
4866877Sda73024 ss[8] = ff(ss[8]); \
4876877Sda73024 k[v(56, (8 * (i)) + 12)] = ss[8] ^= k[v(56, (8 * (i)) + 4)]; \
4886877Sda73024 ss[5] ^= ss[4]; \
4896877Sda73024 k[v(56, (8 * (i)) + 13)] = ss[8] ^= k[v(56, (8 * (i)) + 5)]; \
4906877Sda73024 ss[6] ^= ss[5]; \
4916877Sda73024 k[v(56, (8 * (i)) + 14)] = ss[8] ^= k[v(56, (8 * (i)) + 6)]; \
4926877Sda73024 ss[7] ^= ss[6]; \
4936877Sda73024 k[v(56, (8 * (i)) + 15)] = ss[8] ^= k[v(56, (8 * (i)) + 7)]; \
4946877Sda73024 }
4956877Sda73024
4966877Sda73024 #define kdl8(k, i) \
4976877Sda73024 { ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \
4986877Sda73024 k[v(56, (8 * (i)) + 8)] = ss[0]; \
4996877Sda73024 ss[1] ^= ss[0]; k[v(56, (8 * (i)) + 9)] = ss[1]; \
5006877Sda73024 ss[2] ^= ss[1]; k[v(56, (8 * (i)) + 10)] = ss[2]; \
5016877Sda73024 ss[3] ^= ss[2]; k[v(56, (8 * (i)) + 11)] = ss[3]; \
5026877Sda73024 }
5036877Sda73024
5046877Sda73024 static void
aes_decrypt_key256(const unsigned char * key,uint32_t rk[])5056877Sda73024 aes_decrypt_key256(const unsigned char *key, uint32_t rk[])
5066877Sda73024 {
5076877Sda73024 uint32_t ss[9];
5086877Sda73024 #if defined(d_vars)
5096877Sda73024 d_vars;
5106877Sda73024 #endif
5116877Sda73024 rk[v(56, (0))] = ss[0] = word_in(key, 0);
5126877Sda73024 rk[v(56, (1))] = ss[1] = word_in(key, 1);
5136877Sda73024 rk[v(56, (2))] = ss[2] = word_in(key, 2);
5146877Sda73024 rk[v(56, (3))] = ss[3] = word_in(key, 3);
5156877Sda73024
5166877Sda73024 #ifdef DEC_KS_UNROLL
5176877Sda73024 ss[4] = word_in(key, 4);
5186877Sda73024 rk[v(56, (4))] = ff(ss[4]);
5196877Sda73024 ss[5] = word_in(key, 5);
5206877Sda73024 rk[v(56, (5))] = ff(ss[5]);
5216877Sda73024 ss[6] = word_in(key, 6);
5226877Sda73024 rk[v(56, (6))] = ff(ss[6]);
5236877Sda73024 ss[7] = word_in(key, 7);
5246877Sda73024 rk[v(56, (7))] = ff(ss[7]);
5256877Sda73024 kdf8(rk, 0); kd8(rk, 1);
5266877Sda73024 kd8(rk, 2); kd8(rk, 3);
5276877Sda73024 kd8(rk, 4); kd8(rk, 5);
5286877Sda73024 kdl8(rk, 6);
5296877Sda73024 #else
5306877Sda73024 rk[v(56, (4))] = ss[4] = word_in(key, 4);
5316877Sda73024 rk[v(56, (5))] = ss[5] = word_in(key, 5);
5326877Sda73024 rk[v(56, (6))] = ss[6] = word_in(key, 6);
5336877Sda73024 rk[v(56, (7))] = ss[7] = word_in(key, 7);
5346877Sda73024 {
5356877Sda73024 uint32_t i;
5366877Sda73024
5376877Sda73024 for (i = 0; i < 6; ++i)
5386877Sda73024 k8e(rk, i);
5396877Sda73024 k8ef(rk, 6);
5406877Sda73024 #if !(DEC_ROUND == NO_TABLES)
5416877Sda73024 for (i = MAX_AES_NB; i < 14 * MAX_AES_NB; ++i)
5426877Sda73024 rk[i] = inv_mcol(rk[i]);
5436877Sda73024 #endif
5446877Sda73024 }
5456877Sda73024 #endif /* DEC_KS_UNROLL */
5466877Sda73024 }
5476877Sda73024
5486877Sda73024
5496877Sda73024 /*
5506877Sda73024 * Expand the cipher key into the decryption key schedule.
5516877Sda73024 *
5526877Sda73024 * Return the number of rounds for the given cipher key size.
5536877Sda73024 * The size of the key schedule depends on the number of rounds
5546877Sda73024 * (which can be computed from the size of the key), i.e. 4 * (Nr + 1).
5556877Sda73024 *
5566877Sda73024 * Parameters:
5576877Sda73024 * rk AES key schedule 32-bit array to be initialized
5586877Sda73024 * cipherKey User key
5596877Sda73024 * keyBits AES key size (128, 192, or 256 bits)
5606877Sda73024 */
5616877Sda73024 int
rijndael_key_setup_dec_amd64(uint32_t rk[],const uint32_t cipherKey[],int keyBits)562*9392Sopensolaris@drydog.com rijndael_key_setup_dec_amd64(uint32_t rk[], const uint32_t cipherKey[],
563*9392Sopensolaris@drydog.com int keyBits)
5646877Sda73024 {
5656877Sda73024 switch (keyBits) {
5666877Sda73024 case 128:
5676877Sda73024 aes_decrypt_key128((unsigned char *)&cipherKey[0], rk);
5686877Sda73024 return (10);
5696877Sda73024 case 192:
5706877Sda73024 aes_decrypt_key192((unsigned char *)&cipherKey[0], rk);
5716877Sda73024 return (12);
5726877Sda73024 case 256:
5736877Sda73024 aes_decrypt_key256((unsigned char *)&cipherKey[0], rk);
5746877Sda73024 return (14);
5756877Sda73024 default: /* should never get here */
5766877Sda73024 break;
5776877Sda73024 }
5786877Sda73024
5796877Sda73024 return (0);
5806877Sda73024 }
581