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