xref: /onnv-gate/usr/src/common/crypto/aes/amd64/aeskey.c (revision 9392:7b19cd0bbccc)
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