1 /*
2 * FIPS-197 compliant AES implementation
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 */
7 /*
8 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
9 *
10 * https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf
11 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
12 */
13
14 #include "common.h"
15
16 #if defined(MBEDTLS_AES_C)
17
18 #include <string.h>
19
20 #include "mbedtls/aes.h"
21 #include "mbedtls/platform.h"
22 #include "mbedtls/platform_util.h"
23 #include "mbedtls/error.h"
24
25 #if defined(MBEDTLS_ARCH_IS_ARM64)
26 #if !defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
27 #error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
28 #endif
29 #endif
30
31 #if defined(MBEDTLS_ARCH_IS_X64)
32 #if !defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
33 #error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
34 #endif
35 #endif
36
37 #if defined(MBEDTLS_ARCH_IS_X86)
38 #if defined(MBEDTLS_AES_USE_HARDWARE_ONLY) && !defined(MBEDTLS_AESNI_C)
39 #error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
40 #endif
41
42 #if defined(MBEDTLS_PADLOCK_C)
43 #if !defined(MBEDTLS_HAVE_ASM)
44 #error "MBEDTLS_PADLOCK_C defined, but not all prerequisites"
45 #endif
46 #if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
47 #error "MBEDTLS_AES_USE_HARDWARE_ONLY cannot be defined when " \
48 "MBEDTLS_PADLOCK_C is set"
49 #endif
50 #endif
51 #endif
52
53 #if defined(MBEDTLS_PADLOCK_C)
54 #include "padlock.h"
55 #endif
56 #if defined(MBEDTLS_AESNI_C)
57 #include "aesni.h"
58 #endif
59 #if defined(MBEDTLS_AESCE_C)
60 #include "aesce.h"
61 #endif
62
63 #include "mbedtls/platform.h"
64
65 #if !defined(MBEDTLS_AES_ALT)
66
67 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
68 static int aes_padlock_ace = -1;
69 #endif
70
71 #if defined(MBEDTLS_AES_ROM_TABLES)
72 /*
73 * Forward S-box
74 */
75 #if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \
76 !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
77 static const unsigned char FSb[256] =
78 {
79 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
80 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
81 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
82 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
83 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
84 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
85 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
86 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
87 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
88 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
89 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
90 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
91 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
92 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
93 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
94 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
95 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
96 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
97 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
98 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
99 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
100 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
101 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
102 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
103 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
104 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
105 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
106 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
107 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
108 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
109 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
110 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
111 };
112 #endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \
113 !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */
114
115 /*
116 * Forward tables
117 */
118 #define FT \
119 \
120 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
121 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
122 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
123 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
124 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
125 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
126 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
127 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
128 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
129 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
130 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
131 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
132 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
133 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
134 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
135 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
136 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
137 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
138 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
139 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
140 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
141 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
142 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
143 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
144 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
145 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
146 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
147 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
148 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
149 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
150 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
151 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
152 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
153 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
154 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
155 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
156 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
157 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
158 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
159 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
160 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
161 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
162 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
163 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
164 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
165 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
166 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
167 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
168 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
169 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
170 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
171 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
172 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
173 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
174 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
175 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
176 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
177 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
178 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
179 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
180 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
181 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
182 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
183 V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
184
185 #if !defined(MBEDTLS_AES_ENCRYPT_ALT)
186 #define V(a, b, c, d) 0x##a##b##c##d
187 static const uint32_t FT0[256] = { FT };
188 #undef V
189
190 #if !defined(MBEDTLS_AES_FEWER_TABLES)
191
192 #define V(a, b, c, d) 0x##b##c##d##a
193 static const uint32_t FT1[256] = { FT };
194 #undef V
195
196 #define V(a, b, c, d) 0x##c##d##a##b
197 static const uint32_t FT2[256] = { FT };
198 #undef V
199
200 #define V(a, b, c, d) 0x##d##a##b##c
201 static const uint32_t FT3[256] = { FT };
202 #undef V
203
204 #endif /* !MBEDTLS_AES_FEWER_TABLES */
205
206 #endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) */
207
208 #undef FT
209
210 #if !defined(MBEDTLS_AES_DECRYPT_ALT)
211 /*
212 * Reverse S-box
213 */
214 static const unsigned char RSb[256] =
215 {
216 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
217 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
218 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
219 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
220 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
221 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
222 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
223 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
224 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
225 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
226 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
227 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
228 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
229 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
230 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
231 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
232 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
233 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
234 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
235 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
236 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
237 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
238 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
239 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
240 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
241 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
242 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
243 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
244 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
245 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
246 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
247 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
248 };
249 #endif /* defined(MBEDTLS_AES_DECRYPT_ALT)) */
250
251 /*
252 * Reverse tables
253 */
254 #define RT \
255 \
256 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
257 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
258 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
259 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
260 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
261 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
262 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
263 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
264 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
265 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
266 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
267 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
268 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
269 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
270 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
271 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
272 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
273 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
274 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
275 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
276 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
277 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
278 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
279 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
280 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
281 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
282 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
283 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
284 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
285 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
286 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
287 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
288 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
289 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
290 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
291 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
292 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
293 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
294 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
295 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
296 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
297 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
298 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
299 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
300 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
301 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
302 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
303 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
304 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
305 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
306 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
307 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
308 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
309 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
310 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
311 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
312 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
313 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
314 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
315 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
316 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
317 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
318 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
319 V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
320
321 #if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
322
323 #define V(a, b, c, d) 0x##a##b##c##d
324 static const uint32_t RT0[256] = { RT };
325 #undef V
326
327 #if !defined(MBEDTLS_AES_FEWER_TABLES)
328
329 #define V(a, b, c, d) 0x##b##c##d##a
330 static const uint32_t RT1[256] = { RT };
331 #undef V
332
333 #define V(a, b, c, d) 0x##c##d##a##b
334 static const uint32_t RT2[256] = { RT };
335 #undef V
336
337 #define V(a, b, c, d) 0x##d##a##b##c
338 static const uint32_t RT3[256] = { RT };
339 #undef V
340
341 #endif /* !MBEDTLS_AES_FEWER_TABLES */
342
343 #endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */
344
345 #undef RT
346
347 #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
348 /*
349 * Round constants
350 */
351 static const uint32_t RCON[10] =
352 {
353 0x00000001, 0x00000002, 0x00000004, 0x00000008,
354 0x00000010, 0x00000020, 0x00000040, 0x00000080,
355 0x0000001B, 0x00000036
356 };
357 #endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
358
359 #else /* MBEDTLS_AES_ROM_TABLES */
360
361 /*
362 * Forward S-box & tables
363 */
364 #if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \
365 !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
366 static unsigned char FSb[256];
367 #endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \
368 !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */
369 #if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
370 static uint32_t FT0[256];
371 #if !defined(MBEDTLS_AES_FEWER_TABLES)
372 static uint32_t FT1[256];
373 static uint32_t FT2[256];
374 static uint32_t FT3[256];
375 #endif /* !MBEDTLS_AES_FEWER_TABLES */
376 #endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
377
378 /*
379 * Reverse S-box & tables
380 */
381 #if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT))
382 static unsigned char RSb[256];
383 #endif /* !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT)) */
384
385 #if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
386 static uint32_t RT0[256];
387 #if !defined(MBEDTLS_AES_FEWER_TABLES)
388 static uint32_t RT1[256];
389 static uint32_t RT2[256];
390 static uint32_t RT3[256];
391 #endif /* !MBEDTLS_AES_FEWER_TABLES */
392 #endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */
393
394 #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
395 /*
396 * Round constants
397 */
398 static uint32_t RCON[10];
399
400 /*
401 * Tables generation code
402 */
403 #define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
404 #define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
405 #define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
406
407 static int aes_init_done = 0;
408
aes_gen_tables(void)409 static void aes_gen_tables(void)
410 {
411 int i;
412 uint8_t x, y, z;
413 uint8_t pow[256];
414 uint8_t log[256];
415
416 /*
417 * compute pow and log tables over GF(2^8)
418 */
419 for (i = 0, x = 1; i < 256; i++) {
420 pow[i] = x;
421 log[x] = (uint8_t) i;
422 x ^= XTIME(x);
423 }
424
425 /*
426 * calculate the round constants
427 */
428 for (i = 0, x = 1; i < 10; i++) {
429 RCON[i] = x;
430 x = XTIME(x);
431 }
432
433 /*
434 * generate the forward and reverse S-boxes
435 */
436 FSb[0x00] = 0x63;
437 RSb[0x63] = 0x00;
438
439 for (i = 1; i < 256; i++) {
440 x = pow[255 - log[i]];
441
442 y = x; y = (y << 1) | (y >> 7);
443 x ^= y; y = (y << 1) | (y >> 7);
444 x ^= y; y = (y << 1) | (y >> 7);
445 x ^= y; y = (y << 1) | (y >> 7);
446 x ^= y ^ 0x63;
447
448 FSb[i] = x;
449 RSb[x] = (unsigned char) i;
450 }
451
452 /*
453 * generate the forward and reverse tables
454 */
455 for (i = 0; i < 256; i++) {
456 x = FSb[i];
457 y = XTIME(x);
458 z = y ^ x;
459
460 FT0[i] = ((uint32_t) y) ^
461 ((uint32_t) x << 8) ^
462 ((uint32_t) x << 16) ^
463 ((uint32_t) z << 24);
464
465 #if !defined(MBEDTLS_AES_FEWER_TABLES)
466 FT1[i] = ROTL8(FT0[i]);
467 FT2[i] = ROTL8(FT1[i]);
468 FT3[i] = ROTL8(FT2[i]);
469 #endif /* !MBEDTLS_AES_FEWER_TABLES */
470
471 x = RSb[i];
472
473 #if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
474 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
475 ((uint32_t) MUL(0x09, x) << 8) ^
476 ((uint32_t) MUL(0x0D, x) << 16) ^
477 ((uint32_t) MUL(0x0B, x) << 24);
478
479 #if !defined(MBEDTLS_AES_FEWER_TABLES)
480 RT1[i] = ROTL8(RT0[i]);
481 RT2[i] = ROTL8(RT1[i]);
482 RT3[i] = ROTL8(RT2[i]);
483 #endif /* !MBEDTLS_AES_FEWER_TABLES */
484 #endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */
485 }
486 }
487
488 #endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
489
490 #undef ROTL8
491
492 #endif /* MBEDTLS_AES_ROM_TABLES */
493
494 #if defined(MBEDTLS_AES_FEWER_TABLES)
495
496 #define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
497 #define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
498 #define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
499
500 #define AES_RT0(idx) RT0[idx]
501 #define AES_RT1(idx) ROTL8(RT0[idx])
502 #define AES_RT2(idx) ROTL16(RT0[idx])
503 #define AES_RT3(idx) ROTL24(RT0[idx])
504
505 #define AES_FT0(idx) FT0[idx]
506 #define AES_FT1(idx) ROTL8(FT0[idx])
507 #define AES_FT2(idx) ROTL16(FT0[idx])
508 #define AES_FT3(idx) ROTL24(FT0[idx])
509
510 #else /* MBEDTLS_AES_FEWER_TABLES */
511
512 #define AES_RT0(idx) RT0[idx]
513 #define AES_RT1(idx) RT1[idx]
514 #define AES_RT2(idx) RT2[idx]
515 #define AES_RT3(idx) RT3[idx]
516
517 #define AES_FT0(idx) FT0[idx]
518 #define AES_FT1(idx) FT1[idx]
519 #define AES_FT2(idx) FT2[idx]
520 #define AES_FT3(idx) FT3[idx]
521
522 #endif /* MBEDTLS_AES_FEWER_TABLES */
523
mbedtls_aes_init(mbedtls_aes_context * ctx)524 void mbedtls_aes_init(mbedtls_aes_context *ctx)
525 {
526 memset(ctx, 0, sizeof(mbedtls_aes_context));
527 }
528
mbedtls_aes_free(mbedtls_aes_context * ctx)529 void mbedtls_aes_free(mbedtls_aes_context *ctx)
530 {
531 if (ctx == NULL) {
532 return;
533 }
534
535 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
536 }
537
538 #if defined(MBEDTLS_CIPHER_MODE_XTS)
mbedtls_aes_xts_init(mbedtls_aes_xts_context * ctx)539 void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
540 {
541 mbedtls_aes_init(&ctx->crypt);
542 mbedtls_aes_init(&ctx->tweak);
543 }
544
mbedtls_aes_xts_free(mbedtls_aes_xts_context * ctx)545 void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
546 {
547 if (ctx == NULL) {
548 return;
549 }
550
551 mbedtls_aes_free(&ctx->crypt);
552 mbedtls_aes_free(&ctx->tweak);
553 }
554 #endif /* MBEDTLS_CIPHER_MODE_XTS */
555
556 /* Some implementations need the round keys to be aligned.
557 * Return an offset to be added to buf, such that (buf + offset) is
558 * correctly aligned.
559 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
560 * i.e. an offset of 1 means 4 bytes and so on.
561 */
562 #if (defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)) || \
563 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
564 #define MAY_NEED_TO_ALIGN
565 #endif
566
567 #if defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || \
568 !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
mbedtls_aes_rk_offset(uint32_t * buf)569 static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
570 {
571 #if defined(MAY_NEED_TO_ALIGN)
572 int align_16_bytes = 0;
573
574 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
575 if (aes_padlock_ace == -1) {
576 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
577 }
578 if (aes_padlock_ace) {
579 align_16_bytes = 1;
580 }
581 #endif
582
583 #if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
584 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
585 align_16_bytes = 1;
586 }
587 #endif
588
589 if (align_16_bytes) {
590 /* These implementations needs 16-byte alignment
591 * for the round key array. */
592 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
593 if (delta == 0) {
594 return 0;
595 } else {
596 return 4 - delta; // 16 bytes = 4 uint32_t
597 }
598 }
599 #else /* MAY_NEED_TO_ALIGN */
600 (void) buf;
601 #endif /* MAY_NEED_TO_ALIGN */
602
603 return 0;
604 }
605 #endif /* defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || \
606 !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
607
608 /*
609 * AES key schedule (encryption)
610 */
611 #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
mbedtls_aes_setkey_enc(mbedtls_aes_context * ctx,const unsigned char * key,unsigned int keybits)612 int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
613 unsigned int keybits)
614 {
615 uint32_t *RK;
616
617 switch (keybits) {
618 case 128: ctx->nr = 10; break;
619 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
620 case 192: ctx->nr = 12; break;
621 case 256: ctx->nr = 14; break;
622 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
623 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
624 }
625
626 #if !defined(MBEDTLS_AES_ROM_TABLES)
627 if (aes_init_done == 0) {
628 aes_gen_tables();
629 aes_init_done = 1;
630 }
631 #endif
632
633 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
634 RK = ctx->buf + ctx->rk_offset;
635
636 #if defined(MBEDTLS_AESNI_HAVE_CODE)
637 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
638 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
639 }
640 #endif
641
642 #if defined(MBEDTLS_AESCE_HAVE_CODE)
643 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
644 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
645 }
646 #endif
647
648 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
649 for (unsigned int i = 0; i < (keybits >> 5); i++) {
650 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
651 }
652
653 switch (ctx->nr) {
654 case 10:
655
656 for (unsigned int i = 0; i < 10; i++, RK += 4) {
657 RK[4] = RK[0] ^ RCON[i] ^
658 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
659 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
660 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
661 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
662
663 RK[5] = RK[1] ^ RK[4];
664 RK[6] = RK[2] ^ RK[5];
665 RK[7] = RK[3] ^ RK[6];
666 }
667 break;
668
669 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
670 case 12:
671
672 for (unsigned int i = 0; i < 8; i++, RK += 6) {
673 RK[6] = RK[0] ^ RCON[i] ^
674 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
675 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
676 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
677 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
678
679 RK[7] = RK[1] ^ RK[6];
680 RK[8] = RK[2] ^ RK[7];
681 RK[9] = RK[3] ^ RK[8];
682 RK[10] = RK[4] ^ RK[9];
683 RK[11] = RK[5] ^ RK[10];
684 }
685 break;
686
687 case 14:
688
689 for (unsigned int i = 0; i < 7; i++, RK += 8) {
690 RK[8] = RK[0] ^ RCON[i] ^
691 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
692 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
693 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
694 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
695
696 RK[9] = RK[1] ^ RK[8];
697 RK[10] = RK[2] ^ RK[9];
698 RK[11] = RK[3] ^ RK[10];
699
700 RK[12] = RK[4] ^
701 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
702 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
703 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
704 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
705
706 RK[13] = RK[5] ^ RK[12];
707 RK[14] = RK[6] ^ RK[13];
708 RK[15] = RK[7] ^ RK[14];
709 }
710 break;
711 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
712 }
713
714 return 0;
715 #endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
716 }
717 #endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
718
719 /*
720 * AES key schedule (decryption)
721 */
722 #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
mbedtls_aes_setkey_dec(mbedtls_aes_context * ctx,const unsigned char * key,unsigned int keybits)723 int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
724 unsigned int keybits)
725 {
726 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
727 uint32_t *SK;
728 #endif
729 int ret;
730 mbedtls_aes_context cty;
731 uint32_t *RK;
732
733
734 mbedtls_aes_init(&cty);
735
736 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
737 RK = ctx->buf + ctx->rk_offset;
738
739 /* Also checks keybits */
740 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
741 goto exit;
742 }
743
744 ctx->nr = cty.nr;
745
746 #if defined(MBEDTLS_AESNI_HAVE_CODE)
747 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
748 mbedtls_aesni_inverse_key((unsigned char *) RK,
749 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
750 goto exit;
751 }
752 #endif
753
754 #if defined(MBEDTLS_AESCE_HAVE_CODE)
755 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
756 mbedtls_aesce_inverse_key(
757 (unsigned char *) RK,
758 (const unsigned char *) (cty.buf + cty.rk_offset),
759 ctx->nr);
760 goto exit;
761 }
762 #endif
763
764 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
765 SK = cty.buf + cty.rk_offset + cty.nr * 4;
766
767 *RK++ = *SK++;
768 *RK++ = *SK++;
769 *RK++ = *SK++;
770 *RK++ = *SK++;
771 SK -= 8;
772 for (int i = ctx->nr - 1; i > 0; i--, SK -= 8) {
773 for (int j = 0; j < 4; j++, SK++) {
774 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
775 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
776 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
777 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
778 }
779 }
780
781 *RK++ = *SK++;
782 *RK++ = *SK++;
783 *RK++ = *SK++;
784 *RK++ = *SK++;
785 #endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
786 exit:
787 mbedtls_aes_free(&cty);
788
789 return ret;
790 }
791 #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
792
793 #if defined(MBEDTLS_CIPHER_MODE_XTS)
mbedtls_aes_xts_decode_keys(const unsigned char * key,unsigned int keybits,const unsigned char ** key1,unsigned int * key1bits,const unsigned char ** key2,unsigned int * key2bits)794 static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
795 unsigned int keybits,
796 const unsigned char **key1,
797 unsigned int *key1bits,
798 const unsigned char **key2,
799 unsigned int *key2bits)
800 {
801 const unsigned int half_keybits = keybits / 2;
802 const unsigned int half_keybytes = half_keybits / 8;
803
804 switch (keybits) {
805 case 256: break;
806 case 512: break;
807 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
808 }
809
810 *key1bits = half_keybits;
811 *key2bits = half_keybits;
812 *key1 = &key[0];
813 *key2 = &key[half_keybytes];
814
815 return 0;
816 }
817
mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context * ctx,const unsigned char * key,unsigned int keybits)818 int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
819 const unsigned char *key,
820 unsigned int keybits)
821 {
822 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
823 const unsigned char *key1, *key2;
824 unsigned int key1bits, key2bits;
825
826 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
827 &key2, &key2bits);
828 if (ret != 0) {
829 return ret;
830 }
831
832 /* Set the tweak key. Always set tweak key for the encryption mode. */
833 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
834 if (ret != 0) {
835 return ret;
836 }
837
838 /* Set crypt key for encryption. */
839 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
840 }
841
mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context * ctx,const unsigned char * key,unsigned int keybits)842 int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
843 const unsigned char *key,
844 unsigned int keybits)
845 {
846 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
847 const unsigned char *key1, *key2;
848 unsigned int key1bits, key2bits;
849
850 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
851 &key2, &key2bits);
852 if (ret != 0) {
853 return ret;
854 }
855
856 /* Set the tweak key. Always set tweak key for encryption. */
857 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
858 if (ret != 0) {
859 return ret;
860 }
861
862 /* Set crypt key for decryption. */
863 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
864 }
865 #endif /* MBEDTLS_CIPHER_MODE_XTS */
866
867 #define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
868 do \
869 { \
870 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
871 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
872 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
873 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
874 \
875 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
876 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
877 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
878 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
879 \
880 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
881 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
882 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
883 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
884 \
885 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
886 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
887 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
888 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
889 } while (0)
890
891 #define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
892 do \
893 { \
894 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
895 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
896 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
897 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
898 \
899 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
900 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
901 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
902 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
903 \
904 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
905 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
906 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
907 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
908 \
909 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
910 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
911 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
912 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
913 } while (0)
914
915 /*
916 * AES-ECB block encryption
917 */
918 #if !defined(MBEDTLS_AES_ENCRYPT_ALT)
mbedtls_internal_aes_encrypt(mbedtls_aes_context * ctx,const unsigned char input[16],unsigned char output[16])919 int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
920 const unsigned char input[16],
921 unsigned char output[16])
922 {
923 int i;
924 uint32_t *RK = ctx->buf + ctx->rk_offset;
925 struct {
926 uint32_t X[4];
927 uint32_t Y[4];
928 } t;
929
930 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
931 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
932 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
933 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
934
935 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
936 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
937 AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
938 }
939
940 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
941
942 t.X[0] = *RK++ ^ \
943 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
944 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
945 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
946 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
947
948 t.X[1] = *RK++ ^ \
949 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
950 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
951 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
952 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
953
954 t.X[2] = *RK++ ^ \
955 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
956 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
957 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
958 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
959
960 t.X[3] = *RK++ ^ \
961 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
962 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
963 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
964 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
965
966 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
967 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
968 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
969 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
970
971 mbedtls_platform_zeroize(&t, sizeof(t));
972
973 return 0;
974 }
975 #endif /* !MBEDTLS_AES_ENCRYPT_ALT */
976
977 /*
978 * AES-ECB block decryption
979 */
980 #if !defined(MBEDTLS_AES_DECRYPT_ALT)
mbedtls_internal_aes_decrypt(mbedtls_aes_context * ctx,const unsigned char input[16],unsigned char output[16])981 int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
982 const unsigned char input[16],
983 unsigned char output[16])
984 {
985 int i;
986 uint32_t *RK = ctx->buf + ctx->rk_offset;
987 struct {
988 uint32_t X[4];
989 uint32_t Y[4];
990 } t;
991
992 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
993 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
994 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
995 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
996
997 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
998 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
999 AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
1000 }
1001
1002 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
1003
1004 t.X[0] = *RK++ ^ \
1005 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
1006 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
1007 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
1008 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
1009
1010 t.X[1] = *RK++ ^ \
1011 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
1012 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
1013 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
1014 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
1015
1016 t.X[2] = *RK++ ^ \
1017 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
1018 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
1019 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
1020 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
1021
1022 t.X[3] = *RK++ ^ \
1023 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
1024 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
1025 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
1026 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
1027
1028 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
1029 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
1030 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
1031 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
1032
1033 mbedtls_platform_zeroize(&t, sizeof(t));
1034
1035 return 0;
1036 }
1037 #endif /* !MBEDTLS_AES_DECRYPT_ALT */
1038
1039 #if defined(MAY_NEED_TO_ALIGN)
1040 /* VIA Padlock and our intrinsics-based implementation of AESNI require
1041 * the round keys to be aligned on a 16-byte boundary. We take care of this
1042 * before creating them, but the AES context may have moved (this can happen
1043 * if the library is called from a language with managed memory), and in later
1044 * calls it might have a different alignment with respect to 16-byte memory.
1045 * So we may need to realign.
1046 */
aes_maybe_realign(mbedtls_aes_context * ctx)1047 static void aes_maybe_realign(mbedtls_aes_context *ctx)
1048 {
1049 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
1050 if (new_offset != ctx->rk_offset) {
1051 memmove(ctx->buf + new_offset, // new address
1052 ctx->buf + ctx->rk_offset, // current address
1053 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1054 ctx->rk_offset = new_offset;
1055 }
1056 }
1057 #endif
1058
1059 /*
1060 * AES-ECB block encryption/decryption
1061 */
mbedtls_aes_crypt_ecb(mbedtls_aes_context * ctx,int mode,const unsigned char input[16],unsigned char output[16])1062 int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1063 int mode,
1064 const unsigned char input[16],
1065 unsigned char output[16])
1066 {
1067 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
1068 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1069 }
1070
1071 #if defined(MAY_NEED_TO_ALIGN)
1072 aes_maybe_realign(ctx);
1073 #endif
1074
1075 #if defined(MBEDTLS_AESNI_HAVE_CODE)
1076 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1077 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1078 }
1079 #endif
1080
1081 #if defined(MBEDTLS_AESCE_HAVE_CODE)
1082 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
1083 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1084 }
1085 #endif
1086
1087 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
1088 if (aes_padlock_ace > 0) {
1089 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
1090 }
1091 #endif
1092
1093 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
1094 if (mode == MBEDTLS_AES_ENCRYPT) {
1095 return mbedtls_internal_aes_encrypt(ctx, input, output);
1096 } else {
1097 return mbedtls_internal_aes_decrypt(ctx, input, output);
1098 }
1099 #endif
1100
1101 }
1102
1103 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1104
1105 /*
1106 * AES-CBC buffer encryption/decryption
1107 */
mbedtls_aes_crypt_cbc(mbedtls_aes_context * ctx,int mode,size_t length,unsigned char iv[16],const unsigned char * input,unsigned char * output)1108 int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1109 int mode,
1110 size_t length,
1111 unsigned char iv[16],
1112 const unsigned char *input,
1113 unsigned char *output)
1114 {
1115 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1116 unsigned char temp[16];
1117
1118 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
1119 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1120 }
1121
1122 /* Nothing to do if length is zero. */
1123 if (length == 0) {
1124 return 0;
1125 }
1126
1127 if (length % 16) {
1128 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1129 }
1130
1131 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
1132 if (aes_padlock_ace > 0) {
1133 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1134 return 0;
1135 }
1136
1137 // If padlock data misaligned, we just fall back to
1138 // unaccelerated mode
1139 //
1140 }
1141 #endif
1142
1143 const unsigned char *ivp = iv;
1144
1145 if (mode == MBEDTLS_AES_DECRYPT) {
1146 while (length > 0) {
1147 memcpy(temp, input, 16);
1148 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1149 if (ret != 0) {
1150 goto exit;
1151 }
1152 /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1153 * the result for the next block in CBC, and the cost of transferring that data from
1154 * NEON registers, NEON is slower on aarch64. */
1155 mbedtls_xor_no_simd(output, output, iv, 16);
1156
1157 memcpy(iv, temp, 16);
1158
1159 input += 16;
1160 output += 16;
1161 length -= 16;
1162 }
1163 } else {
1164 while (length > 0) {
1165 mbedtls_xor_no_simd(output, input, ivp, 16);
1166
1167 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1168 if (ret != 0) {
1169 goto exit;
1170 }
1171 ivp = output;
1172
1173 input += 16;
1174 output += 16;
1175 length -= 16;
1176 }
1177 memcpy(iv, ivp, 16);
1178 }
1179 ret = 0;
1180
1181 exit:
1182 return ret;
1183 }
1184 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1185
1186 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1187
1188 typedef unsigned char mbedtls_be128[16];
1189
1190 /*
1191 * GF(2^128) multiplication function
1192 *
1193 * This function multiplies a field element by x in the polynomial field
1194 * representation. It uses 64-bit word operations to gain speed but compensates
1195 * for machine endianness and hence works correctly on both big and little
1196 * endian machines.
1197 */
1198 #if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
1199 MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
1200 #endif
mbedtls_gf128mul_x_ble(unsigned char r[16],const unsigned char x[16])1201 static inline void mbedtls_gf128mul_x_ble(unsigned char r[16],
1202 const unsigned char x[16])
1203 {
1204 uint64_t a, b, ra, rb;
1205
1206 a = MBEDTLS_GET_UINT64_LE(x, 0);
1207 b = MBEDTLS_GET_UINT64_LE(x, 8);
1208
1209 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1210 rb = (a >> 63) | (b << 1);
1211
1212 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1213 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
1214 }
1215
1216 /*
1217 * AES-XTS buffer encryption/decryption
1218 *
1219 * Use of MBEDTLS_OPTIMIZE_FOR_PERFORMANCE here and for mbedtls_gf128mul_x_ble()
1220 * is a 3x performance improvement for gcc -Os, if we have hardware AES support.
1221 */
1222 #if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
1223 MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
1224 #endif
mbedtls_aes_crypt_xts(mbedtls_aes_xts_context * ctx,int mode,size_t length,const unsigned char data_unit[16],const unsigned char * input,unsigned char * output)1225 int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1226 int mode,
1227 size_t length,
1228 const unsigned char data_unit[16],
1229 const unsigned char *input,
1230 unsigned char *output)
1231 {
1232 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1233 size_t blocks = length / 16;
1234 size_t leftover = length % 16;
1235 unsigned char tweak[16];
1236 unsigned char prev_tweak[16];
1237 unsigned char tmp[16];
1238
1239 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
1240 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1241 }
1242
1243 /* Data units must be at least 16 bytes long. */
1244 if (length < 16) {
1245 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1246 }
1247
1248 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
1249 if (length > (1 << 20) * 16) {
1250 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1251 }
1252
1253 /* Compute the tweak. */
1254 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1255 data_unit, tweak);
1256 if (ret != 0) {
1257 return ret;
1258 }
1259
1260 while (blocks--) {
1261 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
1262 /* We are on the last block in a decrypt operation that has
1263 * leftover bytes, so we need to use the next tweak for this block,
1264 * and this tweak for the leftover bytes. Save the current tweak for
1265 * the leftovers and then update the current tweak for use on this,
1266 * the last full block. */
1267 memcpy(prev_tweak, tweak, sizeof(tweak));
1268 mbedtls_gf128mul_x_ble(tweak, tweak);
1269 }
1270
1271 mbedtls_xor(tmp, input, tweak, 16);
1272
1273 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1274 if (ret != 0) {
1275 return ret;
1276 }
1277
1278 mbedtls_xor(output, tmp, tweak, 16);
1279
1280 /* Update the tweak for the next block. */
1281 mbedtls_gf128mul_x_ble(tweak, tweak);
1282
1283 output += 16;
1284 input += 16;
1285 }
1286
1287 if (leftover) {
1288 /* If we are on the leftover bytes in a decrypt operation, we need to
1289 * use the previous tweak for these bytes (as saved in prev_tweak). */
1290 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
1291
1292 /* We are now on the final part of the data unit, which doesn't divide
1293 * evenly by 16. It's time for ciphertext stealing. */
1294 size_t i;
1295 unsigned char *prev_output = output - 16;
1296
1297 /* Copy ciphertext bytes from the previous block to our output for each
1298 * byte of ciphertext we won't steal. */
1299 for (i = 0; i < leftover; i++) {
1300 output[i] = prev_output[i];
1301 }
1302
1303 /* Copy the remainder of the input for this final round. */
1304 mbedtls_xor(tmp, input, t, leftover);
1305
1306 /* Copy ciphertext bytes from the previous block for input in this
1307 * round. */
1308 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
1309
1310 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1311 if (ret != 0) {
1312 return ret;
1313 }
1314
1315 /* Write the result back to the previous block, overriding the previous
1316 * output we copied. */
1317 mbedtls_xor(prev_output, tmp, t, 16);
1318 }
1319
1320 return 0;
1321 }
1322 #endif /* MBEDTLS_CIPHER_MODE_XTS */
1323
1324 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1325 /*
1326 * AES-CFB128 buffer encryption/decryption
1327 */
mbedtls_aes_crypt_cfb128(mbedtls_aes_context * ctx,int mode,size_t length,size_t * iv_off,unsigned char iv[16],const unsigned char * input,unsigned char * output)1328 int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1329 int mode,
1330 size_t length,
1331 size_t *iv_off,
1332 unsigned char iv[16],
1333 const unsigned char *input,
1334 unsigned char *output)
1335 {
1336 int c;
1337 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1338 size_t n;
1339
1340 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
1341 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1342 }
1343
1344 n = *iv_off;
1345
1346 if (n > 15) {
1347 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1348 }
1349
1350 if (mode == MBEDTLS_AES_DECRYPT) {
1351 while (length--) {
1352 if (n == 0) {
1353 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1354 if (ret != 0) {
1355 goto exit;
1356 }
1357 }
1358
1359 c = *input++;
1360 *output++ = (unsigned char) (c ^ iv[n]);
1361 iv[n] = (unsigned char) c;
1362
1363 n = (n + 1) & 0x0F;
1364 }
1365 } else {
1366 while (length--) {
1367 if (n == 0) {
1368 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1369 if (ret != 0) {
1370 goto exit;
1371 }
1372 }
1373
1374 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
1375
1376 n = (n + 1) & 0x0F;
1377 }
1378 }
1379
1380 *iv_off = n;
1381 ret = 0;
1382
1383 exit:
1384 return ret;
1385 }
1386
1387 /*
1388 * AES-CFB8 buffer encryption/decryption
1389 */
mbedtls_aes_crypt_cfb8(mbedtls_aes_context * ctx,int mode,size_t length,unsigned char iv[16],const unsigned char * input,unsigned char * output)1390 int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1391 int mode,
1392 size_t length,
1393 unsigned char iv[16],
1394 const unsigned char *input,
1395 unsigned char *output)
1396 {
1397 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1398 unsigned char c;
1399 unsigned char ov[17];
1400
1401 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
1402 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1403 }
1404 while (length--) {
1405 memcpy(ov, iv, 16);
1406 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1407 if (ret != 0) {
1408 goto exit;
1409 }
1410
1411 if (mode == MBEDTLS_AES_DECRYPT) {
1412 ov[16] = *input;
1413 }
1414
1415 c = *output++ = (unsigned char) (iv[0] ^ *input++);
1416
1417 if (mode == MBEDTLS_AES_ENCRYPT) {
1418 ov[16] = c;
1419 }
1420
1421 memcpy(iv, ov + 1, 16);
1422 }
1423 ret = 0;
1424
1425 exit:
1426 return ret;
1427 }
1428 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1429
1430 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1431 /*
1432 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1433 */
mbedtls_aes_crypt_ofb(mbedtls_aes_context * ctx,size_t length,size_t * iv_off,unsigned char iv[16],const unsigned char * input,unsigned char * output)1434 int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1435 size_t length,
1436 size_t *iv_off,
1437 unsigned char iv[16],
1438 const unsigned char *input,
1439 unsigned char *output)
1440 {
1441 int ret = 0;
1442 size_t n;
1443
1444 n = *iv_off;
1445
1446 if (n > 15) {
1447 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1448 }
1449
1450 while (length--) {
1451 if (n == 0) {
1452 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1453 if (ret != 0) {
1454 goto exit;
1455 }
1456 }
1457 *output++ = *input++ ^ iv[n];
1458
1459 n = (n + 1) & 0x0F;
1460 }
1461
1462 *iv_off = n;
1463
1464 exit:
1465 return ret;
1466 }
1467 #endif /* MBEDTLS_CIPHER_MODE_OFB */
1468
1469 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1470 /*
1471 * AES-CTR buffer encryption/decryption
1472 */
mbedtls_aes_crypt_ctr(mbedtls_aes_context * ctx,size_t length,size_t * nc_off,unsigned char nonce_counter[16],unsigned char stream_block[16],const unsigned char * input,unsigned char * output)1473 int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1474 size_t length,
1475 size_t *nc_off,
1476 unsigned char nonce_counter[16],
1477 unsigned char stream_block[16],
1478 const unsigned char *input,
1479 unsigned char *output)
1480 {
1481 int c, i;
1482 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1483 size_t n;
1484
1485 n = *nc_off;
1486
1487 if (n > 0x0F) {
1488 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1489 }
1490
1491 while (length--) {
1492 if (n == 0) {
1493 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1494 if (ret != 0) {
1495 goto exit;
1496 }
1497
1498 for (i = 16; i > 0; i--) {
1499 if (++nonce_counter[i - 1] != 0) {
1500 break;
1501 }
1502 }
1503 }
1504 c = *input++;
1505 *output++ = (unsigned char) (c ^ stream_block[n]);
1506
1507 n = (n + 1) & 0x0F;
1508 }
1509
1510 *nc_off = n;
1511 ret = 0;
1512
1513 exit:
1514 return ret;
1515 }
1516 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1517
1518 #endif /* !MBEDTLS_AES_ALT */
1519
1520 #if defined(MBEDTLS_SELF_TEST)
1521 /*
1522 * AES test vectors from:
1523 *
1524 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1525 */
1526 static const unsigned char aes_test_ecb_dec[][16] =
1527 {
1528 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1529 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1530 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1531 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1532 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1533 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1534 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1535 #endif
1536 };
1537
1538 static const unsigned char aes_test_ecb_enc[][16] =
1539 {
1540 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1541 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1542 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1543 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1544 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1545 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1546 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1547 #endif
1548 };
1549
1550 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1551 static const unsigned char aes_test_cbc_dec[][16] =
1552 {
1553 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1554 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1555 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1556 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1557 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1558 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1559 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1560 #endif
1561 };
1562
1563 static const unsigned char aes_test_cbc_enc[][16] =
1564 {
1565 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1566 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1567 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1568 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1569 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1570 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1571 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1572 #endif
1573 };
1574 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1575
1576 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1577 /*
1578 * AES-CFB128 test vectors from:
1579 *
1580 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1581 */
1582 static const unsigned char aes_test_cfb128_key[][32] =
1583 {
1584 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1585 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1586 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1587 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1588 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1589 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1590 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1591 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1592 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1593 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1594 #endif
1595 };
1596
1597 static const unsigned char aes_test_cfb128_iv[16] =
1598 {
1599 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1600 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1601 };
1602
1603 static const unsigned char aes_test_cfb128_pt[64] =
1604 {
1605 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1606 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1607 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1608 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1609 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1610 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1611 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1612 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1613 };
1614
1615 static const unsigned char aes_test_cfb128_ct[][64] =
1616 {
1617 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1618 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1619 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1620 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1621 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1622 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1623 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1624 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1625 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1626 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1627 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1628 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1629 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1630 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1631 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1632 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1633 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1634 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1635 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1636 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1637 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1638 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1639 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1640 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1641 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1642 #endif
1643 };
1644 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1645
1646 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1647 /*
1648 * AES-OFB test vectors from:
1649 *
1650 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
1651 */
1652 static const unsigned char aes_test_ofb_key[][32] =
1653 {
1654 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1655 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1656 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1657 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1658 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1659 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1660 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1661 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1662 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1663 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1664 #endif
1665 };
1666
1667 static const unsigned char aes_test_ofb_iv[16] =
1668 {
1669 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1670 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1671 };
1672
1673 static const unsigned char aes_test_ofb_pt[64] =
1674 {
1675 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1676 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1677 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1678 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1679 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1680 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1681 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1682 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1683 };
1684
1685 static const unsigned char aes_test_ofb_ct[][64] =
1686 {
1687 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1688 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1689 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1690 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1691 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1692 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1693 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1694 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1695 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1696 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1697 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1698 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1699 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1700 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1701 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1702 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1703 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1704 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1705 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1706 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1707 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1708 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1709 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1710 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1711 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1712 #endif
1713 };
1714 #endif /* MBEDTLS_CIPHER_MODE_OFB */
1715
1716 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1717 /*
1718 * AES-CTR test vectors from:
1719 *
1720 * http://www.faqs.org/rfcs/rfc3686.html
1721 */
1722
1723 static const unsigned char aes_test_ctr_key[][16] =
1724 {
1725 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1726 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1727 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1728 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1729 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1730 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1731 };
1732
1733 static const unsigned char aes_test_ctr_nonce_counter[][16] =
1734 {
1735 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1737 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1738 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1739 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1740 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1741 };
1742
1743 static const unsigned char aes_test_ctr_pt[][48] =
1744 {
1745 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1746 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1747 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1748 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1749 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1750 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1751
1752 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1753 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1754 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1755 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1756 0x20, 0x21, 0x22, 0x23 }
1757 };
1758
1759 static const unsigned char aes_test_ctr_ct[][48] =
1760 {
1761 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1762 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1763 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1764 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1765 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1766 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1767 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1768 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1769 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1770 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1771 0x25, 0xB2, 0x07, 0x2F }
1772 };
1773
1774 static const int aes_test_ctr_len[3] =
1775 { 16, 32, 36 };
1776 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1777
1778 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1779 /*
1780 * AES-XTS test vectors from:
1781 *
1782 * IEEE P1619/D16 Annex B
1783 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1784 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1785 */
1786 static const unsigned char aes_test_xts_key[][32] =
1787 {
1788 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1792 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1793 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1794 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1795 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1796 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1797 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1798 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1799 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1800 };
1801
1802 static const unsigned char aes_test_xts_pt32[][32] =
1803 {
1804 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1808 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1809 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1810 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1811 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1812 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1813 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1814 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1815 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1816 };
1817
1818 static const unsigned char aes_test_xts_ct32[][32] =
1819 {
1820 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1821 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1822 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1823 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1824 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1825 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1826 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1827 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1828 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1829 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1830 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1831 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1832 };
1833
1834 static const unsigned char aes_test_xts_data_unit[][16] =
1835 {
1836 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1838 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1840 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1842 };
1843
1844 #endif /* MBEDTLS_CIPHER_MODE_XTS */
1845
1846 /*
1847 * Checkup routine
1848 */
mbedtls_aes_self_test(int verbose)1849 int mbedtls_aes_self_test(int verbose)
1850 {
1851 int ret = 0, i, j, u, mode;
1852 unsigned int keybits;
1853 unsigned char key[32];
1854 unsigned char buf[64];
1855 const unsigned char *aes_tests;
1856 #if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1857 defined(MBEDTLS_CIPHER_MODE_OFB)
1858 unsigned char iv[16];
1859 #endif
1860 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1861 unsigned char prv[16];
1862 #endif
1863 #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1864 defined(MBEDTLS_CIPHER_MODE_OFB)
1865 size_t offset;
1866 #endif
1867 #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
1868 int len;
1869 #endif
1870 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1871 unsigned char nonce_counter[16];
1872 unsigned char stream_block[16];
1873 #endif
1874 mbedtls_aes_context ctx;
1875
1876 memset(key, 0, 32);
1877 mbedtls_aes_init(&ctx);
1878
1879 if (verbose != 0) {
1880 #if defined(MBEDTLS_AES_ALT)
1881 mbedtls_printf(" AES note: alternative implementation.\n");
1882 #else /* MBEDTLS_AES_ALT */
1883 #if defined(MBEDTLS_AESNI_HAVE_CODE)
1884 #if MBEDTLS_AESNI_HAVE_CODE == 1
1885 mbedtls_printf(" AES note: AESNI code present (assembly implementation).\n");
1886 #elif MBEDTLS_AESNI_HAVE_CODE == 2
1887 mbedtls_printf(" AES note: AESNI code present (intrinsics implementation).\n");
1888 #else
1889 #error "Unrecognised value for MBEDTLS_AESNI_HAVE_CODE"
1890 #endif
1891 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1892 mbedtls_printf(" AES note: using AESNI.\n");
1893 } else
1894 #endif
1895 #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
1896 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1897 mbedtls_printf(" AES note: using VIA Padlock.\n");
1898 } else
1899 #endif
1900 #if defined(MBEDTLS_AESCE_HAVE_CODE)
1901 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
1902 mbedtls_printf(" AES note: using AESCE.\n");
1903 } else
1904 #endif
1905 {
1906 #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
1907 mbedtls_printf(" AES note: built-in implementation.\n");
1908 #endif
1909 }
1910 #endif /* MBEDTLS_AES_ALT */
1911 }
1912
1913 /*
1914 * ECB mode
1915 */
1916 {
1917 static const int num_tests =
1918 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
1919
1920 for (i = 0; i < num_tests << 1; i++) {
1921 u = i >> 1;
1922 keybits = 128 + u * 64;
1923 mode = i & 1;
1924
1925 if (verbose != 0) {
1926 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1927 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1928 }
1929
1930 memset(buf, 0, 16);
1931
1932 if (mode == MBEDTLS_AES_DECRYPT) {
1933 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1934 aes_tests = aes_test_ecb_dec[u];
1935 } else {
1936 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1937 aes_tests = aes_test_ecb_enc[u];
1938 }
1939
1940 /*
1941 * AES-192 is an optional feature that may be unavailable when
1942 * there is an alternative underlying implementation i.e. when
1943 * MBEDTLS_AES_ALT is defined.
1944 */
1945 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1946 mbedtls_printf("skipped\n");
1947 continue;
1948 } else if (ret != 0) {
1949 goto exit;
1950 }
1951
1952 for (j = 0; j < 10000; j++) {
1953 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1954 if (ret != 0) {
1955 goto exit;
1956 }
1957 }
1958
1959 if (memcmp(buf, aes_tests, 16) != 0) {
1960 ret = 1;
1961 goto exit;
1962 }
1963
1964 if (verbose != 0) {
1965 mbedtls_printf("passed\n");
1966 }
1967 }
1968
1969 if (verbose != 0) {
1970 mbedtls_printf("\n");
1971 }
1972 }
1973
1974 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1975 /*
1976 * CBC mode
1977 */
1978 {
1979 static const int num_tests =
1980 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
1981
1982 for (i = 0; i < num_tests << 1; i++) {
1983 u = i >> 1;
1984 keybits = 128 + u * 64;
1985 mode = i & 1;
1986
1987 if (verbose != 0) {
1988 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1989 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1990 }
1991
1992 memset(iv, 0, 16);
1993 memset(prv, 0, 16);
1994 memset(buf, 0, 16);
1995
1996 if (mode == MBEDTLS_AES_DECRYPT) {
1997 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1998 aes_tests = aes_test_cbc_dec[u];
1999 } else {
2000 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2001 aes_tests = aes_test_cbc_enc[u];
2002 }
2003
2004 /*
2005 * AES-192 is an optional feature that may be unavailable when
2006 * there is an alternative underlying implementation i.e. when
2007 * MBEDTLS_AES_ALT is defined.
2008 */
2009 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2010 mbedtls_printf("skipped\n");
2011 continue;
2012 } else if (ret != 0) {
2013 goto exit;
2014 }
2015
2016 for (j = 0; j < 10000; j++) {
2017 if (mode == MBEDTLS_AES_ENCRYPT) {
2018 unsigned char tmp[16];
2019
2020 memcpy(tmp, prv, 16);
2021 memcpy(prv, buf, 16);
2022 memcpy(buf, tmp, 16);
2023 }
2024
2025 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
2026 if (ret != 0) {
2027 goto exit;
2028 }
2029
2030 }
2031
2032 if (memcmp(buf, aes_tests, 16) != 0) {
2033 ret = 1;
2034 goto exit;
2035 }
2036
2037 if (verbose != 0) {
2038 mbedtls_printf("passed\n");
2039 }
2040 }
2041
2042 if (verbose != 0) {
2043 mbedtls_printf("\n");
2044 }
2045 }
2046 #endif /* MBEDTLS_CIPHER_MODE_CBC */
2047
2048 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2049 /*
2050 * CFB128 mode
2051 */
2052 {
2053 static const int num_tests =
2054 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
2055
2056 for (i = 0; i < num_tests << 1; i++) {
2057 u = i >> 1;
2058 keybits = 128 + u * 64;
2059 mode = i & 1;
2060
2061 if (verbose != 0) {
2062 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
2063 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2064 }
2065
2066 memcpy(iv, aes_test_cfb128_iv, 16);
2067 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
2068
2069 offset = 0;
2070 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2071 /*
2072 * AES-192 is an optional feature that may be unavailable when
2073 * there is an alternative underlying implementation i.e. when
2074 * MBEDTLS_AES_ALT is defined.
2075 */
2076 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2077 mbedtls_printf("skipped\n");
2078 continue;
2079 } else if (ret != 0) {
2080 goto exit;
2081 }
2082
2083 if (mode == MBEDTLS_AES_DECRYPT) {
2084 memcpy(buf, aes_test_cfb128_ct[u], 64);
2085 aes_tests = aes_test_cfb128_pt;
2086 } else {
2087 memcpy(buf, aes_test_cfb128_pt, 64);
2088 aes_tests = aes_test_cfb128_ct[u];
2089 }
2090
2091 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2092 if (ret != 0) {
2093 goto exit;
2094 }
2095
2096 if (memcmp(buf, aes_tests, 64) != 0) {
2097 ret = 1;
2098 goto exit;
2099 }
2100
2101 if (verbose != 0) {
2102 mbedtls_printf("passed\n");
2103 }
2104 }
2105
2106 if (verbose != 0) {
2107 mbedtls_printf("\n");
2108 }
2109 }
2110 #endif /* MBEDTLS_CIPHER_MODE_CFB */
2111
2112 #if defined(MBEDTLS_CIPHER_MODE_OFB)
2113 /*
2114 * OFB mode
2115 */
2116 {
2117 static const int num_tests =
2118 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
2119
2120 for (i = 0; i < num_tests << 1; i++) {
2121 u = i >> 1;
2122 keybits = 128 + u * 64;
2123 mode = i & 1;
2124
2125 if (verbose != 0) {
2126 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2127 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2128 }
2129
2130 memcpy(iv, aes_test_ofb_iv, 16);
2131 memcpy(key, aes_test_ofb_key[u], keybits / 8);
2132
2133 offset = 0;
2134 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2135 /*
2136 * AES-192 is an optional feature that may be unavailable when
2137 * there is an alternative underlying implementation i.e. when
2138 * MBEDTLS_AES_ALT is defined.
2139 */
2140 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2141 mbedtls_printf("skipped\n");
2142 continue;
2143 } else if (ret != 0) {
2144 goto exit;
2145 }
2146
2147 if (mode == MBEDTLS_AES_DECRYPT) {
2148 memcpy(buf, aes_test_ofb_ct[u], 64);
2149 aes_tests = aes_test_ofb_pt;
2150 } else {
2151 memcpy(buf, aes_test_ofb_pt, 64);
2152 aes_tests = aes_test_ofb_ct[u];
2153 }
2154
2155 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2156 if (ret != 0) {
2157 goto exit;
2158 }
2159
2160 if (memcmp(buf, aes_tests, 64) != 0) {
2161 ret = 1;
2162 goto exit;
2163 }
2164
2165 if (verbose != 0) {
2166 mbedtls_printf("passed\n");
2167 }
2168 }
2169
2170 if (verbose != 0) {
2171 mbedtls_printf("\n");
2172 }
2173 }
2174 #endif /* MBEDTLS_CIPHER_MODE_OFB */
2175
2176 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2177 /*
2178 * CTR mode
2179 */
2180 {
2181 static const int num_tests =
2182 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
2183
2184 for (i = 0; i < num_tests << 1; i++) {
2185 u = i >> 1;
2186 mode = i & 1;
2187
2188 if (verbose != 0) {
2189 mbedtls_printf(" AES-CTR-128 (%s): ",
2190 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2191 }
2192
2193 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2194 memcpy(key, aes_test_ctr_key[u], 16);
2195
2196 offset = 0;
2197 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2198 goto exit;
2199 }
2200
2201 len = aes_test_ctr_len[u];
2202
2203 if (mode == MBEDTLS_AES_DECRYPT) {
2204 memcpy(buf, aes_test_ctr_ct[u], len);
2205 aes_tests = aes_test_ctr_pt[u];
2206 } else {
2207 memcpy(buf, aes_test_ctr_pt[u], len);
2208 aes_tests = aes_test_ctr_ct[u];
2209 }
2210
2211 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2212 stream_block, buf, buf);
2213 if (ret != 0) {
2214 goto exit;
2215 }
2216
2217 if (memcmp(buf, aes_tests, len) != 0) {
2218 ret = 1;
2219 goto exit;
2220 }
2221
2222 if (verbose != 0) {
2223 mbedtls_printf("passed\n");
2224 }
2225 }
2226 }
2227
2228 if (verbose != 0) {
2229 mbedtls_printf("\n");
2230 }
2231 #endif /* MBEDTLS_CIPHER_MODE_CTR */
2232
2233 #if defined(MBEDTLS_CIPHER_MODE_XTS)
2234 /*
2235 * XTS mode
2236 */
2237 {
2238 static const int num_tests =
2239 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2240 mbedtls_aes_xts_context ctx_xts;
2241
2242 mbedtls_aes_xts_init(&ctx_xts);
2243
2244 for (i = 0; i < num_tests << 1; i++) {
2245 const unsigned char *data_unit;
2246 u = i >> 1;
2247 mode = i & 1;
2248
2249 if (verbose != 0) {
2250 mbedtls_printf(" AES-XTS-128 (%s): ",
2251 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2252 }
2253
2254 memset(key, 0, sizeof(key));
2255 memcpy(key, aes_test_xts_key[u], 32);
2256 data_unit = aes_test_xts_data_unit[u];
2257
2258 len = sizeof(*aes_test_xts_ct32);
2259
2260 if (mode == MBEDTLS_AES_DECRYPT) {
2261 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2262 if (ret != 0) {
2263 goto exit;
2264 }
2265 memcpy(buf, aes_test_xts_ct32[u], len);
2266 aes_tests = aes_test_xts_pt32[u];
2267 } else {
2268 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2269 if (ret != 0) {
2270 goto exit;
2271 }
2272 memcpy(buf, aes_test_xts_pt32[u], len);
2273 aes_tests = aes_test_xts_ct32[u];
2274 }
2275
2276
2277 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2278 buf, buf);
2279 if (ret != 0) {
2280 goto exit;
2281 }
2282
2283 if (memcmp(buf, aes_tests, len) != 0) {
2284 ret = 1;
2285 goto exit;
2286 }
2287
2288 if (verbose != 0) {
2289 mbedtls_printf("passed\n");
2290 }
2291 }
2292
2293 if (verbose != 0) {
2294 mbedtls_printf("\n");
2295 }
2296
2297 mbedtls_aes_xts_free(&ctx_xts);
2298 }
2299 #endif /* MBEDTLS_CIPHER_MODE_XTS */
2300
2301 ret = 0;
2302
2303 exit:
2304 if (ret != 0 && verbose != 0) {
2305 mbedtls_printf("failed\n");
2306 }
2307
2308 mbedtls_aes_free(&ctx);
2309
2310 return ret;
2311 }
2312
2313 #endif /* MBEDTLS_SELF_TEST */
2314
2315 #endif /* MBEDTLS_AES_C */
2316