1/*
2 ---------------------------------------------------------------------------
3 Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
4
5 LICENSE TERMS
6
7 The redistribution and use of this software (with or without changes)
8 is allowed without the payment of fees or royalties provided that:
9
10  1. source code distributions include the above copyright notice, this
11     list of conditions and the following disclaimer;
12
13  2. binary distributions include the above copyright notice, this list
14     of conditions and the following disclaimer in their documentation;
15
16  3. the name of the copyright holder is not used to endorse products
17     built using this software without specific written permission.
18
19 DISCLAIMER
20
21 This software is provided 'as is' with no explicit or implied warranties
22 in respect of its properties, including, but not limited to, correctness
23 and/or fitness for purpose.
24 ---------------------------------------------------------------------------
25 Issue 09/09/2006
26
27 This is an AES implementation that uses only 8-bit byte operations on the
28 cipher state (there are options to use 32-bit types if available).
29
30 The combination of mix columns and byte substitution used here is based on
31 that developed by Karl Malbrain. His contribution is acknowledged.
32 */
33
34/* define if you have a fast memcpy function on your system */
35#if 1
36#  define HAVE_MEMCPY
37#  include <string.h>
38#if 0
39#  if defined( _MSC_VER )
40#    include <intrin.h>
41#    pragma intrinsic( memcpy )
42#  endif
43#endif
44#endif
45
46#include <stdlib.h>
47
48/* add the target configuration to allow using internal data types and compilation options */
49#include "bt_target.h"
50
51/* define if you have fast 32-bit types on your system */
52#if 1
53#  define HAVE_UINT_32T
54#endif
55
56/* define if you don't want any tables */
57#if 1
58#  define USE_TABLES
59#endif
60
61/*  On Intel Core 2 duo VERSION_1 is faster */
62
63/* alternative versions (test for performance on your system) */
64#if 1
65#  define VERSION_1
66#endif
67
68#include "aes.h"
69
70#if defined( HAVE_UINT_32T )
71  typedef UINT32 uint_32t;
72#endif
73
74/* functions for finite field multiplication in the AES Galois field    */
75
76#define WPOLY   0x011b
77#define BPOLY     0x1b
78#define DPOLY   0x008d
79
80#define f1(x)   (x)
81#define f2(x)   ((x << 1) ^ (((x >> 7) & 1) * WPOLY))
82#define f4(x)   ((x << 2) ^ (((x >> 6) & 1) * WPOLY) ^ (((x >> 6) & 2) * WPOLY))
83#define f8(x)   ((x << 3) ^ (((x >> 5) & 1) * WPOLY) ^ (((x >> 5) & 2) * WPOLY) \
84                          ^ (((x >> 5) & 4) * WPOLY))
85#define d2(x)   (((x) >> 1) ^ ((x) & 1 ? DPOLY : 0))
86
87#define f3(x)   (f2(x) ^ x)
88#define f9(x)   (f8(x) ^ x)
89#define fb(x)   (f8(x) ^ f2(x) ^ x)
90#define fd(x)   (f8(x) ^ f4(x) ^ x)
91#define fe(x)   (f8(x) ^ f4(x) ^ f2(x))
92
93#if defined( USE_TABLES )
94
95#define sb_data(w) {    /* S Box data values */                            \
96    w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
97    w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
98    w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
99    w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
100    w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
101    w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
102    w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
103    w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
104    w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
105    w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
106    w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
107    w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
108    w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
109    w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
110    w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
111    w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
112    w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
113    w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
114    w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
115    w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
116    w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
117    w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
118    w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
119    w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
120    w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
121    w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
122    w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
123    w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
124    w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
125    w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
126    w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
127    w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }
128
129#define isb_data(w) {   /* inverse S Box data values */                    \
130    w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
131    w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
132    w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
133    w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
134    w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
135    w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
136    w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
137    w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
138    w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
139    w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
140    w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
141    w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
142    w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
143    w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
144    w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
145    w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
146    w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
147    w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
148    w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
149    w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
150    w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
151    w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
152    w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
153    w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
154    w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
155    w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
156    w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
157    w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
158    w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
159    w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
160    w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
161    w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }
162
163#define mm_data(w) {    /* basic data for forming finite field tables */   \
164    w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
165    w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
166    w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
167    w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
168    w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
169    w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
170    w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
171    w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
172    w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
173    w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
174    w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
175    w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
176    w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
177    w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
178    w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
179    w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
180    w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
181    w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
182    w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
183    w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
184    w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
185    w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
186    w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
187    w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
188    w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
189    w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
190    w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
191    w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
192    w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
193    w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
194    w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
195    w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }
196
197static const uint_8t sbox[256]  =  sb_data(f1);
198static const uint_8t isbox[256] = isb_data(f1);
199
200static const uint_8t gfm2_sbox[256] = sb_data(f2);
201static const uint_8t gfm3_sbox[256] = sb_data(f3);
202
203static const uint_8t gfmul_9[256] = mm_data(f9);
204static const uint_8t gfmul_b[256] = mm_data(fb);
205static const uint_8t gfmul_d[256] = mm_data(fd);
206static const uint_8t gfmul_e[256] = mm_data(fe);
207
208#define s_box(x)     sbox[(x)]
209#define is_box(x)    isbox[(x)]
210#define gfm2_sb(x)   gfm2_sbox[(x)]
211#define gfm3_sb(x)   gfm3_sbox[(x)]
212#define gfm_9(x)     gfmul_9[(x)]
213#define gfm_b(x)     gfmul_b[(x)]
214#define gfm_d(x)     gfmul_d[(x)]
215#define gfm_e(x)     gfmul_e[(x)]
216
217#else
218
219/* this is the high bit of x right shifted by 1 */
220/* position. Since the starting polynomial has  */
221/* 9 bits (0x11b), this right shift keeps the   */
222/* values of all top bits within a byte         */
223
224static uint_8t hibit(const uint_8t x)
225{   uint_8t r = (uint_8t)((x >> 1) | (x >> 2));
226
227    r |= (r >> 2);
228    r |= (r >> 4);
229    return (r + 1) >> 1;
230}
231
232/* return the inverse of the finite field element x */
233
234static uint_8t gf_inv(const uint_8t x)
235{   uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
236
237    if(x < 2)
238        return x;
239
240    for( ; ; )
241    {
242        if(n1)
243            while(n2 >= n1)             /* divide polynomial p2 by p1    */
244            {
245                n2 /= n1;               /* shift smaller polynomial left */
246                p2 ^= (p1 * n2) & 0xff; /* and remove from larger one    */
247                v2 ^= (v1 * n2);        /* shift accumulated value and   */
248                n2 = hibit(p2);         /* add into result               */
249            }
250        else
251            return v1;
252
253        if(n2)                          /* repeat with values swapped    */
254            while(n1 >= n2)
255            {
256                n1 /= n2;
257                p1 ^= p2 * n1;
258                v1 ^= v2 * n1;
259                n1 = hibit(p1);
260            }
261        else
262            return v2;
263    }
264}
265
266/* The forward and inverse affine transformations used in the S-box */
267uint_8t fwd_affine(const uint_8t x)
268{
269#if defined( HAVE_UINT_32T )
270    uint_32t w = x;
271    w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
272    return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
273#else
274    return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4)
275                    ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4);
276#endif
277}
278
279uint_8t inv_affine(const uint_8t x)
280{
281#if defined( HAVE_UINT_32T )
282    uint_32t w = x;
283    w = (w << 1) ^ (w << 3) ^ (w << 6);
284    return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
285#else
286    return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6)
287                ^ (x >> 7) ^ (x >> 5) ^ (x >> 2);
288#endif
289}
290
291#define s_box(x)   fwd_affine(gf_inv(x))
292#define is_box(x)  gf_inv(inv_affine(x))
293#define gfm2_sb(x) f2(s_box(x))
294#define gfm3_sb(x) f3(s_box(x))
295#define gfm_9(x)   f9(x)
296#define gfm_b(x)   fb(x)
297#define gfm_d(x)   fd(x)
298#define gfm_e(x)   fe(x)
299
300#endif
301
302#if defined( HAVE_MEMCPY )
303#  define block_copy_nn(d, s, l)    memcpy(d, s, l)
304#  define block_copy(d, s)          memcpy(d, s, N_BLOCK)
305#else
306#  define block_copy_nn(d, s, l)    copy_block_nn(d, s, l)
307#  define block_copy(d, s)          copy_block(d, s)
308#endif
309
310#if !defined( HAVE_MEMCPY )
311static void copy_block( void *d, const void *s )
312{
313#if defined( HAVE_UINT_32T )
314    ((uint_32t*)d)[ 0] = ((uint_32t*)s)[ 0];
315    ((uint_32t*)d)[ 1] = ((uint_32t*)s)[ 1];
316    ((uint_32t*)d)[ 2] = ((uint_32t*)s)[ 2];
317    ((uint_32t*)d)[ 3] = ((uint_32t*)s)[ 3];
318#else
319    ((uint_8t*)d)[ 0] = ((uint_8t*)s)[ 0];
320    ((uint_8t*)d)[ 1] = ((uint_8t*)s)[ 1];
321    ((uint_8t*)d)[ 2] = ((uint_8t*)s)[ 2];
322    ((uint_8t*)d)[ 3] = ((uint_8t*)s)[ 3];
323    ((uint_8t*)d)[ 4] = ((uint_8t*)s)[ 4];
324    ((uint_8t*)d)[ 5] = ((uint_8t*)s)[ 5];
325    ((uint_8t*)d)[ 6] = ((uint_8t*)s)[ 6];
326    ((uint_8t*)d)[ 7] = ((uint_8t*)s)[ 7];
327    ((uint_8t*)d)[ 8] = ((uint_8t*)s)[ 8];
328    ((uint_8t*)d)[ 9] = ((uint_8t*)s)[ 9];
329    ((uint_8t*)d)[10] = ((uint_8t*)s)[10];
330    ((uint_8t*)d)[11] = ((uint_8t*)s)[11];
331    ((uint_8t*)d)[12] = ((uint_8t*)s)[12];
332    ((uint_8t*)d)[13] = ((uint_8t*)s)[13];
333    ((uint_8t*)d)[14] = ((uint_8t*)s)[14];
334    ((uint_8t*)d)[15] = ((uint_8t*)s)[15];
335#endif
336}
337
338static void copy_block_nn( void * d, const void *s, uint_8t nn )
339{
340    while( nn-- )
341        *((uint_8t*)d)++ = *((uint_8t*)s)++;
342}
343#endif
344
345static void xor_block( void *d, const void *s )
346{
347#if defined( HAVE_UINT_32T )
348    ((uint_32t*)d)[ 0] ^= ((uint_32t*)s)[ 0];
349    ((uint_32t*)d)[ 1] ^= ((uint_32t*)s)[ 1];
350    ((uint_32t*)d)[ 2] ^= ((uint_32t*)s)[ 2];
351    ((uint_32t*)d)[ 3] ^= ((uint_32t*)s)[ 3];
352#else
353    ((uint_8t*)d)[ 0] ^= ((uint_8t*)s)[ 0];
354    ((uint_8t*)d)[ 1] ^= ((uint_8t*)s)[ 1];
355    ((uint_8t*)d)[ 2] ^= ((uint_8t*)s)[ 2];
356    ((uint_8t*)d)[ 3] ^= ((uint_8t*)s)[ 3];
357    ((uint_8t*)d)[ 4] ^= ((uint_8t*)s)[ 4];
358    ((uint_8t*)d)[ 5] ^= ((uint_8t*)s)[ 5];
359    ((uint_8t*)d)[ 6] ^= ((uint_8t*)s)[ 6];
360    ((uint_8t*)d)[ 7] ^= ((uint_8t*)s)[ 7];
361    ((uint_8t*)d)[ 8] ^= ((uint_8t*)s)[ 8];
362    ((uint_8t*)d)[ 9] ^= ((uint_8t*)s)[ 9];
363    ((uint_8t*)d)[10] ^= ((uint_8t*)s)[10];
364    ((uint_8t*)d)[11] ^= ((uint_8t*)s)[11];
365    ((uint_8t*)d)[12] ^= ((uint_8t*)s)[12];
366    ((uint_8t*)d)[13] ^= ((uint_8t*)s)[13];
367    ((uint_8t*)d)[14] ^= ((uint_8t*)s)[14];
368    ((uint_8t*)d)[15] ^= ((uint_8t*)s)[15];
369#endif
370}
371
372static void copy_and_key( void *d, const void *s, const void *k )
373{
374#if defined( HAVE_UINT_32T )
375    ((uint_32t*)d)[ 0] = ((uint_32t*)s)[ 0] ^ ((uint_32t*)k)[ 0];
376    ((uint_32t*)d)[ 1] = ((uint_32t*)s)[ 1] ^ ((uint_32t*)k)[ 1];
377    ((uint_32t*)d)[ 2] = ((uint_32t*)s)[ 2] ^ ((uint_32t*)k)[ 2];
378    ((uint_32t*)d)[ 3] = ((uint_32t*)s)[ 3] ^ ((uint_32t*)k)[ 3];
379#elif 1
380    ((uint_8t*)d)[ 0] = ((uint_8t*)s)[ 0] ^ ((uint_8t*)k)[ 0];
381    ((uint_8t*)d)[ 1] = ((uint_8t*)s)[ 1] ^ ((uint_8t*)k)[ 1];
382    ((uint_8t*)d)[ 2] = ((uint_8t*)s)[ 2] ^ ((uint_8t*)k)[ 2];
383    ((uint_8t*)d)[ 3] = ((uint_8t*)s)[ 3] ^ ((uint_8t*)k)[ 3];
384    ((uint_8t*)d)[ 4] = ((uint_8t*)s)[ 4] ^ ((uint_8t*)k)[ 4];
385    ((uint_8t*)d)[ 5] = ((uint_8t*)s)[ 5] ^ ((uint_8t*)k)[ 5];
386    ((uint_8t*)d)[ 6] = ((uint_8t*)s)[ 6] ^ ((uint_8t*)k)[ 6];
387    ((uint_8t*)d)[ 7] = ((uint_8t*)s)[ 7] ^ ((uint_8t*)k)[ 7];
388    ((uint_8t*)d)[ 8] = ((uint_8t*)s)[ 8] ^ ((uint_8t*)k)[ 8];
389    ((uint_8t*)d)[ 9] = ((uint_8t*)s)[ 9] ^ ((uint_8t*)k)[ 9];
390    ((uint_8t*)d)[10] = ((uint_8t*)s)[10] ^ ((uint_8t*)k)[10];
391    ((uint_8t*)d)[11] = ((uint_8t*)s)[11] ^ ((uint_8t*)k)[11];
392    ((uint_8t*)d)[12] = ((uint_8t*)s)[12] ^ ((uint_8t*)k)[12];
393    ((uint_8t*)d)[13] = ((uint_8t*)s)[13] ^ ((uint_8t*)k)[13];
394    ((uint_8t*)d)[14] = ((uint_8t*)s)[14] ^ ((uint_8t*)k)[14];
395    ((uint_8t*)d)[15] = ((uint_8t*)s)[15] ^ ((uint_8t*)k)[15];
396#else
397    block_copy(d, s);
398    xor_block(d, k);
399#endif
400}
401
402static void add_round_key( uint_8t d[N_BLOCK], const uint_8t k[N_BLOCK] )
403{
404    xor_block(d, k);
405}
406
407static void shift_sub_rows( uint_8t st[N_BLOCK] )
408{   uint_8t tt;
409
410    st[ 0] = s_box(st[ 0]); st[ 4] = s_box(st[ 4]);
411    st[ 8] = s_box(st[ 8]); st[12] = s_box(st[12]);
412
413    tt = st[1]; st[ 1] = s_box(st[ 5]); st[ 5] = s_box(st[ 9]);
414    st[ 9] = s_box(st[13]); st[13] = s_box( tt );
415
416    tt = st[2]; st[ 2] = s_box(st[10]); st[10] = s_box( tt );
417    tt = st[6]; st[ 6] = s_box(st[14]); st[14] = s_box( tt );
418
419    tt = st[15]; st[15] = s_box(st[11]); st[11] = s_box(st[ 7]);
420    st[ 7] = s_box(st[ 3]); st[ 3] = s_box( tt );
421}
422
423static void inv_shift_sub_rows( uint_8t st[N_BLOCK] )
424{   uint_8t tt;
425
426    st[ 0] = is_box(st[ 0]); st[ 4] = is_box(st[ 4]);
427    st[ 8] = is_box(st[ 8]); st[12] = is_box(st[12]);
428
429    tt = st[13]; st[13] = is_box(st[9]); st[ 9] = is_box(st[5]);
430    st[ 5] = is_box(st[1]); st[ 1] = is_box( tt );
431
432    tt = st[2]; st[ 2] = is_box(st[10]); st[10] = is_box( tt );
433    tt = st[6]; st[ 6] = is_box(st[14]); st[14] = is_box( tt );
434
435    tt = st[3]; st[ 3] = is_box(st[ 7]); st[ 7] = is_box(st[11]);
436    st[11] = is_box(st[15]); st[15] = is_box( tt );
437}
438
439#if defined( VERSION_1 )
440  static void mix_sub_columns( uint_8t dt[N_BLOCK] )
441  { uint_8t st[N_BLOCK];
442    block_copy(st, dt);
443#else
444  static void mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] )
445  {
446#endif
447    dt[ 0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]);
448    dt[ 1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]);
449    dt[ 2] = s_box(st[0]) ^ s_box(st[5]) ^ gfm2_sb(st[10]) ^ gfm3_sb(st[15]);
450    dt[ 3] = gfm3_sb(st[0]) ^ s_box(st[5]) ^ s_box(st[10]) ^ gfm2_sb(st[15]);
451
452    dt[ 4] = gfm2_sb(st[4]) ^ gfm3_sb(st[9]) ^ s_box(st[14]) ^ s_box(st[3]);
453    dt[ 5] = s_box(st[4]) ^ gfm2_sb(st[9]) ^ gfm3_sb(st[14]) ^ s_box(st[3]);
454    dt[ 6] = s_box(st[4]) ^ s_box(st[9]) ^ gfm2_sb(st[14]) ^ gfm3_sb(st[3]);
455    dt[ 7] = gfm3_sb(st[4]) ^ s_box(st[9]) ^ s_box(st[14]) ^ gfm2_sb(st[3]);
456
457    dt[ 8] = gfm2_sb(st[8]) ^ gfm3_sb(st[13]) ^ s_box(st[2]) ^ s_box(st[7]);
458    dt[ 9] = s_box(st[8]) ^ gfm2_sb(st[13]) ^ gfm3_sb(st[2]) ^ s_box(st[7]);
459    dt[10] = s_box(st[8]) ^ s_box(st[13]) ^ gfm2_sb(st[2]) ^ gfm3_sb(st[7]);
460    dt[11] = gfm3_sb(st[8]) ^ s_box(st[13]) ^ s_box(st[2]) ^ gfm2_sb(st[7]);
461
462    dt[12] = gfm2_sb(st[12]) ^ gfm3_sb(st[1]) ^ s_box(st[6]) ^ s_box(st[11]);
463    dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]);
464    dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]);
465    dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]);
466  }
467
468#if defined( VERSION_1 )
469  static void inv_mix_sub_columns( uint_8t dt[N_BLOCK] )
470  { uint_8t st[N_BLOCK];
471    block_copy(st, dt);
472#else
473  static void inv_mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] )
474  {
475#endif
476    dt[ 0] = is_box(gfm_e(st[ 0]) ^ gfm_b(st[ 1]) ^ gfm_d(st[ 2]) ^ gfm_9(st[ 3]));
477    dt[ 5] = is_box(gfm_9(st[ 0]) ^ gfm_e(st[ 1]) ^ gfm_b(st[ 2]) ^ gfm_d(st[ 3]));
478    dt[10] = is_box(gfm_d(st[ 0]) ^ gfm_9(st[ 1]) ^ gfm_e(st[ 2]) ^ gfm_b(st[ 3]));
479    dt[15] = is_box(gfm_b(st[ 0]) ^ gfm_d(st[ 1]) ^ gfm_9(st[ 2]) ^ gfm_e(st[ 3]));
480
481    dt[ 4] = is_box(gfm_e(st[ 4]) ^ gfm_b(st[ 5]) ^ gfm_d(st[ 6]) ^ gfm_9(st[ 7]));
482    dt[ 9] = is_box(gfm_9(st[ 4]) ^ gfm_e(st[ 5]) ^ gfm_b(st[ 6]) ^ gfm_d(st[ 7]));
483    dt[14] = is_box(gfm_d(st[ 4]) ^ gfm_9(st[ 5]) ^ gfm_e(st[ 6]) ^ gfm_b(st[ 7]));
484    dt[ 3] = is_box(gfm_b(st[ 4]) ^ gfm_d(st[ 5]) ^ gfm_9(st[ 6]) ^ gfm_e(st[ 7]));
485
486    dt[ 8] = is_box(gfm_e(st[ 8]) ^ gfm_b(st[ 9]) ^ gfm_d(st[10]) ^ gfm_9(st[11]));
487    dt[13] = is_box(gfm_9(st[ 8]) ^ gfm_e(st[ 9]) ^ gfm_b(st[10]) ^ gfm_d(st[11]));
488    dt[ 2] = is_box(gfm_d(st[ 8]) ^ gfm_9(st[ 9]) ^ gfm_e(st[10]) ^ gfm_b(st[11]));
489    dt[ 7] = is_box(gfm_b(st[ 8]) ^ gfm_d(st[ 9]) ^ gfm_9(st[10]) ^ gfm_e(st[11]));
490
491    dt[12] = is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15]));
492    dt[ 1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15]));
493    dt[ 6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15]));
494    dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15]));
495  }
496
497#if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED )
498
499/*  Set the cipher key for the pre-keyed version */
500/*  NOTE: If the length_type used for the key length is an
501    unsigned 8-bit character, a key length of 256 bits must
502    be entered as a length in bytes (valid inputs are hence
503    128, 192, 16, 24 and 32).
504*/
505
506return_type aes_set_key( const unsigned char key[], length_type keylen, aes_context ctx[1] )
507{
508    uint_8t cc, rc, hi;
509
510    switch( keylen )
511    {
512    case 16:
513    case 128:           /* length in bits (128 = 8*16) */
514        keylen = 16;
515        break;
516    case 24:
517    case 192:           /* length in bits (192 = 8*24) */
518        keylen = 24;
519        break;
520    case 32:
521/*    case 256:           length in bits (256 = 8*32) */
522        keylen = 32;
523        break;
524    default:
525        ctx->rnd = 0;
526        return (return_type)-1;
527    }
528    block_copy_nn(ctx->ksch, key, keylen);
529    hi = (keylen + 28) << 2;
530    ctx->rnd = (hi >> 4) - 1;
531    for( cc = keylen, rc = 1; cc < hi; cc += 4 )
532    {   uint_8t tt, t0, t1, t2, t3;
533
534        t0 = ctx->ksch[cc - 4];
535        t1 = ctx->ksch[cc - 3];
536        t2 = ctx->ksch[cc - 2];
537        t3 = ctx->ksch[cc - 1];
538        if( cc % keylen == 0 )
539        {
540            tt = t0;
541            t0 = s_box(t1) ^ rc;
542            t1 = s_box(t2);
543            t2 = s_box(t3);
544            t3 = s_box(tt);
545            rc = f2(rc);
546        }
547        else if( keylen > 24 && cc % keylen == 16 )
548        {
549            t0 = s_box(t0);
550            t1 = s_box(t1);
551            t2 = s_box(t2);
552            t3 = s_box(t3);
553        }
554        tt = cc - keylen;
555        ctx->ksch[cc + 0] = ctx->ksch[tt + 0] ^ t0;
556        ctx->ksch[cc + 1] = ctx->ksch[tt + 1] ^ t1;
557        ctx->ksch[cc + 2] = ctx->ksch[tt + 2] ^ t2;
558        ctx->ksch[cc + 3] = ctx->ksch[tt + 3] ^ t3;
559    }
560    return 0;
561}
562
563#endif
564
565#if defined( AES_ENC_PREKEYED )
566
567/*  Encrypt a single block of 16 bytes */
568
569return_type aes_encrypt( const unsigned char in[N_BLOCK], unsigned char  out[N_BLOCK], const aes_context ctx[1] )
570{
571    if( ctx->rnd )
572    {
573        uint_8t s1[N_BLOCK], r;
574        copy_and_key( s1, in, ctx->ksch );
575
576        for( r = 1 ; r < ctx->rnd ; ++r )
577#if defined( VERSION_1 )
578        {
579            mix_sub_columns( s1 );
580            add_round_key( s1, ctx->ksch + r * N_BLOCK);
581        }
582#else
583        {   uint_8t s2[N_BLOCK];
584            mix_sub_columns( s2, s1 );
585            copy_and_key( s1, s2, ctx->ksch + r * N_BLOCK);
586        }
587#endif
588        shift_sub_rows( s1 );
589        copy_and_key( out, s1, ctx->ksch + r * N_BLOCK );
590    }
591    else
592        return (return_type)-1;
593    return 0;
594}
595
596/* CBC encrypt a number of blocks (input and return an IV) */
597
598return_type aes_cbc_encrypt( const unsigned char *in, unsigned char *out,
599                         int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] )
600{
601
602    while(n_block--)
603    {
604        xor_block(iv, in);
605        if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS)
606			return EXIT_FAILURE;
607        memcpy(out, iv, N_BLOCK);
608        in += N_BLOCK;
609        out += N_BLOCK;
610    }
611    return EXIT_SUCCESS;
612}
613
614#endif
615
616#if defined( AES_DEC_PREKEYED )
617
618/*  Decrypt a single block of 16 bytes */
619
620return_type aes_decrypt( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1] )
621{
622    if( ctx->rnd )
623    {
624        uint_8t s1[N_BLOCK], r;
625        copy_and_key( s1, in, ctx->ksch + ctx->rnd * N_BLOCK );
626        inv_shift_sub_rows( s1 );
627
628        for( r = ctx->rnd ; --r ; )
629#if defined( VERSION_1 )
630        {
631            add_round_key( s1, ctx->ksch + r * N_BLOCK );
632            inv_mix_sub_columns( s1 );
633        }
634#else
635        {   uint_8t s2[N_BLOCK];
636            copy_and_key( s2, s1, ctx->ksch + r * N_BLOCK );
637            inv_mix_sub_columns( s1, s2 );
638        }
639#endif
640        copy_and_key( out, s1, ctx->ksch );
641    }
642    else
643        return (return_type)-1;
644    return 0;
645}
646
647/* CBC decrypt a number of blocks (input and return an IV) */
648
649return_type aes_cbc_decrypt( const unsigned char *in, unsigned char *out,
650                         int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] )
651{
652    while(n_block--)
653    {   uint_8t tmp[N_BLOCK];
654
655        memcpy(tmp, in, N_BLOCK);
656        if(aes_decrypt(in, out, ctx) != EXIT_SUCCESS)
657			return EXIT_FAILURE;
658        xor_block(out, iv);
659        memcpy(iv, tmp, N_BLOCK);
660        in += N_BLOCK;
661        out += N_BLOCK;
662    }
663    return EXIT_SUCCESS;
664}
665
666#endif
667
668#if defined( AES_ENC_128_OTFK )
669
670/*  The 'on the fly' encryption key update for for 128 bit keys */
671
672static void update_encrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc )
673{   uint_8t cc;
674
675    k[0] ^= s_box(k[13]) ^ *rc;
676    k[1] ^= s_box(k[14]);
677    k[2] ^= s_box(k[15]);
678    k[3] ^= s_box(k[12]);
679    *rc = f2( *rc );
680
681    for(cc = 4; cc < 16; cc += 4 )
682    {
683        k[cc + 0] ^= k[cc - 4];
684        k[cc + 1] ^= k[cc - 3];
685        k[cc + 2] ^= k[cc - 2];
686        k[cc + 3] ^= k[cc - 1];
687    }
688}
689
690/*  Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */
691
692void aes_encrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
693                     const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] )
694{   uint_8t s1[N_BLOCK], r, rc = 1;
695
696    if(o_key != key)
697        block_copy( o_key, key );
698    copy_and_key( s1, in, o_key );
699
700    for( r = 1 ; r < 10 ; ++r )
701#if defined( VERSION_1 )
702    {
703        mix_sub_columns( s1 );
704        update_encrypt_key_128( o_key, &rc );
705        add_round_key( s1, o_key );
706    }
707#else
708    {   uint_8t s2[N_BLOCK];
709        mix_sub_columns( s2, s1 );
710        update_encrypt_key_128( o_key, &rc );
711        copy_and_key( s1, s2, o_key );
712    }
713#endif
714
715    shift_sub_rows( s1 );
716    update_encrypt_key_128( o_key, &rc );
717    copy_and_key( out, s1, o_key );
718}
719
720#endif
721
722#if defined( AES_DEC_128_OTFK )
723
724/*  The 'on the fly' decryption key update for for 128 bit keys */
725
726static void update_decrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc )
727{   uint_8t cc;
728
729    for( cc = 12; cc > 0; cc -= 4 )
730    {
731        k[cc + 0] ^= k[cc - 4];
732        k[cc + 1] ^= k[cc - 3];
733        k[cc + 2] ^= k[cc - 2];
734        k[cc + 3] ^= k[cc - 1];
735    }
736    *rc = d2(*rc);
737    k[0] ^= s_box(k[13]) ^ *rc;
738    k[1] ^= s_box(k[14]);
739    k[2] ^= s_box(k[15]);
740    k[3] ^= s_box(k[12]);
741}
742
743/*  Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */
744
745void aes_decrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
746                      const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] )
747{
748    uint_8t s1[N_BLOCK], r, rc = 0x6c;
749    if(o_key != key)
750        block_copy( o_key, key );
751
752    copy_and_key( s1, in, o_key );
753    inv_shift_sub_rows( s1 );
754
755    for( r = 10 ; --r ; )
756#if defined( VERSION_1 )
757    {
758        update_decrypt_key_128( o_key, &rc );
759        add_round_key( s1, o_key );
760        inv_mix_sub_columns( s1 );
761    }
762#else
763    {   uint_8t s2[N_BLOCK];
764        update_decrypt_key_128( o_key, &rc );
765        copy_and_key( s2, s1, o_key );
766        inv_mix_sub_columns( s1, s2 );
767    }
768#endif
769    update_decrypt_key_128( o_key, &rc );
770    copy_and_key( out, s1, o_key );
771}
772
773#endif
774
775#if defined( AES_ENC_256_OTFK )
776
777/*  The 'on the fly' encryption key update for for 256 bit keys */
778
779static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc )
780{   uint_8t cc;
781
782    k[0] ^= s_box(k[29]) ^ *rc;
783    k[1] ^= s_box(k[30]);
784    k[2] ^= s_box(k[31]);
785    k[3] ^= s_box(k[28]);
786    *rc = f2( *rc );
787
788    for(cc = 4; cc < 16; cc += 4)
789    {
790        k[cc + 0] ^= k[cc - 4];
791        k[cc + 1] ^= k[cc - 3];
792        k[cc + 2] ^= k[cc - 2];
793        k[cc + 3] ^= k[cc - 1];
794    }
795
796    k[16] ^= s_box(k[12]);
797    k[17] ^= s_box(k[13]);
798    k[18] ^= s_box(k[14]);
799    k[19] ^= s_box(k[15]);
800
801    for( cc = 20; cc < 32; cc += 4 )
802    {
803        k[cc + 0] ^= k[cc - 4];
804        k[cc + 1] ^= k[cc - 3];
805        k[cc + 2] ^= k[cc - 2];
806        k[cc + 3] ^= k[cc - 1];
807    }
808}
809
810/*  Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */
811
812void aes_encrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
813                      const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] )
814{
815    uint_8t s1[N_BLOCK], r, rc = 1;
816    if(o_key != key)
817    {
818        block_copy( o_key, key );
819        block_copy( o_key + 16, key + 16 );
820    }
821    copy_and_key( s1, in, o_key );
822
823    for( r = 1 ; r < 14 ; ++r )
824#if defined( VERSION_1 )
825    {
826        mix_sub_columns(s1);
827        if( r & 1 )
828            add_round_key( s1, o_key + 16 );
829        else
830        {
831            update_encrypt_key_256( o_key, &rc );
832            add_round_key( s1, o_key );
833        }
834    }
835#else
836    {   uint_8t s2[N_BLOCK];
837        mix_sub_columns( s2, s1 );
838        if( r & 1 )
839            copy_and_key( s1, s2, o_key + 16 );
840        else
841        {
842            update_encrypt_key_256( o_key, &rc );
843            copy_and_key( s1, s2, o_key );
844        }
845    }
846#endif
847
848    shift_sub_rows( s1 );
849    update_encrypt_key_256( o_key, &rc );
850    copy_and_key( out, s1, o_key );
851}
852
853#endif
854
855#if defined( AES_DEC_256_OTFK )
856
857/*  The 'on the fly' encryption key update for for 256 bit keys */
858
859static void update_decrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc )
860{   uint_8t cc;
861
862    for(cc = 28; cc > 16; cc -= 4)
863    {
864        k[cc + 0] ^= k[cc - 4];
865        k[cc + 1] ^= k[cc - 3];
866        k[cc + 2] ^= k[cc - 2];
867        k[cc + 3] ^= k[cc - 1];
868    }
869
870    k[16] ^= s_box(k[12]);
871    k[17] ^= s_box(k[13]);
872    k[18] ^= s_box(k[14]);
873    k[19] ^= s_box(k[15]);
874
875    for(cc = 12; cc > 0; cc -= 4)
876    {
877        k[cc + 0] ^= k[cc - 4];
878        k[cc + 1] ^= k[cc - 3];
879        k[cc + 2] ^= k[cc - 2];
880        k[cc + 3] ^= k[cc - 1];
881    }
882
883    *rc = d2(*rc);
884    k[0] ^= s_box(k[29]) ^ *rc;
885    k[1] ^= s_box(k[30]);
886    k[2] ^= s_box(k[31]);
887    k[3] ^= s_box(k[28]);
888}
889
890/*  Decrypt a single block of 16 bytes with 'on the fly'
891    256 bit keying
892*/
893void aes_decrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
894                      const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] )
895{
896    uint_8t s1[N_BLOCK], r, rc = 0x80;
897
898    if(o_key != key)
899    {
900        block_copy( o_key, key );
901        block_copy( o_key + 16, key + 16 );
902    }
903
904    copy_and_key( s1, in, o_key );
905    inv_shift_sub_rows( s1 );
906
907    for( r = 14 ; --r ; )
908#if defined( VERSION_1 )
909    {
910        if( ( r & 1 ) )
911        {
912            update_decrypt_key_256( o_key, &rc );
913            add_round_key( s1, o_key + 16 );
914        }
915        else
916            add_round_key( s1, o_key );
917        inv_mix_sub_columns( s1 );
918    }
919#else
920    {   uint_8t s2[N_BLOCK];
921        if( ( r & 1 ) )
922        {
923            update_decrypt_key_256( o_key, &rc );
924            copy_and_key( s2, s1, o_key + 16 );
925        }
926        else
927            copy_and_key( s2, s1, o_key );
928        inv_mix_sub_columns( s1, s2 );
929    }
930#endif
931    copy_and_key( out, s1, o_key );
932}
933
934#endif
935