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