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