Added SILC Thread Queue API
[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_8t b[4];
41 } aes_inf;
42
43 typedef struct {
44   uint_32t ks[KS_LENGTH];
45   aes_inf inf;
46 } aes_encrypt_ctx;
47
48 typedef struct {
49   uint_32t ks[KS_LENGTH];
50   aes_inf inf;
51 } aes_decrypt_ctx;
52
53 typedef struct {
54   union {
55     aes_encrypt_ctx enc;
56     aes_decrypt_ctx dec;
57   } u;
58 } AesContext;
59
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))
65 #define WPOLY   0x011b
66 #define BPOLY     0x1b
67 #define m1  0x80808080
68 #define m2  0x7f7f7f7f
69 #define gf_mulx(x)  ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
70 #define s(x,c) x[c]
71 #define lp32(x)         ((uint_32t*)(x))
72
73 #if defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
74 #define TABLE_ALIGN 32
75 #endif
76
77 #if defined( bswap32 )
78 #define aes_sw32    bswap32
79 #elif defined( bswap_32 )
80 #define aes_sw32    bswap_32
81 #else
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))
84 #endif
85
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))
94 #else
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 */
103
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);                                 \
113 }
114
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))])
120
121 #define vf1(x,r,c)  (x)
122 #define rf1(r,c)    (r)
123 #define rf2(r,c)    ((8+r-c)&3)
124
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)
129
130 #define ff(x)   inv_mcol(x)
131 #if defined( dec_imvars )
132 #define d_vars  dec_imvars
133 #endif
134
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) }
168
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) }
202
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) }
236
237 #define rc_data(w) {\
238     w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
239     w(0x1b), w(0x36) }
240
241 #define h0(x)   (x)
242
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)
247
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))
252
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))
257
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))
267
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
271
272 #if defined(_MSC_VER) && defined(TABLE_ALIGN)
273 #define ALIGN __declspec(align(TABLE_ALIGN))
274 #else
275 #define ALIGN
276 #endif
277
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]);
288
289 #endif /* RIJNGDAEL_INTERNAL */