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 "common/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
197 static const uint_8t sbox[256] = sb_data(f1);
198 static const uint_8t isbox[256] = isb_data(f1);
199
200 static const uint_8t gfm2_sbox[256] = sb_data(f2);
201 static const uint_8t gfm3_sbox[256] = sb_data(f3);
202
203 static const uint_8t gfmul_9[256] = mm_data(f9);
204 static const uint_8t gfmul_b[256] = mm_data(fb);
205 static const uint_8t gfmul_d[256] = mm_data(fd);
206 static 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
hibit(const uint_8t x)224 static uint_8t hibit(const uint_8t x)
225 {
226 uint_8t r = (uint_8t)((x >> 1) | (x >> 2));
227
228 r |= (r >> 2);
229 r |= (r >> 4);
230 return (r + 1) >> 1;
231 }
232
233 /* return the inverse of the finite field element x */
234
gf_inv(const uint_8t x)235 static uint_8t gf_inv(const uint_8t x)
236 {
237 uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
238
239 if (x < 2) {
240 return x;
241 }
242
243 for ( ; ; ) {
244 if (n1) {
245 while (n2 >= n1) { /* divide polynomial p2 by p1 */
246 n2 /= n1; /* shift smaller polynomial left */
247 p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */
248 v2 ^= (v1 * n2); /* shift accumulated value and */
249 n2 = hibit(p2); /* add into result */
250 }
251 } else {
252 return v1;
253 }
254
255 if (n2) { /* repeat with values swapped */
256 while (n1 >= n2) {
257 n1 /= n2;
258 p1 ^= p2 * n1;
259 v1 ^= v2 * n1;
260 n1 = hibit(p1);
261 }
262 } else {
263 return v2;
264 }
265 }
266 }
267
268 /* The forward and inverse affine transformations used in the S-box */
fwd_affine(const uint_8t x)269 uint_8t fwd_affine(const uint_8t x)
270 {
271 #if defined( HAVE_UINT_32T )
272 uint_32t w = x;
273 w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
274 return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
275 #else
276 return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4)
277 ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4);
278 #endif
279 }
280
inv_affine(const uint_8t x)281 uint_8t inv_affine(const uint_8t x)
282 {
283 #if defined( HAVE_UINT_32T )
284 uint_32t w = x;
285 w = (w << 1) ^ (w << 3) ^ (w << 6);
286 return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
287 #else
288 return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6)
289 ^ (x >> 7) ^ (x >> 5) ^ (x >> 2);
290 #endif
291 }
292
293 #define s_box(x) fwd_affine(gf_inv(x))
294 #define is_box(x) gf_inv(inv_affine(x))
295 #define gfm2_sb(x) f2(s_box(x))
296 #define gfm3_sb(x) f3(s_box(x))
297 #define gfm_9(x) f9(x)
298 #define gfm_b(x) fb(x)
299 #define gfm_d(x) fd(x)
300 #define gfm_e(x) fe(x)
301
302 #endif
303
304 #if defined( HAVE_MEMCPY )
305 # define block_copy_nn(d, s, l) memcpy(d, s, l)
306 # define block_copy(d, s) memcpy(d, s, N_BLOCK)
307 #else
308 # define block_copy_nn(d, s, l) copy_block_nn(d, s, l)
309 # define block_copy(d, s) copy_block(d, s)
310 #endif
311
312 #if !defined( HAVE_MEMCPY )
copy_block(void * d,const void * s)313 static void copy_block( void *d, const void *s )
314 {
315 #if defined( HAVE_UINT_32T )
316 ((uint_32t *)d)[ 0] = ((uint_32t *)s)[ 0];
317 ((uint_32t *)d)[ 1] = ((uint_32t *)s)[ 1];
318 ((uint_32t *)d)[ 2] = ((uint_32t *)s)[ 2];
319 ((uint_32t *)d)[ 3] = ((uint_32t *)s)[ 3];
320 #else
321 ((uint_8t *)d)[ 0] = ((uint_8t *)s)[ 0];
322 ((uint_8t *)d)[ 1] = ((uint_8t *)s)[ 1];
323 ((uint_8t *)d)[ 2] = ((uint_8t *)s)[ 2];
324 ((uint_8t *)d)[ 3] = ((uint_8t *)s)[ 3];
325 ((uint_8t *)d)[ 4] = ((uint_8t *)s)[ 4];
326 ((uint_8t *)d)[ 5] = ((uint_8t *)s)[ 5];
327 ((uint_8t *)d)[ 6] = ((uint_8t *)s)[ 6];
328 ((uint_8t *)d)[ 7] = ((uint_8t *)s)[ 7];
329 ((uint_8t *)d)[ 8] = ((uint_8t *)s)[ 8];
330 ((uint_8t *)d)[ 9] = ((uint_8t *)s)[ 9];
331 ((uint_8t *)d)[10] = ((uint_8t *)s)[10];
332 ((uint_8t *)d)[11] = ((uint_8t *)s)[11];
333 ((uint_8t *)d)[12] = ((uint_8t *)s)[12];
334 ((uint_8t *)d)[13] = ((uint_8t *)s)[13];
335 ((uint_8t *)d)[14] = ((uint_8t *)s)[14];
336 ((uint_8t *)d)[15] = ((uint_8t *)s)[15];
337 #endif
338 }
339
copy_block_nn(void * d,const void * s,uint_8t nn)340 static void copy_block_nn( void *d, const void *s, uint_8t nn )
341 {
342 while ( nn-- ) {
343 *((uint_8t *)d)++ = *((uint_8t *)s)++;
344 }
345 }
346 #endif
347
xor_block(void * d,const void * s)348 static void xor_block( void *d, const void *s )
349 {
350 #if defined( HAVE_UINT_32T )
351 ((uint_32t *)d)[ 0] ^= ((uint_32t *)s)[ 0];
352 ((uint_32t *)d)[ 1] ^= ((uint_32t *)s)[ 1];
353 ((uint_32t *)d)[ 2] ^= ((uint_32t *)s)[ 2];
354 ((uint_32t *)d)[ 3] ^= ((uint_32t *)s)[ 3];
355 #else
356 ((uint_8t *)d)[ 0] ^= ((uint_8t *)s)[ 0];
357 ((uint_8t *)d)[ 1] ^= ((uint_8t *)s)[ 1];
358 ((uint_8t *)d)[ 2] ^= ((uint_8t *)s)[ 2];
359 ((uint_8t *)d)[ 3] ^= ((uint_8t *)s)[ 3];
360 ((uint_8t *)d)[ 4] ^= ((uint_8t *)s)[ 4];
361 ((uint_8t *)d)[ 5] ^= ((uint_8t *)s)[ 5];
362 ((uint_8t *)d)[ 6] ^= ((uint_8t *)s)[ 6];
363 ((uint_8t *)d)[ 7] ^= ((uint_8t *)s)[ 7];
364 ((uint_8t *)d)[ 8] ^= ((uint_8t *)s)[ 8];
365 ((uint_8t *)d)[ 9] ^= ((uint_8t *)s)[ 9];
366 ((uint_8t *)d)[10] ^= ((uint_8t *)s)[10];
367 ((uint_8t *)d)[11] ^= ((uint_8t *)s)[11];
368 ((uint_8t *)d)[12] ^= ((uint_8t *)s)[12];
369 ((uint_8t *)d)[13] ^= ((uint_8t *)s)[13];
370 ((uint_8t *)d)[14] ^= ((uint_8t *)s)[14];
371 ((uint_8t *)d)[15] ^= ((uint_8t *)s)[15];
372 #endif
373 }
374
copy_and_key(void * d,const void * s,const void * k)375 static void copy_and_key( void *d, const void *s, const void *k )
376 {
377 #if defined( HAVE_UINT_32T )
378 ((uint_32t *)d)[ 0] = ((uint_32t *)s)[ 0] ^ ((uint_32t *)k)[ 0];
379 ((uint_32t *)d)[ 1] = ((uint_32t *)s)[ 1] ^ ((uint_32t *)k)[ 1];
380 ((uint_32t *)d)[ 2] = ((uint_32t *)s)[ 2] ^ ((uint_32t *)k)[ 2];
381 ((uint_32t *)d)[ 3] = ((uint_32t *)s)[ 3] ^ ((uint_32t *)k)[ 3];
382 #elif 1
383 ((uint_8t *)d)[ 0] = ((uint_8t *)s)[ 0] ^ ((uint_8t *)k)[ 0];
384 ((uint_8t *)d)[ 1] = ((uint_8t *)s)[ 1] ^ ((uint_8t *)k)[ 1];
385 ((uint_8t *)d)[ 2] = ((uint_8t *)s)[ 2] ^ ((uint_8t *)k)[ 2];
386 ((uint_8t *)d)[ 3] = ((uint_8t *)s)[ 3] ^ ((uint_8t *)k)[ 3];
387 ((uint_8t *)d)[ 4] = ((uint_8t *)s)[ 4] ^ ((uint_8t *)k)[ 4];
388 ((uint_8t *)d)[ 5] = ((uint_8t *)s)[ 5] ^ ((uint_8t *)k)[ 5];
389 ((uint_8t *)d)[ 6] = ((uint_8t *)s)[ 6] ^ ((uint_8t *)k)[ 6];
390 ((uint_8t *)d)[ 7] = ((uint_8t *)s)[ 7] ^ ((uint_8t *)k)[ 7];
391 ((uint_8t *)d)[ 8] = ((uint_8t *)s)[ 8] ^ ((uint_8t *)k)[ 8];
392 ((uint_8t *)d)[ 9] = ((uint_8t *)s)[ 9] ^ ((uint_8t *)k)[ 9];
393 ((uint_8t *)d)[10] = ((uint_8t *)s)[10] ^ ((uint_8t *)k)[10];
394 ((uint_8t *)d)[11] = ((uint_8t *)s)[11] ^ ((uint_8t *)k)[11];
395 ((uint_8t *)d)[12] = ((uint_8t *)s)[12] ^ ((uint_8t *)k)[12];
396 ((uint_8t *)d)[13] = ((uint_8t *)s)[13] ^ ((uint_8t *)k)[13];
397 ((uint_8t *)d)[14] = ((uint_8t *)s)[14] ^ ((uint_8t *)k)[14];
398 ((uint_8t *)d)[15] = ((uint_8t *)s)[15] ^ ((uint_8t *)k)[15];
399 #else
400 block_copy(d, s);
401 xor_block(d, k);
402 #endif
403 }
404
add_round_key(uint_8t d[N_BLOCK],const uint_8t k[N_BLOCK])405 static void add_round_key( uint_8t d[N_BLOCK], const uint_8t k[N_BLOCK] )
406 {
407 xor_block(d, k);
408 }
409
shift_sub_rows(uint_8t st[N_BLOCK])410 static void shift_sub_rows( uint_8t st[N_BLOCK] )
411 {
412 uint_8t tt;
413
414 st[ 0] = s_box(st[ 0]); st[ 4] = s_box(st[ 4]);
415 st[ 8] = s_box(st[ 8]); st[12] = s_box(st[12]);
416
417 tt = st[1]; st[ 1] = s_box(st[ 5]); st[ 5] = s_box(st[ 9]);
418 st[ 9] = s_box(st[13]); st[13] = s_box( tt );
419
420 tt = st[2]; st[ 2] = s_box(st[10]); st[10] = s_box( tt );
421 tt = st[6]; st[ 6] = s_box(st[14]); st[14] = s_box( tt );
422
423 tt = st[15]; st[15] = s_box(st[11]); st[11] = s_box(st[ 7]);
424 st[ 7] = s_box(st[ 3]); st[ 3] = s_box( tt );
425 }
426
inv_shift_sub_rows(uint_8t st[N_BLOCK])427 static void inv_shift_sub_rows( uint_8t st[N_BLOCK] )
428 {
429 uint_8t tt;
430
431 st[ 0] = is_box(st[ 0]); st[ 4] = is_box(st[ 4]);
432 st[ 8] = is_box(st[ 8]); st[12] = is_box(st[12]);
433
434 tt = st[13]; st[13] = is_box(st[9]); st[ 9] = is_box(st[5]);
435 st[ 5] = is_box(st[1]); st[ 1] = is_box( tt );
436
437 tt = st[2]; st[ 2] = is_box(st[10]); st[10] = is_box( tt );
438 tt = st[6]; st[ 6] = is_box(st[14]); st[14] = is_box( tt );
439
440 tt = st[3]; st[ 3] = is_box(st[ 7]); st[ 7] = is_box(st[11]);
441 st[11] = is_box(st[15]); st[15] = is_box( tt );
442 }
443
444 #if defined( VERSION_1 )
mix_sub_columns(uint_8t dt[N_BLOCK])445 static void mix_sub_columns( uint_8t dt[N_BLOCK] )
446 {
447 uint_8t st[N_BLOCK];
448 block_copy(st, dt);
449 #else
450 static void mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] )
451 {
452 #endif
453 dt[ 0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]);
454 dt[ 1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]);
455 dt[ 2] = s_box(st[0]) ^ s_box(st[5]) ^ gfm2_sb(st[10]) ^ gfm3_sb(st[15]);
456 dt[ 3] = gfm3_sb(st[0]) ^ s_box(st[5]) ^ s_box(st[10]) ^ gfm2_sb(st[15]);
457
458 dt[ 4] = gfm2_sb(st[4]) ^ gfm3_sb(st[9]) ^ s_box(st[14]) ^ s_box(st[3]);
459 dt[ 5] = s_box(st[4]) ^ gfm2_sb(st[9]) ^ gfm3_sb(st[14]) ^ s_box(st[3]);
460 dt[ 6] = s_box(st[4]) ^ s_box(st[9]) ^ gfm2_sb(st[14]) ^ gfm3_sb(st[3]);
461 dt[ 7] = gfm3_sb(st[4]) ^ s_box(st[9]) ^ s_box(st[14]) ^ gfm2_sb(st[3]);
462
463 dt[ 8] = gfm2_sb(st[8]) ^ gfm3_sb(st[13]) ^ s_box(st[2]) ^ s_box(st[7]);
464 dt[ 9] = s_box(st[8]) ^ gfm2_sb(st[13]) ^ gfm3_sb(st[2]) ^ s_box(st[7]);
465 dt[10] = s_box(st[8]) ^ s_box(st[13]) ^ gfm2_sb(st[2]) ^ gfm3_sb(st[7]);
466 dt[11] = gfm3_sb(st[8]) ^ s_box(st[13]) ^ s_box(st[2]) ^ gfm2_sb(st[7]);
467
468 dt[12] = gfm2_sb(st[12]) ^ gfm3_sb(st[1]) ^ s_box(st[6]) ^ s_box(st[11]);
469 dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]);
470 dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]);
471 dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]);
472 }
473
474 #if defined( VERSION_1 )
475 static void inv_mix_sub_columns( uint_8t dt[N_BLOCK] )
476 {
477 uint_8t st[N_BLOCK];
478 block_copy(st, dt);
479 #else
480 static void inv_mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] )
481 {
482 #endif
483 dt[ 0] = is_box(gfm_e(st[ 0]) ^ gfm_b(st[ 1]) ^ gfm_d(st[ 2]) ^ gfm_9(st[ 3]));
484 dt[ 5] = is_box(gfm_9(st[ 0]) ^ gfm_e(st[ 1]) ^ gfm_b(st[ 2]) ^ gfm_d(st[ 3]));
485 dt[10] = is_box(gfm_d(st[ 0]) ^ gfm_9(st[ 1]) ^ gfm_e(st[ 2]) ^ gfm_b(st[ 3]));
486 dt[15] = is_box(gfm_b(st[ 0]) ^ gfm_d(st[ 1]) ^ gfm_9(st[ 2]) ^ gfm_e(st[ 3]));
487
488 dt[ 4] = is_box(gfm_e(st[ 4]) ^ gfm_b(st[ 5]) ^ gfm_d(st[ 6]) ^ gfm_9(st[ 7]));
489 dt[ 9] = is_box(gfm_9(st[ 4]) ^ gfm_e(st[ 5]) ^ gfm_b(st[ 6]) ^ gfm_d(st[ 7]));
490 dt[14] = is_box(gfm_d(st[ 4]) ^ gfm_9(st[ 5]) ^ gfm_e(st[ 6]) ^ gfm_b(st[ 7]));
491 dt[ 3] = is_box(gfm_b(st[ 4]) ^ gfm_d(st[ 5]) ^ gfm_9(st[ 6]) ^ gfm_e(st[ 7]));
492
493 dt[ 8] = is_box(gfm_e(st[ 8]) ^ gfm_b(st[ 9]) ^ gfm_d(st[10]) ^ gfm_9(st[11]));
494 dt[13] = is_box(gfm_9(st[ 8]) ^ gfm_e(st[ 9]) ^ gfm_b(st[10]) ^ gfm_d(st[11]));
495 dt[ 2] = is_box(gfm_d(st[ 8]) ^ gfm_9(st[ 9]) ^ gfm_e(st[10]) ^ gfm_b(st[11]));
496 dt[ 7] = is_box(gfm_b(st[ 8]) ^ gfm_d(st[ 9]) ^ gfm_9(st[10]) ^ gfm_e(st[11]));
497
498 dt[12] = is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15]));
499 dt[ 1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15]));
500 dt[ 6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15]));
501 dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15]));
502 }
503
504 #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED )
505
506 /* Set the cipher key for the pre-keyed version */
507 /* NOTE: If the length_type used for the key length is an
508 unsigned 8-bit character, a key length of 256 bits must
509 be entered as a length in bytes (valid inputs are hence
510 128, 192, 16, 24 and 32).
511 */
512
513 return_type aes_set_key( const unsigned char key[], length_type keylen, aes_context ctx[1] )
514 {
515 uint_8t cc, rc, hi;
516
517 switch ( keylen ) {
518 case 16:
519 case 128: /* length in bits (128 = 8*16) */
520 keylen = 16;
521 break;
522 case 24:
523 case 192: /* length in bits (192 = 8*24) */
524 keylen = 24;
525 break;
526 case 32:
527 /* case 256: length in bits (256 = 8*32) */
528 keylen = 32;
529 break;
530 default:
531 ctx->rnd = 0;
532 return (return_type) - 1;
533 }
534 block_copy_nn(ctx->ksch, key, keylen);
535 hi = (keylen + 28) << 2;
536 ctx->rnd = (hi >> 4) - 1;
537 for ( cc = keylen, rc = 1; cc < hi; cc += 4 ) {
538 uint_8t tt, t0, t1, t2, t3;
539
540 t0 = ctx->ksch[cc - 4];
541 t1 = ctx->ksch[cc - 3];
542 t2 = ctx->ksch[cc - 2];
543 t3 = ctx->ksch[cc - 1];
544 if ( cc % keylen == 0 ) {
545 tt = t0;
546 t0 = s_box(t1) ^ rc;
547 t1 = s_box(t2);
548 t2 = s_box(t3);
549 t3 = s_box(tt);
550 rc = f2(rc);
551 } else if ( keylen > 24 && cc % keylen == 16 ) {
552 t0 = s_box(t0);
553 t1 = s_box(t1);
554 t2 = s_box(t2);
555 t3 = s_box(t3);
556 }
557 tt = cc - keylen;
558 ctx->ksch[cc + 0] = ctx->ksch[tt + 0] ^ t0;
559 ctx->ksch[cc + 1] = ctx->ksch[tt + 1] ^ t1;
560 ctx->ksch[cc + 2] = ctx->ksch[tt + 2] ^ t2;
561 ctx->ksch[cc + 3] = ctx->ksch[tt + 3] ^ t3;
562 }
563 return 0;
564 }
565
566 #endif
567
568 #if defined( AES_ENC_PREKEYED )
569
570 /* Encrypt a single block of 16 bytes */
571
572 /* @breif change the name by snake for avoid the conflict with libcrypto */
573 return_type bluedroid_aes_encrypt( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1] )
574 {
575 if ( ctx->rnd ) {
576 uint_8t s1[N_BLOCK], r;
577 copy_and_key( s1, in, ctx->ksch );
578
579 for ( r = 1 ; r < ctx->rnd ; ++r )
580 #if defined( VERSION_1 )
581 {
582 mix_sub_columns( s1 );
583 add_round_key( s1, ctx->ksch + r * N_BLOCK);
584 }
585 #else
586 {
587 uint_8t s2[N_BLOCK];
588 mix_sub_columns( s2, s1 );
589 copy_and_key( s1, s2, ctx->ksch + r * N_BLOCK);
590 }
591 #endif
592 shift_sub_rows( s1 );
593 copy_and_key( out, s1, ctx->ksch + r * N_BLOCK );
594 } else {
595 return (return_type) - 1;
596 }
597 return 0;
598 }
599
600 /* CBC encrypt a number of blocks (input and return an IV) */
601
602 return_type aes_cbc_encrypt( const unsigned char *in, unsigned char *out,
603 int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] )
604 {
605
606 while (n_block--) {
607 xor_block(iv, in);
608 if (bluedroid_aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) {
609 return EXIT_FAILURE;
610 }
611 memcpy(out, iv, N_BLOCK);
612 in += N_BLOCK;
613 out += N_BLOCK;
614 }
615 return EXIT_SUCCESS;
616 }
617
618 #endif
619
620 #if defined( AES_DEC_PREKEYED )
621
622 /* Decrypt a single block of 16 bytes */
623
624 return_type bluedroid_aes_decrypt( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1] )
625 {
626 if ( ctx->rnd ) {
627 uint_8t s1[N_BLOCK], r;
628 copy_and_key( s1, in, ctx->ksch + ctx->rnd * N_BLOCK );
629 inv_shift_sub_rows( s1 );
630
631 for ( r = ctx->rnd ; --r ; )
632 #if defined( VERSION_1 )
633 {
634 add_round_key( s1, ctx->ksch + r * N_BLOCK );
635 inv_mix_sub_columns( s1 );
636 }
637 #else
638 {
639 uint_8t s2[N_BLOCK];
640 copy_and_key( s2, s1, ctx->ksch + r * N_BLOCK );
641 inv_mix_sub_columns( s1, s2 );
642 }
643 #endif
644 copy_and_key( out, s1, ctx->ksch );
645 } else {
646 return (return_type) - 1;
647 }
648 return 0;
649 }
650
651 /* CBC decrypt a number of blocks (input and return an IV) */
652
653 return_type aes_cbc_decrypt( const unsigned char *in, unsigned char *out,
654 int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] )
655 {
656 while (n_block--) {
657 uint_8t tmp[N_BLOCK];
658
659 memcpy(tmp, in, N_BLOCK);
660 if (bluedroid_aes_decrypt(in, out, ctx) != EXIT_SUCCESS) {
661 return EXIT_FAILURE;
662 }
663 xor_block(out, iv);
664 memcpy(iv, tmp, N_BLOCK);
665 in += N_BLOCK;
666 out += N_BLOCK;
667 }
668 return EXIT_SUCCESS;
669 }
670
671 #endif
672
673 #if defined( AES_ENC_128_OTFK )
674
675 /* The 'on the fly' encryption key update for for 128 bit keys */
676
677 static void update_encrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc )
678 {
679 uint_8t cc;
680
681 k[0] ^= s_box(k[13]) ^ *rc;
682 k[1] ^= s_box(k[14]);
683 k[2] ^= s_box(k[15]);
684 k[3] ^= s_box(k[12]);
685 *rc = f2( *rc );
686
687 for (cc = 4; cc < 16; cc += 4 ) {
688 k[cc + 0] ^= k[cc - 4];
689 k[cc + 1] ^= k[cc - 3];
690 k[cc + 2] ^= k[cc - 2];
691 k[cc + 3] ^= k[cc - 1];
692 }
693 }
694
695 /* Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */
696
697 void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
698 const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] )
699 {
700 uint_8t s1[N_BLOCK], r, rc = 1;
701
702 if (o_key != key) {
703 block_copy( o_key, key );
704 }
705 copy_and_key( s1, in, o_key );
706
707 for ( r = 1 ; r < 10 ; ++r )
708 #if defined( VERSION_1 )
709 {
710 mix_sub_columns( s1 );
711 update_encrypt_key_128( o_key, &rc );
712 add_round_key( s1, o_key );
713 }
714 #else
715 {
716 uint_8t s2[N_BLOCK];
717 mix_sub_columns( s2, s1 );
718 update_encrypt_key_128( o_key, &rc );
719 copy_and_key( s1, s2, o_key );
720 }
721 #endif
722
723 shift_sub_rows( s1 );
724 update_encrypt_key_128( o_key, &rc );
725 copy_and_key( out, s1, o_key );
726 }
727
728 #endif
729
730 #if defined( AES_DEC_128_OTFK )
731
732 /* The 'on the fly' decryption key update for for 128 bit keys */
733
734 static void update_decrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc )
735 {
736 uint_8t cc;
737
738 for ( cc = 12; cc > 0; cc -= 4 ) {
739 k[cc + 0] ^= k[cc - 4];
740 k[cc + 1] ^= k[cc - 3];
741 k[cc + 2] ^= k[cc - 2];
742 k[cc + 3] ^= k[cc - 1];
743 }
744 *rc = d2(*rc);
745 k[0] ^= s_box(k[13]) ^ *rc;
746 k[1] ^= s_box(k[14]);
747 k[2] ^= s_box(k[15]);
748 k[3] ^= s_box(k[12]);
749 }
750
751 /* Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */
752
753 void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
754 const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] )
755 {
756 uint_8t s1[N_BLOCK], r, rc = 0x6c;
757 if (o_key != key) {
758 block_copy( o_key, key );
759 }
760
761 copy_and_key( s1, in, o_key );
762 inv_shift_sub_rows( s1 );
763
764 for ( r = 10 ; --r ; )
765 #if defined( VERSION_1 )
766 {
767 update_decrypt_key_128( o_key, &rc );
768 add_round_key( s1, o_key );
769 inv_mix_sub_columns( s1 );
770 }
771 #else
772 {
773 uint_8t s2[N_BLOCK];
774 update_decrypt_key_128( o_key, &rc );
775 copy_and_key( s2, s1, o_key );
776 inv_mix_sub_columns( s1, s2 );
777 }
778 #endif
779 update_decrypt_key_128( o_key, &rc );
780 copy_and_key( out, s1, o_key );
781 }
782
783 #endif
784
785 #if defined( AES_ENC_256_OTFK )
786
787 /* The 'on the fly' encryption key update for for 256 bit keys */
788
789 static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc )
790 {
791 uint_8t cc;
792
793 k[0] ^= s_box(k[29]) ^ *rc;
794 k[1] ^= s_box(k[30]);
795 k[2] ^= s_box(k[31]);
796 k[3] ^= s_box(k[28]);
797 *rc = f2( *rc );
798
799 for (cc = 4; cc < 16; cc += 4) {
800 k[cc + 0] ^= k[cc - 4];
801 k[cc + 1] ^= k[cc - 3];
802 k[cc + 2] ^= k[cc - 2];
803 k[cc + 3] ^= k[cc - 1];
804 }
805
806 k[16] ^= s_box(k[12]);
807 k[17] ^= s_box(k[13]);
808 k[18] ^= s_box(k[14]);
809 k[19] ^= s_box(k[15]);
810
811 for ( cc = 20; cc < 32; cc += 4 ) {
812 k[cc + 0] ^= k[cc - 4];
813 k[cc + 1] ^= k[cc - 3];
814 k[cc + 2] ^= k[cc - 2];
815 k[cc + 3] ^= k[cc - 1];
816 }
817 }
818
819 /* Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */
820
821 void bluedroid_aes_encrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
822 const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] )
823 {
824 uint_8t s1[N_BLOCK], r, rc = 1;
825 if (o_key != key) {
826 block_copy( o_key, key );
827 block_copy( o_key + 16, key + 16 );
828 }
829 copy_and_key( s1, in, o_key );
830
831 for ( r = 1 ; r < 14 ; ++r )
832 #if defined( VERSION_1 )
833 {
834 mix_sub_columns(s1);
835 if ( r & 1 ) {
836 add_round_key( s1, o_key + 16 );
837 } else {
838 update_encrypt_key_256( o_key, &rc );
839 add_round_key( s1, o_key );
840 }
841 }
842 #else
843 {
844 uint_8t s2[N_BLOCK];
845 mix_sub_columns( s2, s1 );
846 if ( r & 1 ) {
847 copy_and_key( s1, s2, o_key + 16 );
848 } else {
849 update_encrypt_key_256( o_key, &rc );
850 copy_and_key( s1, s2, o_key );
851 }
852 }
853 #endif
854
855 shift_sub_rows( s1 );
856 update_encrypt_key_256( o_key, &rc );
857 copy_and_key( out, s1, o_key );
858 }
859
860 #endif
861
862 #if defined( AES_DEC_256_OTFK )
863
864 /* The 'on the fly' encryption key update for for 256 bit keys */
865
866 static void update_decrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc )
867 {
868 uint_8t cc;
869
870 for (cc = 28; cc > 16; cc -= 4) {
871 k[cc + 0] ^= k[cc - 4];
872 k[cc + 1] ^= k[cc - 3];
873 k[cc + 2] ^= k[cc - 2];
874 k[cc + 3] ^= k[cc - 1];
875 }
876
877 k[16] ^= s_box(k[12]);
878 k[17] ^= s_box(k[13]);
879 k[18] ^= s_box(k[14]);
880 k[19] ^= s_box(k[15]);
881
882 for (cc = 12; cc > 0; cc -= 4) {
883 k[cc + 0] ^= k[cc - 4];
884 k[cc + 1] ^= k[cc - 3];
885 k[cc + 2] ^= k[cc - 2];
886 k[cc + 3] ^= k[cc - 1];
887 }
888
889 *rc = d2(*rc);
890 k[0] ^= s_box(k[29]) ^ *rc;
891 k[1] ^= s_box(k[30]);
892 k[2] ^= s_box(k[31]);
893 k[3] ^= s_box(k[28]);
894 }
895
896 /* Decrypt a single block of 16 bytes with 'on the fly'
897 256 bit keying
898 */
899 void bluedroid_aes_decrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK],
900 const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] )
901 {
902 uint_8t s1[N_BLOCK], r, rc = 0x80;
903
904 if (o_key != key) {
905 block_copy( o_key, key );
906 block_copy( o_key + 16, key + 16 );
907 }
908
909 copy_and_key( s1, in, o_key );
910 inv_shift_sub_rows( s1 );
911
912 for ( r = 14 ; --r ; )
913 #if defined( VERSION_1 )
914 {
915 if ( ( r & 1 ) ) {
916 update_decrypt_key_256( o_key, &rc );
917 add_round_key( s1, o_key + 16 );
918 } else {
919 add_round_key( s1, o_key );
920 }
921 inv_mix_sub_columns( s1 );
922 }
923 #else
924 {
925 uint_8t s2[N_BLOCK];
926 if ( ( r & 1 ) ) {
927 update_decrypt_key_256( o_key, &rc );
928 copy_and_key( s2, s1, o_key + 16 );
929 } else {
930 copy_and_key( s2, s1, o_key );
931 }
932 inv_mix_sub_columns( s1, s2 );
933 }
934 #endif
935 copy_and_key( out, s1, o_key );
936 }
937
938 #endif
939