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