1 /* ---------------------------------------------------------------------------
2 Copyright (c) 1998-2006, Brian Gladman, Worcester, UK. All rights reserved.
6 The free distribution and use of this software in both source and binary
7 form is allowed (with or without changes) provided that:
9 1. distributions of this source code include the above copyright
10 notice, this list of conditions and the following disclaimer;
12 2. distributions in binary form include the above copyright
13 notice, this list of conditions and the following disclaimer
14 in the documentation and/or other associated materials;
16 3. the copyright holder's name is not used to endorse products
17 built using this software without specific written permission.
19 ALTERNATIVELY, provided that this notice is retained in full, this product
20 may be distributed under the terms of the GNU General Public License (GPL),
21 in which case the provisions of the GPL apply INSTEAD OF those given above.
25 This software is provided 'as is' with no explicit or implied warranties
26 in respect of its properties, including, but not limited to, correctness
27 and/or fitness for purpose.
28 ---------------------------------------------------------------------------
32 #ifndef RIJNDAEL_INTERNAL_H
33 #define RIJNDAEL_INTERNAL_H
35 #include "ciphers_def.h"
44 uint_32t ks[KS_LENGTH];
49 uint_32t ks[KS_LENGTH];
60 #define AES_RETURN void
61 #define AES_REV_DKS /* define to reverse decryption key schedule */
62 #define AES_BLOCK_SIZE 16 /* the AES block size in bytes */
63 #define N_COLS 4 /* the number of columns in the state */
64 #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
69 #define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
71 #define lp32(x) ((uint_32t*)(x))
73 #if defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
74 #define TABLE_ALIGN 32
77 #if defined( bswap32 )
78 #define aes_sw32 bswap32
79 #elif defined( bswap_32 )
80 #define aes_sw32 bswap_32
82 #define brot(x,n) (((uint_32t)(x) << n) | ((uint_32t)(x) >> (32 - n)))
83 #define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
86 #ifdef WORDS_BIGENDIAN
87 #define upr(x,n) (((uint_32t)(x) >> (8 * (n))) | \
88 ((uint_32t)(x) << (32 - 8 * (n))))
89 #define ups(x,n) ((uint_32t) (x) >> (8 * (n)))
90 #define bval(x,n) ((uint_8t)((x) >> (24 - 8 * (n))))
91 #define bytes2word(b0, b1, b2, b3) (((uint_32t)(b0) << 24) | \
92 ((uint_32t)(b1) << 16) | \
93 ((uint_32t)(b2) << 8) | (b3))
95 #define upr(x,n) (((uint_32t)(x) << (8 * (n))) | \
96 ((uint_32t)(x) >> (32 - 8 * (n))))
97 #define ups(x,n) ((uint_32t) (x) << (8 * (n)))
98 #define bval(x,n) ((uint_8t)((x) >> (8 * (n))))
99 #define bytes2word(b0, b1, b2, b3) (((uint_32t)(b3) << 24) | \
100 ((uint_32t)(b2) << 16) | \
101 ((uint_32t)(b1) << 8) | (b0))
102 #endif /* WORDS_BIGENDIAN */
104 #define word_in(x,c) bytes2word(((const uint_8t*)(x)+4*c)[0], \
105 ((const uint_8t*)(x)+4*c)[1], \
106 ((const uint_8t*)(x)+4*c)[2], \
107 ((const uint_8t*)(x)+4*c)[3])
108 #define word_out(x,c,v) { \
109 ((uint_8t*)(x)+4*c)[0] = bval(v,0); \
110 ((uint_8t*)(x)+4*c)[1] = bval(v,1); \
111 ((uint_8t*)(x)+4*c)[2] = bval(v,2); \
112 ((uint_8t*)(x)+4*c)[3] = bval(v,3); \
115 #define four_tables(x,tab,vf,rf,c) \
116 ( tab[0][bval(vf(x,0,c),rf(0,c))] \
117 ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
118 ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
119 ^ tab[3][bval(vf(x,3,c),rf(3,c))])
121 #define vf1(x,r,c) (x)
123 #define rf2(r,c) ((8+r-c)&3)
125 #define dec_fmvars uint_32t g2
126 #define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
127 #define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0)
128 #define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c)
130 #define ff(x) inv_mcol(x)
131 #if defined( dec_imvars )
132 #define d_vars dec_imvars
135 #define sb_data(w) {\
136 w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
137 w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
138 w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
139 w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
140 w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
141 w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
142 w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
143 w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
144 w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
145 w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
146 w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
147 w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
148 w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
149 w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
150 w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
151 w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
152 w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
153 w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
154 w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
155 w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
156 w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
157 w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
158 w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
159 w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
160 w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
161 w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
162 w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
163 w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
164 w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
165 w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
166 w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
167 w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
169 #define isb_data(w) {\
170 w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
171 w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
172 w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
173 w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
174 w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
175 w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
176 w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
177 w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
178 w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
179 w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
180 w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
181 w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
182 w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
183 w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
184 w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
185 w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
186 w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
187 w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
188 w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
189 w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
190 w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
191 w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
192 w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
193 w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
194 w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
195 w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
196 w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
197 w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
198 w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
199 w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
200 w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
201 w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }
203 #define mm_data(w) {\
204 w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
205 w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
206 w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
207 w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
208 w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
209 w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
210 w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
211 w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
212 w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
213 w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
214 w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
215 w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
216 w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
217 w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
218 w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
219 w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
220 w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
221 w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
222 w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
223 w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
224 w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
225 w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
226 w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
227 w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
228 w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
229 w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
230 w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
231 w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
232 w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
233 w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
234 w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
235 w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }
237 #define rc_data(w) {\
238 w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
243 #define w0(p) bytes2word(p, 0, 0, 0)
244 #define w1(p) bytes2word(0, p, 0, 0)
245 #define w2(p) bytes2word(0, 0, p, 0)
246 #define w3(p) bytes2word(0, 0, 0, p)
248 #define u0(p) bytes2word(f2(p), p, p, f3(p))
249 #define u1(p) bytes2word(f3(p), f2(p), p, p)
250 #define u2(p) bytes2word(p, f3(p), f2(p), p)
251 #define u3(p) bytes2word(p, p, f3(p), f2(p))
253 #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
254 #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
255 #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
256 #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
258 #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
259 #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
260 #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
261 ^ (((x>>5) & 4) * WPOLY))
262 #define f3(x) (f2(x) ^ x)
263 #define f9(x) (f8(x) ^ x)
264 #define fb(x) (f8(x) ^ f2(x) ^ x)
265 #define fd(x) (f8(x) ^ f4(x) ^ x)
266 #define fe(x) (f8(x) ^ f4(x) ^ f2(x))
268 #define t_dec(m,n) t_##m##n
269 #define t_set(m,n) t_##m##n
270 #define t_use(m,n) t_##m##n
272 #if defined(_MSC_VER) && defined(TABLE_ALIGN)
273 #define ALIGN __declspec(align(TABLE_ALIGN))
278 AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
279 AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
280 AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
281 AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]);
282 AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]);
283 AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
284 AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
285 AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
286 AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]);
287 AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]);
289 #endif /* RIJNGDAEL_INTERNAL */