s3:libsmb: don't call cli_NetServerEnum() on SMB2/3 connections in SMBC_opendir_ctx()
[Samba.git] / lib / crypto / aes.h
blob48ea764d514eb03a05feb14e6b159fe78d95e39a
1 /*
2 * Copyright (c) 2003-2004 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
34 /* $Id$ */
36 #ifndef LIB_CRYPTO_AES_H
37 #define LIB_CRYPTO_AES_H 1
39 #define SAMBA_RIJNDAEL 1
40 #define SAMBA_AES_CBC_ENCRYPT 1
41 #define SAMBA_AES_CFB8_ENCRYPT 1
42 #define SAMBA_AES_BLOCK_XOR 1
44 /* symbol renaming */
45 #define AES_set_encrypt_key samba_AES_set_encrypt_key
46 #define AES_set_decrypt_key samba_AES_decrypt_key
47 #define AES_encrypt samba_AES_encrypt
48 #define AES_decrypt samba_AES_decrypt
49 #define AES_cbc_encrypt samba_AES_cbc_encrypt
50 #define AES_cfb8_encrypt samba_AES_cfb8_encrypt
56 #define AES_BLOCK_SIZE 16
57 #define AES_MAXNR 14
59 #define AES_ENCRYPT 1
60 #define AES_DECRYPT 0
62 typedef struct aes_key {
63 uint32_t key[(AES_MAXNR+1)*4];
64 int rounds;
65 } AES_KEY;
67 #ifdef __cplusplus
68 extern "C" {
69 #endif
71 int AES_set_encrypt_key(const unsigned char *, const int, AES_KEY *);
72 int AES_set_decrypt_key(const unsigned char *, const int, AES_KEY *);
74 void AES_encrypt(const unsigned char *, unsigned char *, const AES_KEY *);
75 void AES_decrypt(const unsigned char *, unsigned char *, const AES_KEY *);
77 void AES_cbc_encrypt(const unsigned char *, unsigned char *,
78 const unsigned long, const AES_KEY *,
79 unsigned char *, int);
81 void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
82 unsigned long size, const AES_KEY *key,
83 unsigned char *iv, int forward_encrypt);
85 #define aes_cfb8_encrypt(in, out, size, key, iv, forward_encrypt) \
86 AES_cfb8_encrypt(in, out, size, key, iv, forward_encrypt)
88 #ifdef __cplusplus
90 #endif
92 #ifdef SAMBA_AES_BLOCK_XOR
93 static inline void aes_block_xor(const uint8_t in1[AES_BLOCK_SIZE],
94 const uint8_t in2[AES_BLOCK_SIZE],
95 uint8_t out[AES_BLOCK_SIZE])
97 #define __IS_ALIGN8(p) ((((uintptr_t)(p)) & 0x7) == 0)
98 #define __IS_ALIGNED(a,b,c) __IS_ALIGN8(\
99 ((uintptr_t)(a)) | \
100 ((uintptr_t)(b)) | \
101 ((uintptr_t)(c)))
102 /* If everything is aligned we can optimize */
103 if (likely(__IS_ALIGNED(in1, in2, out))) {
104 #define __RO64(p) ((const uint64_t *)(p))
105 #define __RW64(p) ((uint64_t *)(p))
106 __RW64(out)[0] = __RO64(in1)[0] ^ __RO64(in2)[0];
107 __RW64(out)[1] = __RO64(in1)[1] ^ __RO64(in2)[1];
108 } else {
109 uint64_t i1[2];
110 uint64_t i2[2];
111 uint64_t o[2];
113 memcpy(i1, in1, AES_BLOCK_SIZE);
114 memcpy(i2, in2, AES_BLOCK_SIZE);
115 o[0] = i1[0] ^ i2[0];
116 o[1] = i1[1] ^ i2[1];
117 memcpy(out, o, AES_BLOCK_SIZE);
120 #endif /* SAMBA_AES_BLOCK_XOR */
122 static inline void aes_block_lshift(const uint8_t in[AES_BLOCK_SIZE],
123 uint8_t out[AES_BLOCK_SIZE])
125 static const struct aes_block_lshift_entry {
126 uint8_t lshift;
127 uint8_t overflow;
128 } aes_block_lshift_table[UINT8_MAX+1] = {
129 [0x00] = { .lshift = 0x00, .overflow = 0x00 },
130 [0x01] = { .lshift = 0x02, .overflow = 0x00 },
131 [0x02] = { .lshift = 0x04, .overflow = 0x00 },
132 [0x03] = { .lshift = 0x06, .overflow = 0x00 },
133 [0x04] = { .lshift = 0x08, .overflow = 0x00 },
134 [0x05] = { .lshift = 0x0a, .overflow = 0x00 },
135 [0x06] = { .lshift = 0x0c, .overflow = 0x00 },
136 [0x07] = { .lshift = 0x0e, .overflow = 0x00 },
137 [0x08] = { .lshift = 0x10, .overflow = 0x00 },
138 [0x09] = { .lshift = 0x12, .overflow = 0x00 },
139 [0x0a] = { .lshift = 0x14, .overflow = 0x00 },
140 [0x0b] = { .lshift = 0x16, .overflow = 0x00 },
141 [0x0c] = { .lshift = 0x18, .overflow = 0x00 },
142 [0x0d] = { .lshift = 0x1a, .overflow = 0x00 },
143 [0x0e] = { .lshift = 0x1c, .overflow = 0x00 },
144 [0x0f] = { .lshift = 0x1e, .overflow = 0x00 },
145 [0x10] = { .lshift = 0x20, .overflow = 0x00 },
146 [0x11] = { .lshift = 0x22, .overflow = 0x00 },
147 [0x12] = { .lshift = 0x24, .overflow = 0x00 },
148 [0x13] = { .lshift = 0x26, .overflow = 0x00 },
149 [0x14] = { .lshift = 0x28, .overflow = 0x00 },
150 [0x15] = { .lshift = 0x2a, .overflow = 0x00 },
151 [0x16] = { .lshift = 0x2c, .overflow = 0x00 },
152 [0x17] = { .lshift = 0x2e, .overflow = 0x00 },
153 [0x18] = { .lshift = 0x30, .overflow = 0x00 },
154 [0x19] = { .lshift = 0x32, .overflow = 0x00 },
155 [0x1a] = { .lshift = 0x34, .overflow = 0x00 },
156 [0x1b] = { .lshift = 0x36, .overflow = 0x00 },
157 [0x1c] = { .lshift = 0x38, .overflow = 0x00 },
158 [0x1d] = { .lshift = 0x3a, .overflow = 0x00 },
159 [0x1e] = { .lshift = 0x3c, .overflow = 0x00 },
160 [0x1f] = { .lshift = 0x3e, .overflow = 0x00 },
161 [0x20] = { .lshift = 0x40, .overflow = 0x00 },
162 [0x21] = { .lshift = 0x42, .overflow = 0x00 },
163 [0x22] = { .lshift = 0x44, .overflow = 0x00 },
164 [0x23] = { .lshift = 0x46, .overflow = 0x00 },
165 [0x24] = { .lshift = 0x48, .overflow = 0x00 },
166 [0x25] = { .lshift = 0x4a, .overflow = 0x00 },
167 [0x26] = { .lshift = 0x4c, .overflow = 0x00 },
168 [0x27] = { .lshift = 0x4e, .overflow = 0x00 },
169 [0x28] = { .lshift = 0x50, .overflow = 0x00 },
170 [0x29] = { .lshift = 0x52, .overflow = 0x00 },
171 [0x2a] = { .lshift = 0x54, .overflow = 0x00 },
172 [0x2b] = { .lshift = 0x56, .overflow = 0x00 },
173 [0x2c] = { .lshift = 0x58, .overflow = 0x00 },
174 [0x2d] = { .lshift = 0x5a, .overflow = 0x00 },
175 [0x2e] = { .lshift = 0x5c, .overflow = 0x00 },
176 [0x2f] = { .lshift = 0x5e, .overflow = 0x00 },
177 [0x30] = { .lshift = 0x60, .overflow = 0x00 },
178 [0x31] = { .lshift = 0x62, .overflow = 0x00 },
179 [0x32] = { .lshift = 0x64, .overflow = 0x00 },
180 [0x33] = { .lshift = 0x66, .overflow = 0x00 },
181 [0x34] = { .lshift = 0x68, .overflow = 0x00 },
182 [0x35] = { .lshift = 0x6a, .overflow = 0x00 },
183 [0x36] = { .lshift = 0x6c, .overflow = 0x00 },
184 [0x37] = { .lshift = 0x6e, .overflow = 0x00 },
185 [0x38] = { .lshift = 0x70, .overflow = 0x00 },
186 [0x39] = { .lshift = 0x72, .overflow = 0x00 },
187 [0x3a] = { .lshift = 0x74, .overflow = 0x00 },
188 [0x3b] = { .lshift = 0x76, .overflow = 0x00 },
189 [0x3c] = { .lshift = 0x78, .overflow = 0x00 },
190 [0x3d] = { .lshift = 0x7a, .overflow = 0x00 },
191 [0x3e] = { .lshift = 0x7c, .overflow = 0x00 },
192 [0x3f] = { .lshift = 0x7e, .overflow = 0x00 },
193 [0x40] = { .lshift = 0x80, .overflow = 0x00 },
194 [0x41] = { .lshift = 0x82, .overflow = 0x00 },
195 [0x42] = { .lshift = 0x84, .overflow = 0x00 },
196 [0x43] = { .lshift = 0x86, .overflow = 0x00 },
197 [0x44] = { .lshift = 0x88, .overflow = 0x00 },
198 [0x45] = { .lshift = 0x8a, .overflow = 0x00 },
199 [0x46] = { .lshift = 0x8c, .overflow = 0x00 },
200 [0x47] = { .lshift = 0x8e, .overflow = 0x00 },
201 [0x48] = { .lshift = 0x90, .overflow = 0x00 },
202 [0x49] = { .lshift = 0x92, .overflow = 0x00 },
203 [0x4a] = { .lshift = 0x94, .overflow = 0x00 },
204 [0x4b] = { .lshift = 0x96, .overflow = 0x00 },
205 [0x4c] = { .lshift = 0x98, .overflow = 0x00 },
206 [0x4d] = { .lshift = 0x9a, .overflow = 0x00 },
207 [0x4e] = { .lshift = 0x9c, .overflow = 0x00 },
208 [0x4f] = { .lshift = 0x9e, .overflow = 0x00 },
209 [0x50] = { .lshift = 0xa0, .overflow = 0x00 },
210 [0x51] = { .lshift = 0xa2, .overflow = 0x00 },
211 [0x52] = { .lshift = 0xa4, .overflow = 0x00 },
212 [0x53] = { .lshift = 0xa6, .overflow = 0x00 },
213 [0x54] = { .lshift = 0xa8, .overflow = 0x00 },
214 [0x55] = { .lshift = 0xaa, .overflow = 0x00 },
215 [0x56] = { .lshift = 0xac, .overflow = 0x00 },
216 [0x57] = { .lshift = 0xae, .overflow = 0x00 },
217 [0x58] = { .lshift = 0xb0, .overflow = 0x00 },
218 [0x59] = { .lshift = 0xb2, .overflow = 0x00 },
219 [0x5a] = { .lshift = 0xb4, .overflow = 0x00 },
220 [0x5b] = { .lshift = 0xb6, .overflow = 0x00 },
221 [0x5c] = { .lshift = 0xb8, .overflow = 0x00 },
222 [0x5d] = { .lshift = 0xba, .overflow = 0x00 },
223 [0x5e] = { .lshift = 0xbc, .overflow = 0x00 },
224 [0x5f] = { .lshift = 0xbe, .overflow = 0x00 },
225 [0x60] = { .lshift = 0xc0, .overflow = 0x00 },
226 [0x61] = { .lshift = 0xc2, .overflow = 0x00 },
227 [0x62] = { .lshift = 0xc4, .overflow = 0x00 },
228 [0x63] = { .lshift = 0xc6, .overflow = 0x00 },
229 [0x64] = { .lshift = 0xc8, .overflow = 0x00 },
230 [0x65] = { .lshift = 0xca, .overflow = 0x00 },
231 [0x66] = { .lshift = 0xcc, .overflow = 0x00 },
232 [0x67] = { .lshift = 0xce, .overflow = 0x00 },
233 [0x68] = { .lshift = 0xd0, .overflow = 0x00 },
234 [0x69] = { .lshift = 0xd2, .overflow = 0x00 },
235 [0x6a] = { .lshift = 0xd4, .overflow = 0x00 },
236 [0x6b] = { .lshift = 0xd6, .overflow = 0x00 },
237 [0x6c] = { .lshift = 0xd8, .overflow = 0x00 },
238 [0x6d] = { .lshift = 0xda, .overflow = 0x00 },
239 [0x6e] = { .lshift = 0xdc, .overflow = 0x00 },
240 [0x6f] = { .lshift = 0xde, .overflow = 0x00 },
241 [0x70] = { .lshift = 0xe0, .overflow = 0x00 },
242 [0x71] = { .lshift = 0xe2, .overflow = 0x00 },
243 [0x72] = { .lshift = 0xe4, .overflow = 0x00 },
244 [0x73] = { .lshift = 0xe6, .overflow = 0x00 },
245 [0x74] = { .lshift = 0xe8, .overflow = 0x00 },
246 [0x75] = { .lshift = 0xea, .overflow = 0x00 },
247 [0x76] = { .lshift = 0xec, .overflow = 0x00 },
248 [0x77] = { .lshift = 0xee, .overflow = 0x00 },
249 [0x78] = { .lshift = 0xf0, .overflow = 0x00 },
250 [0x79] = { .lshift = 0xf2, .overflow = 0x00 },
251 [0x7a] = { .lshift = 0xf4, .overflow = 0x00 },
252 [0x7b] = { .lshift = 0xf6, .overflow = 0x00 },
253 [0x7c] = { .lshift = 0xf8, .overflow = 0x00 },
254 [0x7d] = { .lshift = 0xfa, .overflow = 0x00 },
255 [0x7e] = { .lshift = 0xfc, .overflow = 0x00 },
256 [0x7f] = { .lshift = 0xfe, .overflow = 0x00 },
257 [0x80] = { .lshift = 0x00, .overflow = 0x01 },
258 [0x81] = { .lshift = 0x02, .overflow = 0x01 },
259 [0x82] = { .lshift = 0x04, .overflow = 0x01 },
260 [0x83] = { .lshift = 0x06, .overflow = 0x01 },
261 [0x84] = { .lshift = 0x08, .overflow = 0x01 },
262 [0x85] = { .lshift = 0x0a, .overflow = 0x01 },
263 [0x86] = { .lshift = 0x0c, .overflow = 0x01 },
264 [0x87] = { .lshift = 0x0e, .overflow = 0x01 },
265 [0x88] = { .lshift = 0x10, .overflow = 0x01 },
266 [0x89] = { .lshift = 0x12, .overflow = 0x01 },
267 [0x8a] = { .lshift = 0x14, .overflow = 0x01 },
268 [0x8b] = { .lshift = 0x16, .overflow = 0x01 },
269 [0x8c] = { .lshift = 0x18, .overflow = 0x01 },
270 [0x8d] = { .lshift = 0x1a, .overflow = 0x01 },
271 [0x8e] = { .lshift = 0x1c, .overflow = 0x01 },
272 [0x8f] = { .lshift = 0x1e, .overflow = 0x01 },
273 [0x90] = { .lshift = 0x20, .overflow = 0x01 },
274 [0x91] = { .lshift = 0x22, .overflow = 0x01 },
275 [0x92] = { .lshift = 0x24, .overflow = 0x01 },
276 [0x93] = { .lshift = 0x26, .overflow = 0x01 },
277 [0x94] = { .lshift = 0x28, .overflow = 0x01 },
278 [0x95] = { .lshift = 0x2a, .overflow = 0x01 },
279 [0x96] = { .lshift = 0x2c, .overflow = 0x01 },
280 [0x97] = { .lshift = 0x2e, .overflow = 0x01 },
281 [0x98] = { .lshift = 0x30, .overflow = 0x01 },
282 [0x99] = { .lshift = 0x32, .overflow = 0x01 },
283 [0x9a] = { .lshift = 0x34, .overflow = 0x01 },
284 [0x9b] = { .lshift = 0x36, .overflow = 0x01 },
285 [0x9c] = { .lshift = 0x38, .overflow = 0x01 },
286 [0x9d] = { .lshift = 0x3a, .overflow = 0x01 },
287 [0x9e] = { .lshift = 0x3c, .overflow = 0x01 },
288 [0x9f] = { .lshift = 0x3e, .overflow = 0x01 },
289 [0xa0] = { .lshift = 0x40, .overflow = 0x01 },
290 [0xa1] = { .lshift = 0x42, .overflow = 0x01 },
291 [0xa2] = { .lshift = 0x44, .overflow = 0x01 },
292 [0xa3] = { .lshift = 0x46, .overflow = 0x01 },
293 [0xa4] = { .lshift = 0x48, .overflow = 0x01 },
294 [0xa5] = { .lshift = 0x4a, .overflow = 0x01 },
295 [0xa6] = { .lshift = 0x4c, .overflow = 0x01 },
296 [0xa7] = { .lshift = 0x4e, .overflow = 0x01 },
297 [0xa8] = { .lshift = 0x50, .overflow = 0x01 },
298 [0xa9] = { .lshift = 0x52, .overflow = 0x01 },
299 [0xaa] = { .lshift = 0x54, .overflow = 0x01 },
300 [0xab] = { .lshift = 0x56, .overflow = 0x01 },
301 [0xac] = { .lshift = 0x58, .overflow = 0x01 },
302 [0xad] = { .lshift = 0x5a, .overflow = 0x01 },
303 [0xae] = { .lshift = 0x5c, .overflow = 0x01 },
304 [0xaf] = { .lshift = 0x5e, .overflow = 0x01 },
305 [0xb0] = { .lshift = 0x60, .overflow = 0x01 },
306 [0xb1] = { .lshift = 0x62, .overflow = 0x01 },
307 [0xb2] = { .lshift = 0x64, .overflow = 0x01 },
308 [0xb3] = { .lshift = 0x66, .overflow = 0x01 },
309 [0xb4] = { .lshift = 0x68, .overflow = 0x01 },
310 [0xb5] = { .lshift = 0x6a, .overflow = 0x01 },
311 [0xb6] = { .lshift = 0x6c, .overflow = 0x01 },
312 [0xb7] = { .lshift = 0x6e, .overflow = 0x01 },
313 [0xb8] = { .lshift = 0x70, .overflow = 0x01 },
314 [0xb9] = { .lshift = 0x72, .overflow = 0x01 },
315 [0xba] = { .lshift = 0x74, .overflow = 0x01 },
316 [0xbb] = { .lshift = 0x76, .overflow = 0x01 },
317 [0xbc] = { .lshift = 0x78, .overflow = 0x01 },
318 [0xbd] = { .lshift = 0x7a, .overflow = 0x01 },
319 [0xbe] = { .lshift = 0x7c, .overflow = 0x01 },
320 [0xbf] = { .lshift = 0x7e, .overflow = 0x01 },
321 [0xc0] = { .lshift = 0x80, .overflow = 0x01 },
322 [0xc1] = { .lshift = 0x82, .overflow = 0x01 },
323 [0xc2] = { .lshift = 0x84, .overflow = 0x01 },
324 [0xc3] = { .lshift = 0x86, .overflow = 0x01 },
325 [0xc4] = { .lshift = 0x88, .overflow = 0x01 },
326 [0xc5] = { .lshift = 0x8a, .overflow = 0x01 },
327 [0xc6] = { .lshift = 0x8c, .overflow = 0x01 },
328 [0xc7] = { .lshift = 0x8e, .overflow = 0x01 },
329 [0xc8] = { .lshift = 0x90, .overflow = 0x01 },
330 [0xc9] = { .lshift = 0x92, .overflow = 0x01 },
331 [0xca] = { .lshift = 0x94, .overflow = 0x01 },
332 [0xcb] = { .lshift = 0x96, .overflow = 0x01 },
333 [0xcc] = { .lshift = 0x98, .overflow = 0x01 },
334 [0xcd] = { .lshift = 0x9a, .overflow = 0x01 },
335 [0xce] = { .lshift = 0x9c, .overflow = 0x01 },
336 [0xcf] = { .lshift = 0x9e, .overflow = 0x01 },
337 [0xd0] = { .lshift = 0xa0, .overflow = 0x01 },
338 [0xd1] = { .lshift = 0xa2, .overflow = 0x01 },
339 [0xd2] = { .lshift = 0xa4, .overflow = 0x01 },
340 [0xd3] = { .lshift = 0xa6, .overflow = 0x01 },
341 [0xd4] = { .lshift = 0xa8, .overflow = 0x01 },
342 [0xd5] = { .lshift = 0xaa, .overflow = 0x01 },
343 [0xd6] = { .lshift = 0xac, .overflow = 0x01 },
344 [0xd7] = { .lshift = 0xae, .overflow = 0x01 },
345 [0xd8] = { .lshift = 0xb0, .overflow = 0x01 },
346 [0xd9] = { .lshift = 0xb2, .overflow = 0x01 },
347 [0xda] = { .lshift = 0xb4, .overflow = 0x01 },
348 [0xdb] = { .lshift = 0xb6, .overflow = 0x01 },
349 [0xdc] = { .lshift = 0xb8, .overflow = 0x01 },
350 [0xdd] = { .lshift = 0xba, .overflow = 0x01 },
351 [0xde] = { .lshift = 0xbc, .overflow = 0x01 },
352 [0xdf] = { .lshift = 0xbe, .overflow = 0x01 },
353 [0xe0] = { .lshift = 0xc0, .overflow = 0x01 },
354 [0xe1] = { .lshift = 0xc2, .overflow = 0x01 },
355 [0xe2] = { .lshift = 0xc4, .overflow = 0x01 },
356 [0xe3] = { .lshift = 0xc6, .overflow = 0x01 },
357 [0xe4] = { .lshift = 0xc8, .overflow = 0x01 },
358 [0xe5] = { .lshift = 0xca, .overflow = 0x01 },
359 [0xe6] = { .lshift = 0xcc, .overflow = 0x01 },
360 [0xe7] = { .lshift = 0xce, .overflow = 0x01 },
361 [0xe8] = { .lshift = 0xd0, .overflow = 0x01 },
362 [0xe9] = { .lshift = 0xd2, .overflow = 0x01 },
363 [0xea] = { .lshift = 0xd4, .overflow = 0x01 },
364 [0xeb] = { .lshift = 0xd6, .overflow = 0x01 },
365 [0xec] = { .lshift = 0xd8, .overflow = 0x01 },
366 [0xed] = { .lshift = 0xda, .overflow = 0x01 },
367 [0xee] = { .lshift = 0xdc, .overflow = 0x01 },
368 [0xef] = { .lshift = 0xde, .overflow = 0x01 },
369 [0xf0] = { .lshift = 0xe0, .overflow = 0x01 },
370 [0xf1] = { .lshift = 0xe2, .overflow = 0x01 },
371 [0xf2] = { .lshift = 0xe4, .overflow = 0x01 },
372 [0xf3] = { .lshift = 0xe6, .overflow = 0x01 },
373 [0xf4] = { .lshift = 0xe8, .overflow = 0x01 },
374 [0xf5] = { .lshift = 0xea, .overflow = 0x01 },
375 [0xf6] = { .lshift = 0xec, .overflow = 0x01 },
376 [0xf7] = { .lshift = 0xee, .overflow = 0x01 },
377 [0xf8] = { .lshift = 0xf0, .overflow = 0x01 },
378 [0xf9] = { .lshift = 0xf2, .overflow = 0x01 },
379 [0xfa] = { .lshift = 0xf4, .overflow = 0x01 },
380 [0xfb] = { .lshift = 0xf6, .overflow = 0x01 },
381 [0xfc] = { .lshift = 0xf8, .overflow = 0x01 },
382 [0xfd] = { .lshift = 0xfa, .overflow = 0x01 },
383 [0xfe] = { .lshift = 0xfc, .overflow = 0x01 },
384 [0xff] = { .lshift = 0xfe, .overflow = 0x01 },
386 int8_t i;
387 uint8_t overflow = 0;
389 for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) {
390 const struct aes_block_lshift_entry *e = &aes_block_lshift_table[in[i]];
391 out[i] = e->lshift | overflow;
392 overflow = e->overflow;
396 static inline void aes_block_rshift(const uint8_t in[AES_BLOCK_SIZE],
397 uint8_t out[AES_BLOCK_SIZE])
399 static const struct aes_block_rshift_entry {
400 uint8_t rshift;
401 uint8_t overflow;
402 } aes_block_rshift_table[UINT8_MAX+1] = {
403 [0x00] = { .rshift = 0x00, .overflow = 0x00 },
404 [0x01] = { .rshift = 0x00, .overflow = 0x80 },
405 [0x02] = { .rshift = 0x01, .overflow = 0x00 },
406 [0x03] = { .rshift = 0x01, .overflow = 0x80 },
407 [0x04] = { .rshift = 0x02, .overflow = 0x00 },
408 [0x05] = { .rshift = 0x02, .overflow = 0x80 },
409 [0x06] = { .rshift = 0x03, .overflow = 0x00 },
410 [0x07] = { .rshift = 0x03, .overflow = 0x80 },
411 [0x08] = { .rshift = 0x04, .overflow = 0x00 },
412 [0x09] = { .rshift = 0x04, .overflow = 0x80 },
413 [0x0a] = { .rshift = 0x05, .overflow = 0x00 },
414 [0x0b] = { .rshift = 0x05, .overflow = 0x80 },
415 [0x0c] = { .rshift = 0x06, .overflow = 0x00 },
416 [0x0d] = { .rshift = 0x06, .overflow = 0x80 },
417 [0x0e] = { .rshift = 0x07, .overflow = 0x00 },
418 [0x0f] = { .rshift = 0x07, .overflow = 0x80 },
419 [0x10] = { .rshift = 0x08, .overflow = 0x00 },
420 [0x11] = { .rshift = 0x08, .overflow = 0x80 },
421 [0x12] = { .rshift = 0x09, .overflow = 0x00 },
422 [0x13] = { .rshift = 0x09, .overflow = 0x80 },
423 [0x14] = { .rshift = 0x0a, .overflow = 0x00 },
424 [0x15] = { .rshift = 0x0a, .overflow = 0x80 },
425 [0x16] = { .rshift = 0x0b, .overflow = 0x00 },
426 [0x17] = { .rshift = 0x0b, .overflow = 0x80 },
427 [0x18] = { .rshift = 0x0c, .overflow = 0x00 },
428 [0x19] = { .rshift = 0x0c, .overflow = 0x80 },
429 [0x1a] = { .rshift = 0x0d, .overflow = 0x00 },
430 [0x1b] = { .rshift = 0x0d, .overflow = 0x80 },
431 [0x1c] = { .rshift = 0x0e, .overflow = 0x00 },
432 [0x1d] = { .rshift = 0x0e, .overflow = 0x80 },
433 [0x1e] = { .rshift = 0x0f, .overflow = 0x00 },
434 [0x1f] = { .rshift = 0x0f, .overflow = 0x80 },
435 [0x20] = { .rshift = 0x10, .overflow = 0x00 },
436 [0x21] = { .rshift = 0x10, .overflow = 0x80 },
437 [0x22] = { .rshift = 0x11, .overflow = 0x00 },
438 [0x23] = { .rshift = 0x11, .overflow = 0x80 },
439 [0x24] = { .rshift = 0x12, .overflow = 0x00 },
440 [0x25] = { .rshift = 0x12, .overflow = 0x80 },
441 [0x26] = { .rshift = 0x13, .overflow = 0x00 },
442 [0x27] = { .rshift = 0x13, .overflow = 0x80 },
443 [0x28] = { .rshift = 0x14, .overflow = 0x00 },
444 [0x29] = { .rshift = 0x14, .overflow = 0x80 },
445 [0x2a] = { .rshift = 0x15, .overflow = 0x00 },
446 [0x2b] = { .rshift = 0x15, .overflow = 0x80 },
447 [0x2c] = { .rshift = 0x16, .overflow = 0x00 },
448 [0x2d] = { .rshift = 0x16, .overflow = 0x80 },
449 [0x2e] = { .rshift = 0x17, .overflow = 0x00 },
450 [0x2f] = { .rshift = 0x17, .overflow = 0x80 },
451 [0x30] = { .rshift = 0x18, .overflow = 0x00 },
452 [0x31] = { .rshift = 0x18, .overflow = 0x80 },
453 [0x32] = { .rshift = 0x19, .overflow = 0x00 },
454 [0x33] = { .rshift = 0x19, .overflow = 0x80 },
455 [0x34] = { .rshift = 0x1a, .overflow = 0x00 },
456 [0x35] = { .rshift = 0x1a, .overflow = 0x80 },
457 [0x36] = { .rshift = 0x1b, .overflow = 0x00 },
458 [0x37] = { .rshift = 0x1b, .overflow = 0x80 },
459 [0x38] = { .rshift = 0x1c, .overflow = 0x00 },
460 [0x39] = { .rshift = 0x1c, .overflow = 0x80 },
461 [0x3a] = { .rshift = 0x1d, .overflow = 0x00 },
462 [0x3b] = { .rshift = 0x1d, .overflow = 0x80 },
463 [0x3c] = { .rshift = 0x1e, .overflow = 0x00 },
464 [0x3d] = { .rshift = 0x1e, .overflow = 0x80 },
465 [0x3e] = { .rshift = 0x1f, .overflow = 0x00 },
466 [0x3f] = { .rshift = 0x1f, .overflow = 0x80 },
467 [0x40] = { .rshift = 0x20, .overflow = 0x00 },
468 [0x41] = { .rshift = 0x20, .overflow = 0x80 },
469 [0x42] = { .rshift = 0x21, .overflow = 0x00 },
470 [0x43] = { .rshift = 0x21, .overflow = 0x80 },
471 [0x44] = { .rshift = 0x22, .overflow = 0x00 },
472 [0x45] = { .rshift = 0x22, .overflow = 0x80 },
473 [0x46] = { .rshift = 0x23, .overflow = 0x00 },
474 [0x47] = { .rshift = 0x23, .overflow = 0x80 },
475 [0x48] = { .rshift = 0x24, .overflow = 0x00 },
476 [0x49] = { .rshift = 0x24, .overflow = 0x80 },
477 [0x4a] = { .rshift = 0x25, .overflow = 0x00 },
478 [0x4b] = { .rshift = 0x25, .overflow = 0x80 },
479 [0x4c] = { .rshift = 0x26, .overflow = 0x00 },
480 [0x4d] = { .rshift = 0x26, .overflow = 0x80 },
481 [0x4e] = { .rshift = 0x27, .overflow = 0x00 },
482 [0x4f] = { .rshift = 0x27, .overflow = 0x80 },
483 [0x50] = { .rshift = 0x28, .overflow = 0x00 },
484 [0x51] = { .rshift = 0x28, .overflow = 0x80 },
485 [0x52] = { .rshift = 0x29, .overflow = 0x00 },
486 [0x53] = { .rshift = 0x29, .overflow = 0x80 },
487 [0x54] = { .rshift = 0x2a, .overflow = 0x00 },
488 [0x55] = { .rshift = 0x2a, .overflow = 0x80 },
489 [0x56] = { .rshift = 0x2b, .overflow = 0x00 },
490 [0x57] = { .rshift = 0x2b, .overflow = 0x80 },
491 [0x58] = { .rshift = 0x2c, .overflow = 0x00 },
492 [0x59] = { .rshift = 0x2c, .overflow = 0x80 },
493 [0x5a] = { .rshift = 0x2d, .overflow = 0x00 },
494 [0x5b] = { .rshift = 0x2d, .overflow = 0x80 },
495 [0x5c] = { .rshift = 0x2e, .overflow = 0x00 },
496 [0x5d] = { .rshift = 0x2e, .overflow = 0x80 },
497 [0x5e] = { .rshift = 0x2f, .overflow = 0x00 },
498 [0x5f] = { .rshift = 0x2f, .overflow = 0x80 },
499 [0x60] = { .rshift = 0x30, .overflow = 0x00 },
500 [0x61] = { .rshift = 0x30, .overflow = 0x80 },
501 [0x62] = { .rshift = 0x31, .overflow = 0x00 },
502 [0x63] = { .rshift = 0x31, .overflow = 0x80 },
503 [0x64] = { .rshift = 0x32, .overflow = 0x00 },
504 [0x65] = { .rshift = 0x32, .overflow = 0x80 },
505 [0x66] = { .rshift = 0x33, .overflow = 0x00 },
506 [0x67] = { .rshift = 0x33, .overflow = 0x80 },
507 [0x68] = { .rshift = 0x34, .overflow = 0x00 },
508 [0x69] = { .rshift = 0x34, .overflow = 0x80 },
509 [0x6a] = { .rshift = 0x35, .overflow = 0x00 },
510 [0x6b] = { .rshift = 0x35, .overflow = 0x80 },
511 [0x6c] = { .rshift = 0x36, .overflow = 0x00 },
512 [0x6d] = { .rshift = 0x36, .overflow = 0x80 },
513 [0x6e] = { .rshift = 0x37, .overflow = 0x00 },
514 [0x6f] = { .rshift = 0x37, .overflow = 0x80 },
515 [0x70] = { .rshift = 0x38, .overflow = 0x00 },
516 [0x71] = { .rshift = 0x38, .overflow = 0x80 },
517 [0x72] = { .rshift = 0x39, .overflow = 0x00 },
518 [0x73] = { .rshift = 0x39, .overflow = 0x80 },
519 [0x74] = { .rshift = 0x3a, .overflow = 0x00 },
520 [0x75] = { .rshift = 0x3a, .overflow = 0x80 },
521 [0x76] = { .rshift = 0x3b, .overflow = 0x00 },
522 [0x77] = { .rshift = 0x3b, .overflow = 0x80 },
523 [0x78] = { .rshift = 0x3c, .overflow = 0x00 },
524 [0x79] = { .rshift = 0x3c, .overflow = 0x80 },
525 [0x7a] = { .rshift = 0x3d, .overflow = 0x00 },
526 [0x7b] = { .rshift = 0x3d, .overflow = 0x80 },
527 [0x7c] = { .rshift = 0x3e, .overflow = 0x00 },
528 [0x7d] = { .rshift = 0x3e, .overflow = 0x80 },
529 [0x7e] = { .rshift = 0x3f, .overflow = 0x00 },
530 [0x7f] = { .rshift = 0x3f, .overflow = 0x80 },
531 [0x80] = { .rshift = 0x40, .overflow = 0x00 },
532 [0x81] = { .rshift = 0x40, .overflow = 0x80 },
533 [0x82] = { .rshift = 0x41, .overflow = 0x00 },
534 [0x83] = { .rshift = 0x41, .overflow = 0x80 },
535 [0x84] = { .rshift = 0x42, .overflow = 0x00 },
536 [0x85] = { .rshift = 0x42, .overflow = 0x80 },
537 [0x86] = { .rshift = 0x43, .overflow = 0x00 },
538 [0x87] = { .rshift = 0x43, .overflow = 0x80 },
539 [0x88] = { .rshift = 0x44, .overflow = 0x00 },
540 [0x89] = { .rshift = 0x44, .overflow = 0x80 },
541 [0x8a] = { .rshift = 0x45, .overflow = 0x00 },
542 [0x8b] = { .rshift = 0x45, .overflow = 0x80 },
543 [0x8c] = { .rshift = 0x46, .overflow = 0x00 },
544 [0x8d] = { .rshift = 0x46, .overflow = 0x80 },
545 [0x8e] = { .rshift = 0x47, .overflow = 0x00 },
546 [0x8f] = { .rshift = 0x47, .overflow = 0x80 },
547 [0x90] = { .rshift = 0x48, .overflow = 0x00 },
548 [0x91] = { .rshift = 0x48, .overflow = 0x80 },
549 [0x92] = { .rshift = 0x49, .overflow = 0x00 },
550 [0x93] = { .rshift = 0x49, .overflow = 0x80 },
551 [0x94] = { .rshift = 0x4a, .overflow = 0x00 },
552 [0x95] = { .rshift = 0x4a, .overflow = 0x80 },
553 [0x96] = { .rshift = 0x4b, .overflow = 0x00 },
554 [0x97] = { .rshift = 0x4b, .overflow = 0x80 },
555 [0x98] = { .rshift = 0x4c, .overflow = 0x00 },
556 [0x99] = { .rshift = 0x4c, .overflow = 0x80 },
557 [0x9a] = { .rshift = 0x4d, .overflow = 0x00 },
558 [0x9b] = { .rshift = 0x4d, .overflow = 0x80 },
559 [0x9c] = { .rshift = 0x4e, .overflow = 0x00 },
560 [0x9d] = { .rshift = 0x4e, .overflow = 0x80 },
561 [0x9e] = { .rshift = 0x4f, .overflow = 0x00 },
562 [0x9f] = { .rshift = 0x4f, .overflow = 0x80 },
563 [0xa0] = { .rshift = 0x50, .overflow = 0x00 },
564 [0xa1] = { .rshift = 0x50, .overflow = 0x80 },
565 [0xa2] = { .rshift = 0x51, .overflow = 0x00 },
566 [0xa3] = { .rshift = 0x51, .overflow = 0x80 },
567 [0xa4] = { .rshift = 0x52, .overflow = 0x00 },
568 [0xa5] = { .rshift = 0x52, .overflow = 0x80 },
569 [0xa6] = { .rshift = 0x53, .overflow = 0x00 },
570 [0xa7] = { .rshift = 0x53, .overflow = 0x80 },
571 [0xa8] = { .rshift = 0x54, .overflow = 0x00 },
572 [0xa9] = { .rshift = 0x54, .overflow = 0x80 },
573 [0xaa] = { .rshift = 0x55, .overflow = 0x00 },
574 [0xab] = { .rshift = 0x55, .overflow = 0x80 },
575 [0xac] = { .rshift = 0x56, .overflow = 0x00 },
576 [0xad] = { .rshift = 0x56, .overflow = 0x80 },
577 [0xae] = { .rshift = 0x57, .overflow = 0x00 },
578 [0xaf] = { .rshift = 0x57, .overflow = 0x80 },
579 [0xb0] = { .rshift = 0x58, .overflow = 0x00 },
580 [0xb1] = { .rshift = 0x58, .overflow = 0x80 },
581 [0xb2] = { .rshift = 0x59, .overflow = 0x00 },
582 [0xb3] = { .rshift = 0x59, .overflow = 0x80 },
583 [0xb4] = { .rshift = 0x5a, .overflow = 0x00 },
584 [0xb5] = { .rshift = 0x5a, .overflow = 0x80 },
585 [0xb6] = { .rshift = 0x5b, .overflow = 0x00 },
586 [0xb7] = { .rshift = 0x5b, .overflow = 0x80 },
587 [0xb8] = { .rshift = 0x5c, .overflow = 0x00 },
588 [0xb9] = { .rshift = 0x5c, .overflow = 0x80 },
589 [0xba] = { .rshift = 0x5d, .overflow = 0x00 },
590 [0xbb] = { .rshift = 0x5d, .overflow = 0x80 },
591 [0xbc] = { .rshift = 0x5e, .overflow = 0x00 },
592 [0xbd] = { .rshift = 0x5e, .overflow = 0x80 },
593 [0xbe] = { .rshift = 0x5f, .overflow = 0x00 },
594 [0xbf] = { .rshift = 0x5f, .overflow = 0x80 },
595 [0xc0] = { .rshift = 0x60, .overflow = 0x00 },
596 [0xc1] = { .rshift = 0x60, .overflow = 0x80 },
597 [0xc2] = { .rshift = 0x61, .overflow = 0x00 },
598 [0xc3] = { .rshift = 0x61, .overflow = 0x80 },
599 [0xc4] = { .rshift = 0x62, .overflow = 0x00 },
600 [0xc5] = { .rshift = 0x62, .overflow = 0x80 },
601 [0xc6] = { .rshift = 0x63, .overflow = 0x00 },
602 [0xc7] = { .rshift = 0x63, .overflow = 0x80 },
603 [0xc8] = { .rshift = 0x64, .overflow = 0x00 },
604 [0xc9] = { .rshift = 0x64, .overflow = 0x80 },
605 [0xca] = { .rshift = 0x65, .overflow = 0x00 },
606 [0xcb] = { .rshift = 0x65, .overflow = 0x80 },
607 [0xcc] = { .rshift = 0x66, .overflow = 0x00 },
608 [0xcd] = { .rshift = 0x66, .overflow = 0x80 },
609 [0xce] = { .rshift = 0x67, .overflow = 0x00 },
610 [0xcf] = { .rshift = 0x67, .overflow = 0x80 },
611 [0xd0] = { .rshift = 0x68, .overflow = 0x00 },
612 [0xd1] = { .rshift = 0x68, .overflow = 0x80 },
613 [0xd2] = { .rshift = 0x69, .overflow = 0x00 },
614 [0xd3] = { .rshift = 0x69, .overflow = 0x80 },
615 [0xd4] = { .rshift = 0x6a, .overflow = 0x00 },
616 [0xd5] = { .rshift = 0x6a, .overflow = 0x80 },
617 [0xd6] = { .rshift = 0x6b, .overflow = 0x00 },
618 [0xd7] = { .rshift = 0x6b, .overflow = 0x80 },
619 [0xd8] = { .rshift = 0x6c, .overflow = 0x00 },
620 [0xd9] = { .rshift = 0x6c, .overflow = 0x80 },
621 [0xda] = { .rshift = 0x6d, .overflow = 0x00 },
622 [0xdb] = { .rshift = 0x6d, .overflow = 0x80 },
623 [0xdc] = { .rshift = 0x6e, .overflow = 0x00 },
624 [0xdd] = { .rshift = 0x6e, .overflow = 0x80 },
625 [0xde] = { .rshift = 0x6f, .overflow = 0x00 },
626 [0xdf] = { .rshift = 0x6f, .overflow = 0x80 },
627 [0xe0] = { .rshift = 0x70, .overflow = 0x00 },
628 [0xe1] = { .rshift = 0x70, .overflow = 0x80 },
629 [0xe2] = { .rshift = 0x71, .overflow = 0x00 },
630 [0xe3] = { .rshift = 0x71, .overflow = 0x80 },
631 [0xe4] = { .rshift = 0x72, .overflow = 0x00 },
632 [0xe5] = { .rshift = 0x72, .overflow = 0x80 },
633 [0xe6] = { .rshift = 0x73, .overflow = 0x00 },
634 [0xe7] = { .rshift = 0x73, .overflow = 0x80 },
635 [0xe8] = { .rshift = 0x74, .overflow = 0x00 },
636 [0xe9] = { .rshift = 0x74, .overflow = 0x80 },
637 [0xea] = { .rshift = 0x75, .overflow = 0x00 },
638 [0xeb] = { .rshift = 0x75, .overflow = 0x80 },
639 [0xec] = { .rshift = 0x76, .overflow = 0x00 },
640 [0xed] = { .rshift = 0x76, .overflow = 0x80 },
641 [0xee] = { .rshift = 0x77, .overflow = 0x00 },
642 [0xef] = { .rshift = 0x77, .overflow = 0x80 },
643 [0xf0] = { .rshift = 0x78, .overflow = 0x00 },
644 [0xf1] = { .rshift = 0x78, .overflow = 0x80 },
645 [0xf2] = { .rshift = 0x79, .overflow = 0x00 },
646 [0xf3] = { .rshift = 0x79, .overflow = 0x80 },
647 [0xf4] = { .rshift = 0x7a, .overflow = 0x00 },
648 [0xf5] = { .rshift = 0x7a, .overflow = 0x80 },
649 [0xf6] = { .rshift = 0x7b, .overflow = 0x00 },
650 [0xf7] = { .rshift = 0x7b, .overflow = 0x80 },
651 [0xf8] = { .rshift = 0x7c, .overflow = 0x00 },
652 [0xf9] = { .rshift = 0x7c, .overflow = 0x80 },
653 [0xfa] = { .rshift = 0x7d, .overflow = 0x00 },
654 [0xfb] = { .rshift = 0x7d, .overflow = 0x80 },
655 [0xfc] = { .rshift = 0x7e, .overflow = 0x00 },
656 [0xfd] = { .rshift = 0x7e, .overflow = 0x80 },
657 [0xfe] = { .rshift = 0x7f, .overflow = 0x00 },
658 [0xff] = { .rshift = 0x7f, .overflow = 0x80 },
660 uint8_t i;
661 uint8_t overflow = 0;
663 for (i = 0; i < AES_BLOCK_SIZE; i++) {
664 const struct aes_block_rshift_entry *e = &aes_block_rshift_table[in[i]];
665 out[i] = e->rshift | overflow;
666 overflow = e->overflow;
669 #endif /* LIB_CRYPTO_AES_H */