blob: 085fd4da4b91e70fdb104ef1febbb3261a6a0b76 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
7/*
8 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
9 *
Tom Cosgrovece37c5e2023-08-04 13:53:36 +010010 * https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
12 */
13
Gilles Peskinedb09ef62020-06-03 01:43:33 +020014#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000015
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020016#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000017
Rich Evans00ab4702015-02-06 13:43:58 +000018#include <string.h>
19
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000020#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030021#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050022#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000023#include "mbedtls/error.h"
Jerry Yu02b15192023-04-23 14:43:19 +080024
Dave Rodgman782df0352023-09-29 12:57:52 +010025#if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Dave Rodgman9fd1b522023-10-10 15:23:44 +010026#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)))
Jerry Yu69436812023-04-25 11:08:30 +080029#error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
Jerry Yu02b15192023-04-23 14:43:19 +080030#endif
31#endif
32
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020033#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000034#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010035#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080036#if defined(MBEDTLS_AESCE_C)
37#include "aesce.h"
38#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000039
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/platform.h"
Dave Rodgman591ff052024-01-13 16:42:38 +000041#include "ctr.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010042
Yanray Wangf03b4912023-11-09 11:23:17 +080043/*
44 * This is a convenience shorthand macro to check if we need reverse S-box and
45 * reverse tables. It's private and only defined in this file.
46 */
47#if (!defined(MBEDTLS_AES_DECRYPT_ALT) || \
48 (!defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY))) && \
Yanray Wangb67b4742023-10-31 17:10:32 +080049 !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Yanray Wangdbcc0c62023-08-30 15:04:01 +080050#define MBEDTLS_AES_NEED_REVERSE_TABLES
51#endif
52
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000054/*
55 * Forward S-box
56 */
Dave Rodgman18ddf612023-10-04 14:03:12 +010057MBEDTLS_MAYBE_UNUSED static const unsigned char FSb[256] =
Paul Bakker5121ce52009-01-03 21:22:43 +000058{
59 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
60 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
61 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
62 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
63 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
64 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
65 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
66 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
67 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
68 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
69 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
70 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
71 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
72 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
73 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
74 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
75 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
76 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
77 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
78 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
79 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
80 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
81 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
82 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
83 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
84 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
85 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
86 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
87 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
88 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
89 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
90 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
91};
92
93/*
94 * Forward tables
95 */
96#define FT \
97\
Gilles Peskine449bd832023-01-11 14:50:10 +010098 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
99 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
100 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
101 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
102 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
103 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
104 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
105 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
106 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
107 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
108 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
109 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
110 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
111 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
112 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
113 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
114 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
115 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
116 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
117 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
118 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
119 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
120 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
121 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
122 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
123 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
124 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
125 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
126 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
127 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
128 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
129 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
130 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
131 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
132 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
133 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
134 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
135 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
136 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
137 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
138 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
139 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
140 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
141 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
142 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
143 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
144 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
145 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
146 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
147 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
148 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
149 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
150 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
151 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
152 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
153 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
154 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
155 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
156 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
157 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
158 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
159 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
160 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
161 V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000162
Gilles Peskine449bd832023-01-11 14:50:10 +0100163#define V(a, b, c, d) 0x##a##b##c##d
Dave Rodgman18ddf612023-10-04 14:03:12 +0100164MBEDTLS_MAYBE_UNUSED static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000165#undef V
166
Gilles Peskine449bd832023-01-11 14:50:10 +0100167#define V(a, b, c, d) 0x##b##c##d##a
Dave Rodgman18ddf612023-10-04 14:03:12 +0100168MBEDTLS_MAYBE_UNUSED static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000169#undef V
170
Gilles Peskine449bd832023-01-11 14:50:10 +0100171#define V(a, b, c, d) 0x##c##d##a##b
Dave Rodgman18ddf612023-10-04 14:03:12 +0100172MBEDTLS_MAYBE_UNUSED static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000173#undef V
174
Gilles Peskine449bd832023-01-11 14:50:10 +0100175#define V(a, b, c, d) 0x##d##a##b##c
Dave Rodgman18ddf612023-10-04 14:03:12 +0100176MBEDTLS_MAYBE_UNUSED static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000177#undef V
178
179#undef FT
180
181/*
182 * Reverse S-box
183 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100184MBEDTLS_MAYBE_UNUSED static const unsigned char RSb[256] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000185{
186 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
187 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
188 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
189 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
190 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
191 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
192 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
193 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
194 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
195 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
196 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
197 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
198 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
199 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
200 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
201 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
202 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
203 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
204 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
205 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
206 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
207 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
208 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
209 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
210 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
211 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
212 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
213 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
214 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
215 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
216 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
217 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
218};
219
220/*
221 * Reverse tables
222 */
223#define RT \
224\
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
226 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
227 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
228 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
229 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
230 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
231 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
232 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
233 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
234 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
235 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
236 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
237 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
238 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
239 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
240 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
241 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
242 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
243 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
244 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
245 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
246 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
247 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
248 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
249 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
250 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
251 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
252 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
253 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
254 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
255 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
256 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
257 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
258 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
259 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
260 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
261 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
262 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
263 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
264 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
265 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
266 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
267 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
268 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
269 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
270 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
271 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
272 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
273 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
274 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
275 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
276 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
277 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
278 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
279 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
280 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
281 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
282 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
283 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
284 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
285 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
286 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
287 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
288 V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000289
Dave Rodgmanad4e76b2023-06-27 19:20:27 +0100290
Gilles Peskine449bd832023-01-11 14:50:10 +0100291#define V(a, b, c, d) 0x##a##b##c##d
Dave Rodgman18ddf612023-10-04 14:03:12 +0100292MBEDTLS_MAYBE_UNUSED static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000293#undef V
294
Gilles Peskine449bd832023-01-11 14:50:10 +0100295#define V(a, b, c, d) 0x##b##c##d##a
Dave Rodgman18ddf612023-10-04 14:03:12 +0100296MBEDTLS_MAYBE_UNUSED static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000297#undef V
298
Gilles Peskine449bd832023-01-11 14:50:10 +0100299#define V(a, b, c, d) 0x##c##d##a##b
Dave Rodgman18ddf612023-10-04 14:03:12 +0100300MBEDTLS_MAYBE_UNUSED static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000301#undef V
302
Gilles Peskine449bd832023-01-11 14:50:10 +0100303#define V(a, b, c, d) 0x##d##a##b##c
Dave Rodgman18ddf612023-10-04 14:03:12 +0100304MBEDTLS_MAYBE_UNUSED static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000305#undef V
306
307#undef RT
308
309/*
310 * Round constants
311 */
Dave Rodgman4b779be2023-10-12 16:17:10 +0100312MBEDTLS_MAYBE_UNUSED static const uint32_t round_constants[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000313{
314 0x00000001, 0x00000002, 0x00000004, 0x00000008,
315 0x00000010, 0x00000020, 0x00000040, 0x00000080,
316 0x0000001B, 0x00000036
317};
318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000320
321/*
322 * Forward S-box & tables
323 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100324MBEDTLS_MAYBE_UNUSED static unsigned char FSb[256];
325MBEDTLS_MAYBE_UNUSED static uint32_t FT0[256];
326MBEDTLS_MAYBE_UNUSED static uint32_t FT1[256];
327MBEDTLS_MAYBE_UNUSED static uint32_t FT2[256];
328MBEDTLS_MAYBE_UNUSED static uint32_t FT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000329
330/*
331 * Reverse S-box & tables
332 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100333MBEDTLS_MAYBE_UNUSED static unsigned char RSb[256];
Dave Rodgmanad4e76b2023-06-27 19:20:27 +0100334
Dave Rodgman18ddf612023-10-04 14:03:12 +0100335MBEDTLS_MAYBE_UNUSED static uint32_t RT0[256];
336MBEDTLS_MAYBE_UNUSED static uint32_t RT1[256];
337MBEDTLS_MAYBE_UNUSED static uint32_t RT2[256];
338MBEDTLS_MAYBE_UNUSED static uint32_t RT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Round constants
342 */
Dave Rodgman4b779be2023-10-12 16:17:10 +0100343MBEDTLS_MAYBE_UNUSED static uint32_t round_constants[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000344
345/*
346 * Tables generation code
347 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100348#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
349#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
350#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000351
Dave Rodgman18ddf612023-10-04 14:03:12 +0100352MBEDTLS_MAYBE_UNUSED static int aes_init_done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000353
Dave Rodgman18ddf612023-10-04 14:03:12 +0100354MBEDTLS_MAYBE_UNUSED static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000355{
Yanray Wangfe944ce2023-06-26 18:16:01 +0800356 int i;
357 uint8_t x, y, z;
Yanray Wang5c86b172023-06-26 16:54:52 +0800358 uint8_t pow[256];
359 uint8_t log[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
361 /*
362 * compute pow and log tables over GF(2^8)
363 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100364 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000365 pow[i] = x;
Yanray Wang5c86b172023-06-26 16:54:52 +0800366 log[x] = (uint8_t) i;
Yanray Wangfe944ce2023-06-26 18:16:01 +0800367 x ^= XTIME(x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000368 }
369
370 /*
371 * calculate the round constants
372 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 for (i = 0, x = 1; i < 10; i++) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200374 round_constants[i] = x;
Yanray Wangfe944ce2023-06-26 18:16:01 +0800375 x = XTIME(x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 }
377
378 /*
379 * generate the forward and reverse S-boxes
380 */
381 FSb[0x00] = 0x63;
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800382#if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 RSb[0x63] = 0x00;
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800384#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000387 x = pow[255 - log[i]];
388
Yanray Wangfe944ce2023-06-26 18:16:01 +0800389 y = x; y = (y << 1) | (y >> 7);
390 x ^= y; y = (y << 1) | (y >> 7);
391 x ^= y; y = (y << 1) | (y >> 7);
392 x ^= y; y = (y << 1) | (y >> 7);
Paul Bakker5121ce52009-01-03 21:22:43 +0000393 x ^= y ^ 0x63;
394
Yanray Wangfe944ce2023-06-26 18:16:01 +0800395 FSb[i] = x;
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800396#if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000397 RSb[x] = (unsigned char) i;
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800398#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000399 }
400
401 /*
402 * generate the forward and reverse tables
403 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000405 x = FSb[i];
Yanray Wangfe944ce2023-06-26 18:16:01 +0800406 y = XTIME(x);
407 z = y ^ x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 FT0[i] = ((uint32_t) y) ^
410 ((uint32_t) x << 8) ^
411 ((uint32_t) x << 16) ^
412 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000413
Hanno Beckerad049a92017-06-19 16:31:54 +0100414#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 FT1[i] = ROTL8(FT0[i]);
416 FT2[i] = ROTL8(FT1[i]);
417 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100418#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800420#if defined(MBEDTLS_AES_NEED_REVERSE_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000421 x = RSb[i];
422
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
424 ((uint32_t) MUL(0x09, x) << 8) ^
425 ((uint32_t) MUL(0x0D, x) << 16) ^
426 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000427
Hanno Beckerad049a92017-06-19 16:31:54 +0100428#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100429 RT1[i] = ROTL8(RT0[i]);
430 RT2[i] = ROTL8(RT1[i]);
431 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100432#endif /* !MBEDTLS_AES_FEWER_TABLES */
Yanray Wangdbcc0c62023-08-30 15:04:01 +0800433#endif /* MBEDTLS_AES_NEED_REVERSE_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 }
435}
436
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200437#undef ROTL8
438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000440
Hanno Beckerad049a92017-06-19 16:31:54 +0100441#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200442
Gilles Peskine449bd832023-01-11 14:50:10 +0100443#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
444#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
445#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200446
447#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100448#define AES_RT1(idx) ROTL8(RT0[idx])
449#define AES_RT2(idx) ROTL16(RT0[idx])
450#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200451
452#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100453#define AES_FT1(idx) ROTL8(FT0[idx])
454#define AES_FT2(idx) ROTL16(FT0[idx])
455#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200456
Hanno Becker177d3cf2017-06-07 15:52:48 +0100457#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200458
459#define AES_RT0(idx) RT0[idx]
460#define AES_RT1(idx) RT1[idx]
461#define AES_RT2(idx) RT2[idx]
462#define AES_RT3(idx) RT3[idx]
463
464#define AES_FT0(idx) FT0[idx]
465#define AES_FT1(idx) FT1[idx]
466#define AES_FT2(idx) FT2[idx]
467#define AES_FT3(idx) FT3[idx]
468
Hanno Becker177d3cf2017-06-07 15:52:48 +0100469#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200470
Gilles Peskine449bd832023-01-11 14:50:10 +0100471void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200472{
Gilles Peskine449bd832023-01-11 14:50:10 +0100473 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200474}
475
Gilles Peskine449bd832023-01-11 14:50:10 +0100476void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200477{
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200479 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100480 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200481
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483}
484
Jaeden Amero9366feb2018-05-29 18:55:17 +0100485#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100486void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100487{
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 mbedtls_aes_init(&ctx->crypt);
489 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100490}
491
Gilles Peskine449bd832023-01-11 14:50:10 +0100492void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100493{
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100495 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 }
Simon Butcher5201e412018-12-06 17:40:14 +0000497
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 mbedtls_aes_free(&ctx->crypt);
499 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100500}
501#endif /* MBEDTLS_CIPHER_MODE_XTS */
502
Gilles Peskine0de8f852023-03-16 17:14:59 +0100503/* Some implementations need the round keys to be aligned.
504 * Return an offset to be added to buf, such that (buf + offset) is
505 * correctly aligned.
506 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
507 * i.e. an offset of 1 means 4 bytes and so on.
508 */
Thomas Daubneyf57a3522024-06-25 15:23:57 +0100509#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100510#define MAY_NEED_TO_ALIGN
511#endif
Dave Rodgman28a539a2023-06-27 18:22:34 +0100512
Dave Rodgman18ddf612023-10-04 14:03:12 +0100513MBEDTLS_MAYBE_UNUSED static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100514{
515#if defined(MAY_NEED_TO_ALIGN)
516 int align_16_bytes = 0;
517
Gilles Peskine9c682e72023-03-16 17:21:33 +0100518#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100519 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
520 align_16_bytes = 1;
521 }
522#endif
523
524 if (align_16_bytes) {
525 /* These implementations needs 16-byte alignment
526 * for the round key array. */
527 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
528 if (delta == 0) {
529 return 0;
530 } else {
531 return 4 - delta; // 16 bytes = 4 uint32_t
532 }
533 }
534#else /* MAY_NEED_TO_ALIGN */
535 (void) buf;
536#endif /* MAY_NEED_TO_ALIGN */
537
538 return 0;
539}
540
Paul Bakker5121ce52009-01-03 21:22:43 +0000541/*
542 * AES key schedule (encryption)
543 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200544#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100545int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
546 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000547{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000548 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000549
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000551 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800552#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000553 case 192: ctx->nr = 12; break;
554 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800555#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000557 }
558
Simon Butcher5201e412018-12-06 17:40:14 +0000559#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100560 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000561 aes_gen_tables();
562 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000563 }
564#endif
565
Gilles Peskine0de8f852023-03-16 17:14:59 +0100566 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100567 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000568
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100569#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
571 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
572 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100573#endif
574
Jerry Yu72fd0bd2023-08-18 16:31:01 +0800575#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +0100576 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yu3f2fb712023-01-10 17:05:42 +0800577 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
578 }
579#endif
580
Jerry Yu29c91ba2023-08-04 11:02:04 +0800581#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Jerry Yu3a0f0442023-08-17 17:06:21 +0800582 for (unsigned int i = 0; i < (keybits >> 5); i++) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100583 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000584 }
585
Gilles Peskine449bd832023-01-11 14:50:10 +0100586 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000587 case 10:
588
Jerry Yu3a0f0442023-08-17 17:06:21 +0800589 for (unsigned int i = 0; i < 10; i++, RK += 4) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200590 RK[4] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
592 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
593 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
594 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000595
596 RK[5] = RK[1] ^ RK[4];
597 RK[6] = RK[2] ^ RK[5];
598 RK[7] = RK[3] ^ RK[6];
599 }
600 break;
601
Arto Kinnunen732ca322023-04-14 14:26:10 +0800602#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 case 12:
604
Jerry Yu3a0f0442023-08-17 17:06:21 +0800605 for (unsigned int i = 0; i < 8; i++, RK += 6) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200606 RK[6] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100607 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
608 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
609 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
610 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000611
612 RK[7] = RK[1] ^ RK[6];
613 RK[8] = RK[2] ^ RK[7];
614 RK[9] = RK[3] ^ RK[8];
615 RK[10] = RK[4] ^ RK[9];
616 RK[11] = RK[5] ^ RK[10];
617 }
618 break;
619
620 case 14:
621
Jerry Yu3a0f0442023-08-17 17:06:21 +0800622 for (unsigned int i = 0; i < 7; i++, RK += 8) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200623 RK[8] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100624 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
625 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
626 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
627 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000628
629 RK[9] = RK[1] ^ RK[8];
630 RK[10] = RK[2] ^ RK[9];
631 RK[11] = RK[3] ^ RK[10];
632
633 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100634 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
635 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
636 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
637 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000638
639 RK[13] = RK[5] ^ RK[12];
640 RK[14] = RK[6] ^ RK[13];
641 RK[15] = RK[7] ^ RK[14];
642 }
643 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800644#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000645 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000646
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 return 0;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800648#endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
Paul Bakker5121ce52009-01-03 21:22:43 +0000649}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200650#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652/*
653 * AES key schedule (decryption)
654 */
Yanray Wangb67b4742023-10-31 17:10:32 +0800655#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100656int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
657 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000658{
Jerry Yu29c91ba2023-08-04 11:02:04 +0800659#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Jerry Yu29c91ba2023-08-04 11:02:04 +0800660 uint32_t *SK;
661#endif
662 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200663 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000664 uint32_t *RK;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800665
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200666
Gilles Peskine449bd832023-01-11 14:50:10 +0100667 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000668
Gilles Peskine0de8f852023-03-16 17:14:59 +0100669 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100670 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000671
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200672 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200674 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100675 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000676
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200677 ctx->nr = cty.nr;
678
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100679#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
681 mbedtls_aesni_inverse_key((unsigned char *) RK,
682 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200683 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100684 }
685#endif
686
Jerry Yu72fd0bd2023-08-18 16:31:01 +0800687#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +0100688 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yue096da12023-01-10 17:07:01 +0800689 mbedtls_aesce_inverse_key(
690 (unsigned char *) RK,
691 (const unsigned char *) (cty.buf + cty.rk_offset),
692 ctx->nr);
693 goto exit;
694 }
695#endif
696
Jerry Yu29c91ba2023-08-04 11:02:04 +0800697#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100698 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000699
700 *RK++ = *SK++;
701 *RK++ = *SK++;
702 *RK++ = *SK++;
703 *RK++ = *SK++;
Jerry Yu3a0f0442023-08-17 17:06:21 +0800704 SK -= 8;
705 for (int i = ctx->nr - 1; i > 0; i--, SK -= 8) {
706 for (int j = 0; j < 4; j++, SK++) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
708 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
709 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
710 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000711 }
712 }
713
714 *RK++ = *SK++;
715 *RK++ = *SK++;
716 *RK++ = *SK++;
717 *RK++ = *SK++;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800718#endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200719exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000721
Gilles Peskine449bd832023-01-11 14:50:10 +0100722 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000723}
Yanray Wangb67b4742023-10-31 17:10:32 +0800724#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT && !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100725
726#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100727static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
728 unsigned int keybits,
729 const unsigned char **key1,
730 unsigned int *key1bits,
731 const unsigned char **key2,
732 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100733{
734 const unsigned int half_keybits = keybits / 2;
735 const unsigned int half_keybytes = half_keybits / 8;
736
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100738 case 256: break;
739 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100741 }
742
743 *key1bits = half_keybits;
744 *key2bits = half_keybits;
745 *key1 = &key[0];
746 *key2 = &key[half_keybytes];
747
748 return 0;
749}
750
Gilles Peskine449bd832023-01-11 14:50:10 +0100751int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
752 const unsigned char *key,
753 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100754{
Janos Follath24eed8d2019-11-22 13:21:35 +0000755 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100756 const unsigned char *key1, *key2;
757 unsigned int key1bits, key2bits;
758
Gilles Peskine449bd832023-01-11 14:50:10 +0100759 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
760 &key2, &key2bits);
761 if (ret != 0) {
762 return ret;
763 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100764
765 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100766 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
767 if (ret != 0) {
768 return ret;
769 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100770
771 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100773}
774
Gilles Peskine449bd832023-01-11 14:50:10 +0100775int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
776 const unsigned char *key,
777 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100778{
Janos Follath24eed8d2019-11-22 13:21:35 +0000779 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100780 const unsigned char *key1, *key2;
781 unsigned int key1bits, key2bits;
782
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
784 &key2, &key2bits);
785 if (ret != 0) {
786 return ret;
787 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788
789 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
791 if (ret != 0) {
792 return ret;
793 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100794
795 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100796 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100797}
798#endif /* MBEDTLS_CIPHER_MODE_XTS */
799
Gilles Peskine449bd832023-01-11 14:50:10 +0100800#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100801 do \
802 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100803 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
804 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
805 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
806 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100807 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
809 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
810 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
811 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100812 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
814 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
815 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
816 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100817 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100818 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
819 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
820 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
821 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
822 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
Gilles Peskine449bd832023-01-11 14:50:10 +0100824#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100825 do \
826 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
828 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
829 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
830 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100831 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
833 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
834 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
835 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100836 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
838 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
839 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
840 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100841 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100842 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
843 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
844 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
845 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
846 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000847
848/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200849 * AES-ECB block encryption
850 */
851#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100852int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
853 const unsigned char input[16],
854 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200855{
856 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100857 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100858 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200859 uint32_t X[4];
860 uint32_t Y[4];
861 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200862
Gilles Peskine449bd832023-01-11 14:50:10 +0100863 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
864 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
865 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
866 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200867
Gilles Peskine449bd832023-01-11 14:50:10 +0100868 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
869 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]);
870 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]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200871 }
872
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 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]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200874
Gilles Peskine5197c662020-08-26 17:03:24 +0200875 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
877 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
878 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
879 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200880
Gilles Peskine5197c662020-08-26 17:03:24 +0200881 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
883 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
884 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
885 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200886
Gilles Peskine5197c662020-08-26 17:03:24 +0200887 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
889 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
890 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
891 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200892
Gilles Peskine5197c662020-08-26 17:03:24 +0200893 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
896 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200898
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
900 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
901 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
902 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000903
Gilles Peskine449bd832023-01-11 14:50:10 +0100904 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500905
Gilles Peskine449bd832023-01-11 14:50:10 +0100906 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200907}
908#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
909
910/*
911 * AES-ECB block decryption
912 */
Yanray Wangb67b4742023-10-31 17:10:32 +0800913#if !defined(MBEDTLS_AES_DECRYPT_ALT) && !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100914int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
915 const unsigned char input[16],
916 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200917{
918 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100919 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200921 uint32_t X[4];
922 uint32_t Y[4];
923 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200924
Gilles Peskine449bd832023-01-11 14:50:10 +0100925 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
926 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
927 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
928 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200929
Gilles Peskine449bd832023-01-11 14:50:10 +0100930 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
931 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]);
932 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]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200933 }
934
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 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]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200936
Gilles Peskine5197c662020-08-26 17:03:24 +0200937 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
939 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
940 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
941 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200942
Gilles Peskine5197c662020-08-26 17:03:24 +0200943 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
945 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
946 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
947 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200948
Gilles Peskine5197c662020-08-26 17:03:24 +0200949 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
951 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
952 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200954
Gilles Peskine5197c662020-08-26 17:03:24 +0200955 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
957 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
958 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200960
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
962 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
963 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
964 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000965
Gilles Peskine449bd832023-01-11 14:50:10 +0100966 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500967
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200969}
Yanray Wangb67b4742023-10-31 17:10:32 +0800970#endif /* !MBEDTLS_AES_DECRYPT_ALT && !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200971
Thomas Daubney62af02c2024-06-14 10:37:13 +0100972/*
Thomas Daubney4e5d1832024-06-25 15:21:48 +0100973 * Our intrinsics-based implementation of AESNI requires the round keys to be
Thomas Daubney62af02c2024-06-14 10:37:13 +0100974 * aligned on a 16-byte boundary. We take care of this before creating them,
975 * but the AES context may have moved (this can happen if the library is
976 * called from a language with managed memory), and in later calls it might
977 * have a different alignment with respect to 16-byte memory. So we may need
978 * to realign.
Gilles Peskine148cad12023-03-16 13:08:42 +0100979 */
Thomas Daubney1d08e2f2024-06-25 09:18:20 +0100980#if defined(MAY_NEED_TO_ALIGN)
Dave Rodgman18ddf612023-10-04 14:03:12 +0100981MBEDTLS_MAYBE_UNUSED static void aes_maybe_realign(mbedtls_aes_context *ctx)
Gilles Peskine148cad12023-03-16 13:08:42 +0100982{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100983 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
984 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100985 memmove(ctx->buf + new_offset, // new address
986 ctx->buf + ctx->rk_offset, // current address
987 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
988 ctx->rk_offset = new_offset;
989 }
990}
Thomas Daubney1d08e2f2024-06-25 09:18:20 +0100991#endif /* MAY_NEED_TO_ALIGN */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200992/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000993 * AES-ECB block encryption/decryption
994 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100995int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
996 int mode,
997 const unsigned char input[16],
998 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +0000999{
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001001 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001002 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001003
Gilles Peskine0de8f852023-03-16 17:14:59 +01001004#if defined(MAY_NEED_TO_ALIGN)
1005 aes_maybe_realign(ctx);
1006#endif
1007
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001008#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001009 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1010 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1011 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001012#endif
1013
Jerry Yu72fd0bd2023-08-18 16:31:01 +08001014#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +01001015 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yu2bb3d812023-01-10 17:38:26 +08001016 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1017 }
1018#endif
1019
Jerry Yu29c91ba2023-08-04 11:02:04 +08001020#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Yanray Wang0d76b6e2023-11-02 11:54:39 +08001021#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Yanray Wang111159b2023-11-10 13:41:12 +08001022 if (mode == MBEDTLS_AES_DECRYPT) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 return mbedtls_internal_aes_decrypt(ctx, input, output);
Yanray Wang111159b2023-11-10 13:41:12 +08001024 } else
Jerry Yu29c91ba2023-08-04 11:02:04 +08001025#endif
Yanray Wang111159b2023-11-10 13:41:12 +08001026 {
1027 return mbedtls_internal_aes_encrypt(ctx, input, output);
Yanray Wang0d76b6e2023-11-02 11:54:39 +08001028 }
Yanray Wang78ee0c92023-05-15 11:23:50 +08001029#endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
Paul Bakker5121ce52009-01-03 21:22:43 +00001030}
1031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001033
Paul Bakker5121ce52009-01-03 21:22:43 +00001034/*
1035 * AES-CBC buffer encryption/decryption
1036 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001037int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1038 int mode,
1039 size_t length,
1040 unsigned char iv[16],
1041 const unsigned char *input,
1042 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001043{
Gilles Peskine7820a572021-07-07 21:08:28 +02001044 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001045 unsigned char temp[16];
1046
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001048 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001050
Paul Elliott2ad93672023-08-11 11:07:06 +01001051 /* Nothing to do if length is zero. */
1052 if (length == 0) {
1053 return 0;
1054 }
1055
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 if (length % 16) {
1057 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1058 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001059
Dave Rodgman906c63c2023-06-14 17:53:51 +01001060 const unsigned char *ivp = iv;
1061
Gilles Peskine449bd832023-01-11 14:50:10 +01001062 if (mode == MBEDTLS_AES_DECRYPT) {
1063 while (length > 0) {
1064 memcpy(temp, input, 16);
1065 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1066 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001067 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 }
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001069 /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
Dave Rodgman2dd15b32023-06-15 20:27:53 +01001070 * the result for the next block in CBC, and the cost of transferring that data from
1071 * NEON registers, NEON is slower on aarch64. */
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001072 mbedtls_xor_no_simd(output, output, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001073
Gilles Peskine449bd832023-01-11 14:50:10 +01001074 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001075
1076 input += 16;
1077 output += 16;
1078 length -= 16;
1079 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001080 } else {
1081 while (length > 0) {
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001082 mbedtls_xor_no_simd(output, input, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001083
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1085 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001086 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001088 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001089
1090 input += 16;
1091 output += 16;
1092 length -= 16;
1093 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001094 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001095 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001096 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001097
Gilles Peskine7820a572021-07-07 21:08:28 +02001098exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001100}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001102
Aorimn5f778012016-06-09 23:22:58 +02001103#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001104
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001105typedef unsigned char mbedtls_be128[16];
1106
1107/*
1108 * GF(2^128) multiplication function
1109 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001110 * This function multiplies a field element by x in the polynomial field
1111 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001112 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001113 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001114 */
Dave Rodgman4ad81cc2023-06-16 15:04:04 +01001115#if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001116MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
Dave Rodgman4ad81cc2023-06-16 15:04:04 +01001117#endif
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001118static inline void mbedtls_gf128mul_x_ble(unsigned char r[16],
Dave Rodgman2dd15b32023-06-15 20:27:53 +01001119 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001120{
1121 uint64_t a, b, ra, rb;
1122
Gilles Peskine449bd832023-01-11 14:50:10 +01001123 a = MBEDTLS_GET_UINT64_LE(x, 0);
1124 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1127 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001128
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1130 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001131}
1132
Aorimn5f778012016-06-09 23:22:58 +02001133/*
1134 * AES-XTS buffer encryption/decryption
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001135 *
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001136 * Use of MBEDTLS_OPTIMIZE_FOR_PERFORMANCE here and for mbedtls_gf128mul_x_ble()
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001137 * is a 3x performance improvement for gcc -Os, if we have hardware AES support.
Aorimn5f778012016-06-09 23:22:58 +02001138 */
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001139#if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001140MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001141#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001142int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1143 int mode,
1144 size_t length,
1145 const unsigned char data_unit[16],
1146 const unsigned char *input,
1147 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001148{
Janos Follath24eed8d2019-11-22 13:21:35 +00001149 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001150 size_t blocks = length / 16;
1151 size_t leftover = length % 16;
1152 unsigned char tweak[16];
1153 unsigned char prev_tweak[16];
1154 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001155
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001157 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001158 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001159
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001160 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001162 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001163 }
Aorimn5f778012016-06-09 23:22:58 +02001164
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001165 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001166 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001167 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001168 }
Aorimn5f778012016-06-09 23:22:58 +02001169
Jaeden Amerod82cd862018-04-28 15:02:45 +01001170 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001171 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1172 data_unit, tweak);
1173 if (ret != 0) {
1174 return ret;
1175 }
Aorimn5f778012016-06-09 23:22:58 +02001176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001178 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001179 /* We are on the last block in a decrypt operation that has
1180 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001181 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001182 * the leftovers and then update the current tweak for use on this,
1183 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 memcpy(prev_tweak, tweak, sizeof(tweak));
1185 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001186 }
1187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001189
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1191 if (ret != 0) {
1192 return ret;
1193 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001194
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001196
1197 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001199
1200 output += 16;
1201 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001202 }
1203
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001205 /* If we are on the leftover bytes in a decrypt operation, we need to
1206 * use the previous tweak for these bytes (as saved in prev_tweak). */
1207 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001208
Jaeden Amerod82cd862018-04-28 15:02:45 +01001209 /* We are now on the final part of the data unit, which doesn't divide
1210 * evenly by 16. It's time for ciphertext stealing. */
1211 size_t i;
1212 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001213
Jaeden Amerod82cd862018-04-28 15:02:45 +01001214 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001215 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001217 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001218 }
Aorimn5f778012016-06-09 23:22:58 +02001219
Dave Rodgman069e7f42022-11-24 19:37:26 +00001220 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001222
Jaeden Amerod82cd862018-04-28 15:02:45 +01001223 /* Copy ciphertext bytes from the previous block for input in this
1224 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001226
Gilles Peskine449bd832023-01-11 14:50:10 +01001227 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1228 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001229 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 }
Aorimn5f778012016-06-09 23:22:58 +02001231
Jaeden Amerod82cd862018-04-28 15:02:45 +01001232 /* Write the result back to the previous block, overriding the previous
1233 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001234 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001235 }
1236
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001238}
1239#endif /* MBEDTLS_CIPHER_MODE_XTS */
1240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001242/*
1243 * AES-CFB128 buffer encryption/decryption
1244 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001245int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1246 int mode,
1247 size_t length,
1248 size_t *iv_off,
1249 unsigned char iv[16],
1250 const unsigned char *input,
1251 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001252{
Paul Bakker27fdf462011-06-09 13:55:13 +00001253 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001254 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001255 size_t n;
1256
Gilles Peskine449bd832023-01-11 14:50:10 +01001257 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001258 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001260
1261 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001262
Gilles Peskine449bd832023-01-11 14:50:10 +01001263 if (n > 15) {
1264 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1265 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001266
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 if (mode == MBEDTLS_AES_DECRYPT) {
1268 while (length--) {
1269 if (n == 0) {
1270 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1271 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001272 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001274 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001275
1276 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001277 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001278 iv[n] = (unsigned char) c;
1279
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001281 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001282 } else {
1283 while (length--) {
1284 if (n == 0) {
1285 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1286 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001287 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001288 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001289 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001290
Gilles Peskine449bd832023-01-11 14:50:10 +01001291 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001292
Gilles Peskine449bd832023-01-11 14:50:10 +01001293 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001294 }
1295 }
1296
1297 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001298 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001299
Gilles Peskine7820a572021-07-07 21:08:28 +02001300exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001301 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001302}
Paul Bakker556efba2014-01-24 15:38:12 +01001303
1304/*
1305 * AES-CFB8 buffer encryption/decryption
1306 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001307int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1308 int mode,
1309 size_t length,
1310 unsigned char iv[16],
1311 const unsigned char *input,
1312 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001313{
Gilles Peskine7820a572021-07-07 21:08:28 +02001314 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001315 unsigned char c;
1316 unsigned char ov[17];
1317
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001319 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 }
1321 while (length--) {
1322 memcpy(ov, iv, 16);
1323 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1324 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001325 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 }
Paul Bakker556efba2014-01-24 15:38:12 +01001327
Gilles Peskine449bd832023-01-11 14:50:10 +01001328 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001329 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001330 }
Paul Bakker556efba2014-01-24 15:38:12 +01001331
Gilles Peskine449bd832023-01-11 14:50:10 +01001332 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001333
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001335 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001336 }
Paul Bakker556efba2014-01-24 15:38:12 +01001337
Gilles Peskine449bd832023-01-11 14:50:10 +01001338 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001339 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001340 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001341
Gilles Peskine7820a572021-07-07 21:08:28 +02001342exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001344}
Simon Butcher76a5b222018-04-22 22:57:27 +01001345#endif /* MBEDTLS_CIPHER_MODE_CFB */
1346
1347#if defined(MBEDTLS_CIPHER_MODE_OFB)
1348/*
1349 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1350 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001351int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1352 size_t length,
1353 size_t *iv_off,
1354 unsigned char iv[16],
1355 const unsigned char *input,
1356 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001357{
Simon Butcherad4e4932018-04-29 00:43:47 +01001358 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001359 size_t n;
1360
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001361 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 if (n > 15) {
1364 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1365 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001366
Gilles Peskine449bd832023-01-11 14:50:10 +01001367 while (length--) {
1368 if (n == 0) {
1369 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1370 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001371 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001372 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001373 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001374 *output++ = *input++ ^ iv[n];
1375
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001377 }
1378
1379 *iv_off = n;
1380
Simon Butcherad4e4932018-04-29 00:43:47 +01001381exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001383}
1384#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001386#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001387/*
1388 * AES-CTR buffer encryption/decryption
1389 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001390int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1391 size_t length,
1392 size_t *nc_off,
1393 unsigned char nonce_counter[16],
1394 unsigned char stream_block[16],
1395 const unsigned char *input,
1396 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001397{
Gilles Peskine7820a572021-07-07 21:08:28 +02001398 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001399
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001400 size_t offset = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001401
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001402 if (offset > 0x0F) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1404 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001405
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001406 for (size_t i = 0; i < length;) {
1407 size_t n = 16;
1408 if (offset == 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1410 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001411 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 }
Dave Rodgman591ff052024-01-13 16:42:38 +00001413 mbedtls_ctr_increment_counter(nonce_counter);
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001414 } else {
1415 n -= offset;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001416 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001417
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001418 if (n > (length - i)) {
1419 n = (length - i);
1420 }
1421 mbedtls_xor(&output[i], &input[i], &stream_block[offset], n);
1422 // offset might be non-zero for the last block, but in that case, we don't use it again
1423 offset = 0;
1424 i += n;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001425 }
1426
Dave Rodgmanc4f984f2024-01-12 18:29:01 +00001427 // capture offset for future resumption
1428 *nc_off = (*nc_off + length) % 16;
1429
Gilles Peskine7820a572021-07-07 21:08:28 +02001430 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001431
Gilles Peskine7820a572021-07-07 21:08:28 +02001432exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001433 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001434}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001435#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001438/*
1439 * AES test vectors from:
1440 *
1441 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1442 */
Yanray Wangb67b4742023-10-31 17:10:32 +08001443#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Yanray Wang62c99912023-05-11 11:06:53 +08001444static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001445{
1446 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1447 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001448#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001449 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1450 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1451 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1452 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001453#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001454};
Yanray Wang78ee0c92023-05-15 11:23:50 +08001455#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001456
Yanray Wang62c99912023-05-11 11:06:53 +08001457static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001458{
1459 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1460 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001461#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001462 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1463 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1464 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1465 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001466#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001467};
1468
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001470static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001471{
1472 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1473 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001474#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001475 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1476 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1477 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1478 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001479#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001480};
1481
Yanray Wang62c99912023-05-11 11:06:53 +08001482static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001483{
1484 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1485 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001486#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001487 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1488 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1489 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1490 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001491#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001492};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001494
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001495#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001496/*
1497 * AES-CFB128 test vectors from:
1498 *
1499 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1500 */
Yanray Wang62c99912023-05-11 11:06:53 +08001501static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001502{
1503 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1504 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001505#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001506 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1507 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1508 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1509 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1510 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1511 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1512 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001513#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001514};
1515
1516static const unsigned char aes_test_cfb128_iv[16] =
1517{
1518 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1519 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1520};
1521
1522static const unsigned char aes_test_cfb128_pt[64] =
1523{
1524 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1525 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1526 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1527 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1528 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1529 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1530 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1531 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1532};
1533
Yanray Wang62c99912023-05-11 11:06:53 +08001534static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001535{
1536 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1537 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1538 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1539 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1540 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1541 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1542 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1543 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001544#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001545 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1546 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1547 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1548 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1549 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1550 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1551 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1552 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1553 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1554 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1555 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1556 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1557 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1558 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1559 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1560 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001561#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001562};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001563#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001564
Simon Butcherad4e4932018-04-29 00:43:47 +01001565#if defined(MBEDTLS_CIPHER_MODE_OFB)
1566/*
1567 * AES-OFB test vectors from:
1568 *
Simon Butcher5db13622018-06-04 22:11:25 +01001569 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001570 */
Yanray Wang62c99912023-05-11 11:06:53 +08001571static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001572{
1573 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1574 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001575#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001576 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1577 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1578 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1579 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1580 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1581 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1582 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001583#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001584};
1585
1586static const unsigned char aes_test_ofb_iv[16] =
1587{
1588 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1589 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1590};
1591
1592static const unsigned char aes_test_ofb_pt[64] =
1593{
1594 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1595 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1596 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1597 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1598 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1599 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1600 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1601 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1602};
1603
Yanray Wang62c99912023-05-11 11:06:53 +08001604static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001605{
1606 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1607 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1608 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1609 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1610 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1611 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1612 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1613 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001614#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001615 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1616 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1617 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1618 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1619 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1620 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1621 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1622 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1623 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1624 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1625 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1626 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1627 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1628 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1629 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1630 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001631#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001632};
1633#endif /* MBEDTLS_CIPHER_MODE_OFB */
1634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001635#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001636/*
1637 * AES-CTR test vectors from:
1638 *
1639 * http://www.faqs.org/rfcs/rfc3686.html
1640 */
1641
Yanray Wang62c99912023-05-11 11:06:53 +08001642static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001643{
1644 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1645 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1646 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1647 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1648 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1649 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1650};
1651
Yanray Wang62c99912023-05-11 11:06:53 +08001652static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001653{
1654 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1656 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1657 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1658 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1659 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1660};
1661
Yanray Wang62c99912023-05-11 11:06:53 +08001662static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001663{
1664 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1665 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001666 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1667 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1668 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1669 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1670
1671 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1672 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1673 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1674 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1675 0x20, 0x21, 0x22, 0x23 }
1676};
1677
Yanray Wang62c99912023-05-11 11:06:53 +08001678static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001679{
1680 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1681 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1682 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1683 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1684 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1685 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1686 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1687 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1688 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1689 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1690 0x25, 0xB2, 0x07, 0x2F }
1691};
1692
1693static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001694{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001695#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001696
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001697#if defined(MBEDTLS_CIPHER_MODE_XTS)
1698/*
1699 * AES-XTS test vectors from:
1700 *
1701 * IEEE P1619/D16 Annex B
1702 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1703 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1704 */
1705static const unsigned char aes_test_xts_key[][32] =
1706{
1707 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1711 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1712 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1713 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1714 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1715 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1716 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1717 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1718 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1719};
1720
1721static const unsigned char aes_test_xts_pt32[][32] =
1722{
1723 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1727 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1728 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1729 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1730 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1731 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1732 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1733 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1734 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1735};
1736
1737static const unsigned char aes_test_xts_ct32[][32] =
1738{
1739 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1740 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1741 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1742 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1743 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1744 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1745 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1746 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1747 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1748 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1749 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1750 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1751};
1752
1753static const unsigned char aes_test_xts_data_unit[][16] =
1754{
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1757 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1759 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001761};
1762
1763#endif /* MBEDTLS_CIPHER_MODE_XTS */
1764
Paul Bakker5121ce52009-01-03 21:22:43 +00001765/*
1766 * Checkup routine
1767 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001768int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001769{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001770 int ret = 0, i, j, u, mode;
1771 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001772 unsigned char key[32];
1773 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001774 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001775#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1776 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001777 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001778#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001779#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001780 unsigned char prv[16];
1781#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001782#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1783 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001784 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001785#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001786#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001787 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001788#endif
1789#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001790 unsigned char nonce_counter[16];
1791 unsigned char stream_block[16];
1792#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001793 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001794
Gilles Peskine449bd832023-01-11 14:50:10 +01001795 memset(key, 0, 32);
1796 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001797
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001798 if (verbose != 0) {
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001799#if defined(MBEDTLS_AESNI_HAVE_CODE)
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001800#if MBEDTLS_AESNI_HAVE_CODE == 1
Dave Rodgman086e1372023-06-16 20:21:39 +01001801 mbedtls_printf(" AES note: AESNI code present (assembly implementation).\n");
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001802#elif MBEDTLS_AESNI_HAVE_CODE == 2
Dave Rodgman086e1372023-06-16 20:21:39 +01001803 mbedtls_printf(" AES note: AESNI code present (intrinsics implementation).\n");
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001804#else
Antonio de Angelis1ee4d122023-08-16 12:26:37 +01001805#error "Unrecognised value for MBEDTLS_AESNI_HAVE_CODE"
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001806#endif
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001807 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1808 mbedtls_printf(" AES note: using AESNI.\n");
1809 } else
1810#endif
Jerry Yu72fd0bd2023-08-18 16:31:01 +08001811#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +01001812 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001813 mbedtls_printf(" AES note: using AESCE.\n");
1814 } else
1815#endif
Jerry Yu29c91ba2023-08-04 11:02:04 +08001816 {
1817#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
1818 mbedtls_printf(" AES note: built-in implementation.\n");
1819#endif
1820 }
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001821 }
1822
Paul Bakker5121ce52009-01-03 21:22:43 +00001823 /*
1824 * ECB mode
1825 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001826 {
1827 static const int num_tests =
Yanray Wang78ee0c92023-05-15 11:23:50 +08001828 sizeof(aes_test_ecb_enc) / sizeof(*aes_test_ecb_enc);
Paul Bakker5121ce52009-01-03 21:22:43 +00001829
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001830 for (i = 0; i < num_tests << 1; i++) {
1831 u = i >> 1;
1832 keybits = 128 + u * 64;
1833 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001834
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001835 if (verbose != 0) {
1836 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1837 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1838 }
Yanray Wangb67b4742023-10-31 17:10:32 +08001839#if defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Yanray Wang78ee0c92023-05-15 11:23:50 +08001840 if (mode == MBEDTLS_AES_DECRYPT) {
1841 if (verbose != 0) {
1842 mbedtls_printf("skipped\n");
1843 }
1844 continue;
1845 }
1846#endif
Arto Kinnunen0f066182023-04-20 10:02:46 +08001847
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001848 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001849
Yanray Wangb67b4742023-10-31 17:10:32 +08001850#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001851 if (mode == MBEDTLS_AES_DECRYPT) {
1852 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1853 aes_tests = aes_test_ecb_dec[u];
Yanray Wang78ee0c92023-05-15 11:23:50 +08001854 } else
1855#endif
1856 {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001857 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1858 aes_tests = aes_test_ecb_enc[u];
1859 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001860
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001861 /*
1862 * AES-192 is an optional feature that may be unavailable when
Thomas Daubney478efd72024-06-17 16:04:50 +01001863 * there is an alternative underlying implementation i.e when
1864 * MBEDTLS_AES_SETKEY_ENC_ALT or MBEDTLS_AES_SETKEY_DEC_ALT
1865 * are defined.
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001866 */
1867 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1868 mbedtls_printf("skipped\n");
1869 continue;
1870 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001871 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001873
1874 for (j = 0; j < 10000; j++) {
1875 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1876 if (ret != 0) {
1877 goto exit;
1878 }
1879 }
1880
1881 if (memcmp(buf, aes_tests, 16) != 0) {
1882 ret = 1;
1883 goto exit;
1884 }
1885
1886 if (verbose != 0) {
1887 mbedtls_printf("passed\n");
1888 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001889 }
1890
Gilles Peskine449bd832023-01-11 14:50:10 +01001891 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001892 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001893 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001894 }
1895
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001896#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001897 /*
1898 * CBC mode
1899 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001900 {
1901 static const int num_tests =
1902 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001903
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001904 for (i = 0; i < num_tests << 1; i++) {
1905 u = i >> 1;
1906 keybits = 128 + u * 64;
1907 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001908
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001909 if (verbose != 0) {
1910 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1911 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001912 }
1913
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001914 memset(iv, 0, 16);
1915 memset(prv, 0, 16);
1916 memset(buf, 0, 16);
1917
1918 if (mode == MBEDTLS_AES_DECRYPT) {
1919 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1920 aes_tests = aes_test_cbc_dec[u];
1921 } else {
1922 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1923 aes_tests = aes_test_cbc_enc[u];
1924 }
1925
1926 /*
1927 * AES-192 is an optional feature that may be unavailable when
Thomas Daubney41376092024-06-04 16:37:42 +01001928 * there is an alternative underlying implementation such as a
1929 * PSA driver.
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001930 */
1931 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1932 mbedtls_printf("skipped\n");
1933 continue;
1934 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001935 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001936 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001937
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001938 for (j = 0; j < 10000; j++) {
1939 if (mode == MBEDTLS_AES_ENCRYPT) {
1940 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001941
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001942 memcpy(tmp, prv, 16);
1943 memcpy(prv, buf, 16);
1944 memcpy(buf, tmp, 16);
1945 }
1946
1947 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1948 if (ret != 0) {
1949 goto exit;
1950 }
1951
1952 }
1953
1954 if (memcmp(buf, aes_tests, 16) != 0) {
1955 ret = 1;
1956 goto exit;
1957 }
1958
1959 if (verbose != 0) {
1960 mbedtls_printf("passed\n");
1961 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001962 }
1963
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001965 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001966 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001967 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001968#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001970#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001971 /*
1972 * CFB128 mode
1973 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001974 {
1975 static const int num_tests =
1976 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001977
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001978 for (i = 0; i < num_tests << 1; i++) {
1979 u = i >> 1;
1980 keybits = 128 + u * 64;
1981 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001982
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001983 if (verbose != 0) {
1984 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1985 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1986 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001987
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001988 memcpy(iv, aes_test_cfb128_iv, 16);
1989 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001990
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001991 offset = 0;
1992 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1993 /*
1994 * AES-192 is an optional feature that may be unavailable when
Thomas Daubney41376092024-06-04 16:37:42 +01001995 * there is an alternative underlying implementation such as a
1996 * PSA driver.
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001997 */
1998 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1999 mbedtls_printf("skipped\n");
2000 continue;
2001 } else if (ret != 0) {
2002 goto exit;
2003 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002004
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002005 if (mode == MBEDTLS_AES_DECRYPT) {
2006 memcpy(buf, aes_test_cfb128_ct[u], 64);
2007 aes_tests = aes_test_cfb128_pt;
2008 } else {
2009 memcpy(buf, aes_test_cfb128_pt, 64);
2010 aes_tests = aes_test_cfb128_ct[u];
2011 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002012
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002013 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2014 if (ret != 0) {
2015 goto exit;
2016 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002017
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002018 if (memcmp(buf, aes_tests, 64) != 0) {
2019 ret = 1;
2020 goto exit;
2021 }
2022
2023 if (verbose != 0) {
2024 mbedtls_printf("passed\n");
2025 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002026 }
2027
Gilles Peskine449bd832023-01-11 14:50:10 +01002028 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002029 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002030 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002031 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002032#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002033
Simon Butcherad4e4932018-04-29 00:43:47 +01002034#if defined(MBEDTLS_CIPHER_MODE_OFB)
2035 /*
2036 * OFB mode
2037 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002038 {
2039 static const int num_tests =
2040 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002041
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002042 for (i = 0; i < num_tests << 1; i++) {
2043 u = i >> 1;
2044 keybits = 128 + u * 64;
2045 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002046
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002047 if (verbose != 0) {
2048 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2049 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2050 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002051
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002052 memcpy(iv, aes_test_ofb_iv, 16);
2053 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002054
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002055 offset = 0;
2056 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2057 /*
2058 * AES-192 is an optional feature that may be unavailable when
Thomas Daubney41376092024-06-04 16:37:42 +01002059 * there is an alternative underlying implementation such as a
2060 * PSA driver.
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002061 */
2062 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2063 mbedtls_printf("skipped\n");
2064 continue;
2065 } else if (ret != 0) {
2066 goto exit;
2067 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002068
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002069 if (mode == MBEDTLS_AES_DECRYPT) {
2070 memcpy(buf, aes_test_ofb_ct[u], 64);
2071 aes_tests = aes_test_ofb_pt;
2072 } else {
2073 memcpy(buf, aes_test_ofb_pt, 64);
2074 aes_tests = aes_test_ofb_ct[u];
2075 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002076
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002077 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2078 if (ret != 0) {
2079 goto exit;
2080 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002081
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002082 if (memcmp(buf, aes_tests, 64) != 0) {
2083 ret = 1;
2084 goto exit;
2085 }
2086
2087 if (verbose != 0) {
2088 mbedtls_printf("passed\n");
2089 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002090 }
2091
Gilles Peskine449bd832023-01-11 14:50:10 +01002092 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002093 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002094 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002095 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002096#endif /* MBEDTLS_CIPHER_MODE_OFB */
2097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002098#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002099 /*
2100 * CTR mode
2101 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002102 {
2103 static const int num_tests =
2104 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002106 for (i = 0; i < num_tests << 1; i++) {
2107 u = i >> 1;
2108 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002109
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002110 if (verbose != 0) {
2111 mbedtls_printf(" AES-CTR-128 (%s): ",
2112 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2113 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002114
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002115 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2116 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002117
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002118 offset = 0;
2119 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2120 goto exit;
2121 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002122
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002123 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002124
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002125 if (mode == MBEDTLS_AES_DECRYPT) {
2126 memcpy(buf, aes_test_ctr_ct[u], len);
2127 aes_tests = aes_test_ctr_pt[u];
2128 } else {
2129 memcpy(buf, aes_test_ctr_pt[u], len);
2130 aes_tests = aes_test_ctr_ct[u];
2131 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002132
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002133 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2134 stream_block, buf, buf);
2135 if (ret != 0) {
2136 goto exit;
2137 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002138
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002139 if (memcmp(buf, aes_tests, len) != 0) {
2140 ret = 1;
2141 goto exit;
2142 }
2143
2144 if (verbose != 0) {
2145 mbedtls_printf("passed\n");
2146 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002147 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002148 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002149
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 if (verbose != 0) {
2151 mbedtls_printf("\n");
2152 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002153#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002154
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002155#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002156 /*
2157 * XTS mode
2158 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002159 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002160 static const int num_tests =
2161 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2162 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002163
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002165
Gilles Peskine449bd832023-01-11 14:50:10 +01002166 for (i = 0; i < num_tests << 1; i++) {
2167 const unsigned char *data_unit;
2168 u = i >> 1;
2169 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002170
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 if (verbose != 0) {
2172 mbedtls_printf(" AES-XTS-128 (%s): ",
2173 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2174 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 memset(key, 0, sizeof(key));
2177 memcpy(key, aes_test_xts_key[u], 32);
2178 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 if (mode == MBEDTLS_AES_DECRYPT) {
2183 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2184 if (ret != 0) {
2185 goto exit;
2186 }
2187 memcpy(buf, aes_test_xts_ct32[u], len);
2188 aes_tests = aes_test_xts_pt32[u];
2189 } else {
2190 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2191 if (ret != 0) {
2192 goto exit;
2193 }
2194 memcpy(buf, aes_test_xts_pt32[u], len);
2195 aes_tests = aes_test_xts_ct32[u];
2196 }
2197
2198
2199 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2200 buf, buf);
2201 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002202 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 }
2204
2205 if (memcmp(buf, aes_tests, len) != 0) {
2206 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002207 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002208 }
2209
2210 if (verbose != 0) {
2211 mbedtls_printf("passed\n");
2212 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002213 }
2214
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 if (verbose != 0) {
2216 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002217 }
2218
Gilles Peskine449bd832023-01-11 14:50:10 +01002219 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002220 }
2221#endif /* MBEDTLS_CIPHER_MODE_XTS */
2222
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002223 ret = 0;
2224
2225exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 if (ret != 0 && verbose != 0) {
2227 mbedtls_printf("failed\n");
2228 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002231
Gilles Peskine449bd832023-01-11 14:50:10 +01002232 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002233}
2234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002235#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002236
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002237#endif /* MBEDTLS_AES_C */