blob: 414c42c1dbf78dc66a2f71dd0311aa199b3c7cb6 [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
21 *
22 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
23 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
31
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030033#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000042
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020046
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010047/* Parameter validation macros based on platform_util.h */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010048#define AES_VALIDATE_RET(cond) \
49 MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA)
50#define AES_VALIDATE(cond) \
51 MBEDTLS_INTERNAL_VALIDATE(cond)
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010052
Gilles Peskine30c356c2023-03-16 14:58:46 +010053#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +000054static int aes_padlock_ace = -1;
55#endif
56
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000058/*
59 * Forward S-box
60 */
61static const unsigned char FSb[256] =
62{
63 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
64 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
65 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
66 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
67 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
68 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
69 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
70 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
71 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
72 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
73 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
74 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
75 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
76 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
77 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
78 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
79 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
80 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
81 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
82 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
83 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
84 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
85 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
86 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
87 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
88 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
89 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
90 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
91 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
92 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
93 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
94 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
95};
96
97/*
98 * Forward tables
99 */
100#define FT \
101\
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100102 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
103 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
104 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
105 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
106 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
107 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
108 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
109 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
110 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
111 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
112 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
113 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
114 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
115 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
116 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
117 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
118 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
119 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
120 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
121 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
122 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
123 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
124 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
125 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
126 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
127 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
128 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
129 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
130 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
131 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
132 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
133 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
134 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
135 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
136 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
137 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
138 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
139 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
140 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
141 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
142 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
143 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
144 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
145 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
146 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
147 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
148 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
149 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
150 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
151 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
152 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
153 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
154 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
155 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
156 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
157 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
158 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
159 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
160 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
161 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
162 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
163 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
164 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
165 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 +0000166
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100167#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000168static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000169#undef V
170
Hanno Beckerad049a92017-06-19 16:31:54 +0100171#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200172
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100173#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000174static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000175#undef V
176
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100177#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000178static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000179#undef V
180
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100181#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000182static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000183#undef V
184
Hanno Becker177d3cf2017-06-07 15:52:48 +0100185#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200186
Paul Bakker5121ce52009-01-03 21:22:43 +0000187#undef FT
188
189/*
190 * Reverse S-box
191 */
192static const unsigned char RSb[256] =
193{
194 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
195 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
196 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
197 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
198 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
199 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
200 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
201 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
202 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
203 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
204 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
205 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
206 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
207 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
208 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
209 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
210 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
211 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
212 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
213 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
214 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
215 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
216 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
217 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
218 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
219 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
220 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
221 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
222 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
223 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
224 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
225 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
226};
227
228/*
229 * Reverse tables
230 */
231#define RT \
232\
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100233 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
234 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
235 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
236 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
237 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
238 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
239 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
240 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
241 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
242 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
243 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
244 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
245 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
246 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
247 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
248 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
249 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
250 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
251 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
252 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
253 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
254 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
255 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
256 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
257 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
258 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
259 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
260 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
261 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
262 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
263 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
264 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
265 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
266 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
267 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
268 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
269 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
270 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
271 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
272 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
273 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
274 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
275 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
276 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
277 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
278 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
279 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
280 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
281 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
282 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
283 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
284 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
285 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
286 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
287 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
288 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
289 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
290 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
291 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
292 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
293 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
294 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
295 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
296 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 +0000297
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100298#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000299static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000300#undef V
301
Hanno Beckerad049a92017-06-19 16:31:54 +0100302#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200303
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100304#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000305static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000306#undef V
307
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100308#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000310#undef V
311
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100312#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000313static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000314#undef V
315
Hanno Becker177d3cf2017-06-07 15:52:48 +0100316#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200317
Paul Bakker5121ce52009-01-03 21:22:43 +0000318#undef RT
319
320/*
321 * Round constants
322 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000323static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000324{
325 0x00000001, 0x00000002, 0x00000004, 0x00000008,
326 0x00000010, 0x00000020, 0x00000040, 0x00000080,
327 0x0000001B, 0x00000036
328};
329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000331
332/*
333 * Forward S-box & tables
334 */
335static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200336static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100337#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200338static uint32_t FT1[256];
339static uint32_t FT2[256];
340static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100341#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000342
343/*
344 * Reverse S-box & tables
345 */
346static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000347static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100348#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000349static uint32_t RT1[256];
350static uint32_t RT2[256];
351static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100352#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000353
354/*
355 * Round constants
356 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000358
359/*
360 * Tables generation code
361 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100362#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
363#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
364#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
366static int aes_init_done = 0;
367
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100368static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000369{
370 int i, x, y, z;
371 int pow[256];
372 int log[256];
373
374 /*
375 * compute pow and log tables over GF(2^8)
376 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100377 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000378 pow[i] = x;
379 log[x] = i;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100380 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000381 }
382
383 /*
384 * calculate the round constants
385 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100386 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000387 RCON[i] = (uint32_t) x;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100388 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000389 }
390
391 /*
392 * generate the forward and reverse S-boxes
393 */
394 FSb[0x00] = 0x63;
395 RSb[0x63] = 0x00;
396
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100397 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000398 x = pow[255 - log[i]];
399
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100400 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
401 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
402 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
403 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000404 x ^= y ^ 0x63;
405
406 FSb[i] = (unsigned char) x;
407 RSb[x] = (unsigned char) i;
408 }
409
410 /*
411 * generate the forward and reverse tables
412 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100413 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000414 x = FSb[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100415 y = MBEDTLS_BYTE_0(XTIME(x));
416 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100418 FT0[i] = ((uint32_t) y) ^
419 ((uint32_t) x << 8) ^
420 ((uint32_t) x << 16) ^
421 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
Hanno Beckerad049a92017-06-19 16:31:54 +0100423#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100424 FT1[i] = ROTL8(FT0[i]);
425 FT2[i] = ROTL8(FT1[i]);
426 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100427#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
429 x = RSb[i];
430
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100431 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
432 ((uint32_t) MUL(0x09, x) << 8) ^
433 ((uint32_t) MUL(0x0D, x) << 16) ^
434 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000435
Hanno Beckerad049a92017-06-19 16:31:54 +0100436#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100437 RT1[i] = ROTL8(RT0[i]);
438 RT2[i] = ROTL8(RT1[i]);
439 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100440#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000441 }
442}
443
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200444#undef ROTL8
445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Hanno Beckerad049a92017-06-19 16:31:54 +0100448#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200449
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100450#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
451#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
452#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200453
454#define AES_RT0(idx) RT0[idx]
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100455#define AES_RT1(idx) ROTL8(RT0[idx])
456#define AES_RT2(idx) ROTL16(RT0[idx])
457#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200458
459#define AES_FT0(idx) FT0[idx]
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100460#define AES_FT1(idx) ROTL8(FT0[idx])
461#define AES_FT2(idx) ROTL16(FT0[idx])
462#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200463
Hanno Becker177d3cf2017-06-07 15:52:48 +0100464#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200465
466#define AES_RT0(idx) RT0[idx]
467#define AES_RT1(idx) RT1[idx]
468#define AES_RT2(idx) RT2[idx]
469#define AES_RT3(idx) RT3[idx]
470
471#define AES_FT0(idx) FT0[idx]
472#define AES_FT1(idx) FT1[idx]
473#define AES_FT2(idx) FT2[idx]
474#define AES_FT3(idx) FT3[idx]
475
Hanno Becker177d3cf2017-06-07 15:52:48 +0100476#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200477
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100478void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200479{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100480 AES_VALIDATE(ctx != NULL);
Simon Butcher5201e412018-12-06 17:40:14 +0000481
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100482 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483}
484
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100485void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200486{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100487 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200488 return;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100489 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100491 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200492}
493
Jaeden Amero9366feb2018-05-29 18:55:17 +0100494#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100495void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100496{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100497 AES_VALIDATE(ctx != NULL);
Simon Butcher5201e412018-12-06 17:40:14 +0000498
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100499 mbedtls_aes_init(&ctx->crypt);
500 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100501}
502
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100503void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100504{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100505 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100506 return;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100507 }
Simon Butcher5201e412018-12-06 17:40:14 +0000508
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100509 mbedtls_aes_free(&ctx->crypt);
510 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100511}
512#endif /* MBEDTLS_CIPHER_MODE_XTS */
513
Gilles Peskineb71d4022023-03-16 17:14:59 +0100514/* Some implementations need the round keys to be aligned.
515 * Return an offset to be added to buf, such that (buf + offset) is
516 * correctly aligned.
517 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
518 * i.e. an offset of 1 means 4 bytes and so on.
519 */
520#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine6dec5412023-03-16 17:21:33 +0100521 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskineb71d4022023-03-16 17:14:59 +0100522#define MAY_NEED_TO_ALIGN
523#endif
524static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
525{
526#if defined(MAY_NEED_TO_ALIGN)
527 int align_16_bytes = 0;
528
529#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
530 if (aes_padlock_ace == -1) {
531 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
532 }
533 if (aes_padlock_ace) {
534 align_16_bytes = 1;
535 }
536#endif
537
Gilles Peskine6dec5412023-03-16 17:21:33 +0100538#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskineb71d4022023-03-16 17:14:59 +0100539 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
540 align_16_bytes = 1;
541 }
542#endif
543
544 if (align_16_bytes) {
545 /* These implementations needs 16-byte alignment
546 * for the round key array. */
547 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
548 if (delta == 0) {
549 return 0;
550 } else {
551 return 4 - delta; // 16 bytes = 4 uint32_t
552 }
553 }
554#else /* MAY_NEED_TO_ALIGN */
555 (void) buf;
556#endif /* MAY_NEED_TO_ALIGN */
557
558 return 0;
559}
560
Paul Bakker5121ce52009-01-03 21:22:43 +0000561/*
562 * AES key schedule (encryption)
563 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200564#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100565int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
566 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000567{
Paul Bakker23986e52011-04-24 08:57:21 +0000568 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000569 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000570
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100571 AES_VALIDATE_RET(ctx != NULL);
572 AES_VALIDATE_RET(key != NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100574 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 case 128: ctx->nr = 10; break;
576 case 192: ctx->nr = 12; break;
577 case 256: ctx->nr = 14; break;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100578 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000579 }
580
Simon Butcher5201e412018-12-06 17:40:14 +0000581#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100582 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000583 aes_gen_tables();
584 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000585 }
586#endif
587
Gilles Peskineb71d4022023-03-16 17:14:59 +0100588 ctx->rk = RK = ctx->buf + mbedtls_aes_rk_offset(ctx->buf);
Paul Bakker5121ce52009-01-03 21:22:43 +0000589
Gilles Peskine5511a342023-03-10 22:29:32 +0100590#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100591 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
592 return mbedtls_aesni_setkey_enc((unsigned char *) ctx->rk, key, keybits);
593 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100594#endif
595
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100596 for (i = 0; i < (keybits >> 5); i++) {
597 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000598 }
599
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100600 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000601 case 10:
602
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100603 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000604 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100605 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
606 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
607 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
608 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000609
610 RK[5] = RK[1] ^ RK[4];
611 RK[6] = RK[2] ^ RK[5];
612 RK[7] = RK[3] ^ RK[6];
613 }
614 break;
615
616 case 12:
617
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100618 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100620 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
621 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
622 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
623 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625 RK[7] = RK[1] ^ RK[6];
626 RK[8] = RK[2] ^ RK[7];
627 RK[9] = RK[3] ^ RK[8];
628 RK[10] = RK[4] ^ RK[9];
629 RK[11] = RK[5] ^ RK[10];
630 }
631 break;
632
633 case 14:
634
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100635 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100637 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
638 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
639 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
640 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[9] = RK[1] ^ RK[8];
643 RK[10] = RK[2] ^ RK[9];
644 RK[11] = RK[3] ^ RK[10];
645
646 RK[12] = RK[4] ^
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100647 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
648 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[13] = RK[5] ^ RK[12];
653 RK[14] = RK[6] ^ RK[13];
654 RK[15] = RK[7] ^ RK[14];
655 }
656 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000658
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100659 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000660}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200661#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000662
663/*
664 * AES key schedule (decryption)
665 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200666#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100667int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
668 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000669{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200670 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000672 uint32_t *RK;
673 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200674
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100675 AES_VALIDATE_RET(ctx != NULL);
676 AES_VALIDATE_RET(key != NULL);
Simon Butcher5201e412018-12-06 17:40:14 +0000677
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100678 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000679
Gilles Peskineb71d4022023-03-16 17:14:59 +0100680 ctx->rk = RK = ctx->buf + mbedtls_aes_rk_offset(ctx->buf);
Paul Bakker5121ce52009-01-03 21:22:43 +0000681
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200682 /* Also checks keybits */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100683 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200684 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100685 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000686
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200687 ctx->nr = cty.nr;
688
Gilles Peskine5511a342023-03-10 22:29:32 +0100689#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100690 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
691 mbedtls_aesni_inverse_key((unsigned char *) ctx->rk,
692 (const unsigned char *) cty.rk, ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200693 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100694 }
695#endif
696
Paul Bakker5121ce52009-01-03 21:22:43 +0000697 SK = cty.rk + cty.nr * 4;
698
699 *RK++ = *SK++;
700 *RK++ = *SK++;
701 *RK++ = *SK++;
702 *RK++ = *SK++;
703
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100704 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
705 for (j = 0; j < 4; j++, SK++) {
706 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
707 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
708 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
709 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000710 }
711 }
712
713 *RK++ = *SK++;
714 *RK++ = *SK++;
715 *RK++ = *SK++;
716 *RK++ = *SK++;
717
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200718exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100719 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000720
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100721 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000722}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100723#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100724
725#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100726static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
727 unsigned int keybits,
728 const unsigned char **key1,
729 unsigned int *key1bits,
730 const unsigned char **key2,
731 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100732{
733 const unsigned int half_keybits = keybits / 2;
734 const unsigned int half_keybytes = half_keybits / 8;
735
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100736 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100737 case 256: break;
738 case 512: break;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100739 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100740 }
741
742 *key1bits = half_keybits;
743 *key2bits = half_keybits;
744 *key1 = &key[0];
745 *key2 = &key[half_keybytes];
746
747 return 0;
748}
749
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100750int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
751 const unsigned char *key,
752 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100753{
Janos Follath24eed8d2019-11-22 13:21:35 +0000754 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100755 const unsigned char *key1, *key2;
756 unsigned int key1bits, key2bits;
757
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100758 AES_VALIDATE_RET(ctx != NULL);
759 AES_VALIDATE_RET(key != NULL);
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100760
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100761 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
762 &key2, &key2bits);
763 if (ret != 0) {
764 return ret;
765 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100766
767 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100768 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
769 if (ret != 0) {
770 return ret;
771 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772
773 /* Set crypt key for encryption. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100774 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100775}
776
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100777int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
778 const unsigned char *key,
779 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100780{
Janos Follath24eed8d2019-11-22 13:21:35 +0000781 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100782 const unsigned char *key1, *key2;
783 unsigned int key1bits, key2bits;
784
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100785 AES_VALIDATE_RET(ctx != NULL);
786 AES_VALIDATE_RET(key != NULL);
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100787
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100788 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
789 &key2, &key2bits);
790 if (ret != 0) {
791 return ret;
792 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100793
794 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100795 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
796 if (ret != 0) {
797 return ret;
798 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100799
800 /* Set crypt key for decryption. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100801 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100802}
803#endif /* MBEDTLS_CIPHER_MODE_XTS */
804
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100805#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbiani6b897c92021-07-08 14:59:52 +0100806 do \
807 { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100808 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
809 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
810 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
811 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbiani6b897c92021-07-08 14:59:52 +0100812 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100813 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
814 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
815 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
816 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbiani6b897c92021-07-08 14:59:52 +0100817 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100818 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
819 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
820 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
821 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbiani6b897c92021-07-08 14:59:52 +0100822 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100823 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
824 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
825 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
826 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
827 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000828
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100829#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100830 do \
831 { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100832 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
833 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
834 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
835 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100836 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100837 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
838 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
839 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
840 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100841 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100842 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
843 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
844 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
845 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100846 \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100847 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
848 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
849 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
850 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
851 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000852
853/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200854 * AES-ECB block encryption
855 */
856#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100857int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
858 const unsigned char input[16],
859 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200860{
861 int i;
Gilles Peskine5197c662020-08-26 17:03:24 +0200862 uint32_t *RK = ctx->rk;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100863 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200864 uint32_t X[4];
865 uint32_t Y[4];
866 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200867
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100868 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
869 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
870 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
871 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200872
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100873 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
874 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]);
875 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 +0200876 }
877
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100878 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 +0200879
Gilles Peskine5197c662020-08-26 17:03:24 +0200880 t.X[0] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100881 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
882 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
883 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
884 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200885
Gilles Peskine5197c662020-08-26 17:03:24 +0200886 t.X[1] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100887 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
888 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
889 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
890 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200891
Gilles Peskine5197c662020-08-26 17:03:24 +0200892 t.X[2] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100893 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
894 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
896 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200897
Gilles Peskine5197c662020-08-26 17:03:24 +0200898 t.X[3] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100899 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
900 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
901 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
902 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200903
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100904 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
905 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
906 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
907 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000908
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100909 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500910
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100911 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200912}
913#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
914
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100915#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100916void mbedtls_aes_encrypt(mbedtls_aes_context *ctx,
917 const unsigned char input[16],
918 unsigned char output[16])
Hanno Beckerbedc2052017-06-26 12:46:56 +0100919{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100920 MBEDTLS_IGNORE_RETURN(mbedtls_internal_aes_encrypt(ctx, input, output));
Hanno Beckerbedc2052017-06-26 12:46:56 +0100921}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100922#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100923
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200924/*
925 * AES-ECB block decryption
926 */
927#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100928int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
929 const unsigned char input[16],
930 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200931{
932 int i;
Gilles Peskine5197c662020-08-26 17:03:24 +0200933 uint32_t *RK = ctx->rk;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100934 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200935 uint32_t X[4];
936 uint32_t Y[4];
937 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200938
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100939 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
940 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
941 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
942 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200943
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100944 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
945 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]);
946 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 +0200947 }
948
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100949 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 +0200950
Gilles Peskine5197c662020-08-26 17:03:24 +0200951 t.X[0] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100952 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[1] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[2] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine5197c662020-08-26 17:03:24 +0200969 t.X[3] = *RK++ ^ \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100970 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
971 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
972 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
973 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200974
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100975 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
976 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
977 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
978 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000979
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100980 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500981
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100982 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200983}
984#endif /* !MBEDTLS_AES_DECRYPT_ALT */
985
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100986#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100987void mbedtls_aes_decrypt(mbedtls_aes_context *ctx,
988 const unsigned char input[16],
989 unsigned char output[16])
Hanno Beckerbedc2052017-06-26 12:46:56 +0100990{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100991 MBEDTLS_IGNORE_RETURN(mbedtls_internal_aes_decrypt(ctx, input, output));
Hanno Beckerbedc2052017-06-26 12:46:56 +0100992}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100993#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100994
Gilles Peskineb71d4022023-03-16 17:14:59 +0100995#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine6978e732023-03-16 13:08:42 +0100996/* VIA Padlock and our intrinsics-based implementation of AESNI require
997 * the round keys to be aligned on a 16-byte boundary. We take care of this
998 * before creating them, but the AES context may have moved (this can happen
999 * if the library is called from a language with managed memory), and in later
1000 * calls it might have a different alignment with respect to 16-byte memory.
1001 * So we may need to realign.
1002 * NOTE: In the LTS branch, the context contains a pointer to within itself,
1003 * so if it has been moved, things will probably go pear-shaped. We keep this
1004 * code for compatibility with the development branch, in case of future changes.
1005 */
1006static void aes_maybe_realign(mbedtls_aes_context *ctx)
1007{
Gilles Peskine6978e732023-03-16 13:08:42 +01001008 unsigned current_offset = (unsigned)(ctx->rk - ctx->buf);
Gilles Peskineb71d4022023-03-16 17:14:59 +01001009 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
1010 if (new_offset != current_offset) {
Gilles Peskine6978e732023-03-16 13:08:42 +01001011 memmove(ctx->buf + new_offset, // new address
1012 ctx->buf + current_offset, // current address
1013 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1014 ctx->rk = ctx->buf + new_offset;
1015 }
1016}
1017#endif
1018
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001019/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001020 * AES-ECB block encryption/decryption
1021 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001022int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1023 int mode,
1024 const unsigned char input[16],
1025 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001026{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001027 AES_VALIDATE_RET(ctx != NULL);
1028 AES_VALIDATE_RET(input != NULL);
1029 AES_VALIDATE_RET(output != NULL);
1030 AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT ||
1031 mode == MBEDTLS_AES_DECRYPT);
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001032
Gilles Peskineb71d4022023-03-16 17:14:59 +01001033#if defined(MAY_NEED_TO_ALIGN)
1034 aes_maybe_realign(ctx);
1035#endif
1036
Gilles Peskine5511a342023-03-10 22:29:32 +01001037#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001038 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1039 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1040 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001041#endif
1042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001044 if (aes_padlock_ace) {
Gilles Peskine6978e732023-03-16 13:08:42 +01001045 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001046 }
1047#endif
1048
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001049 if (mode == MBEDTLS_AES_ENCRYPT) {
1050 return mbedtls_internal_aes_encrypt(ctx, input, output);
1051 } else {
1052 return mbedtls_internal_aes_decrypt(ctx, input, output);
1053 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001054}
1055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001057/*
1058 * AES-CBC buffer encryption/decryption
1059 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001060int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1061 int mode,
1062 size_t length,
1063 unsigned char iv[16],
1064 const unsigned char *input,
1065 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001066{
1067 int i;
Gilles Peskine377a3102021-07-07 21:08:28 +02001068 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001069 unsigned char temp[16];
1070
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001071 AES_VALIDATE_RET(ctx != NULL);
1072 AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT ||
1073 mode == MBEDTLS_AES_DECRYPT);
1074 AES_VALIDATE_RET(iv != NULL);
1075 AES_VALIDATE_RET(input != NULL);
1076 AES_VALIDATE_RET(output != NULL);
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001077
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001078 if (length % 16) {
1079 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1080 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001083 if (aes_padlock_ace) {
1084 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1085 return 0;
1086 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001087
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001088 // If padlock data misaligned, we just fall back to
1089 // unaccelerated mode
1090 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001091 }
1092#endif
1093
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001094 if (mode == MBEDTLS_AES_DECRYPT) {
1095 while (length > 0) {
1096 memcpy(temp, input, 16);
1097 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1098 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001099 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001100 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001101
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001102 for (i = 0; i < 16; i++) {
1103 output[i] = (unsigned char) (output[i] ^ iv[i]);
1104 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001105
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001106 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001107
1108 input += 16;
1109 output += 16;
1110 length -= 16;
1111 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001112 } else {
1113 while (length > 0) {
1114 for (i = 0; i < 16; i++) {
1115 output[i] = (unsigned char) (input[i] ^ iv[i]);
1116 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001117
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001118 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1119 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001120 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001121 }
1122 memcpy(iv, output, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001123
1124 input += 16;
1125 output += 16;
1126 length -= 16;
1127 }
1128 }
Gilles Peskine377a3102021-07-07 21:08:28 +02001129 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001130
Gilles Peskine377a3102021-07-07 21:08:28 +02001131exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001132 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001133}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001134#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001135
Aorimn5f778012016-06-09 23:22:58 +02001136#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001137
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001138typedef unsigned char mbedtls_be128[16];
1139
1140/*
1141 * GF(2^128) multiplication function
1142 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001143 * This function multiplies a field element by x in the polynomial field
1144 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case0e7791f2021-12-20 21:14:10 -08001145 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001146 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001147 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001148static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1149 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001150{
1151 uint64_t a, b, ra, rb;
1152
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001153 a = MBEDTLS_GET_UINT64_LE(x, 0);
1154 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001155
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001156 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1157 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001158
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001159 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1160 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001161}
1162
Aorimn5f778012016-06-09 23:22:58 +02001163/*
1164 * AES-XTS buffer encryption/decryption
1165 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001166int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1167 int mode,
1168 size_t length,
1169 const unsigned char data_unit[16],
1170 const unsigned char *input,
1171 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001172{
Janos Follath24eed8d2019-11-22 13:21:35 +00001173 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001174 size_t blocks = length / 16;
1175 size_t leftover = length % 16;
1176 unsigned char tweak[16];
1177 unsigned char prev_tweak[16];
1178 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001179
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001180 AES_VALIDATE_RET(ctx != NULL);
1181 AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT ||
1182 mode == MBEDTLS_AES_DECRYPT);
1183 AES_VALIDATE_RET(data_unit != NULL);
1184 AES_VALIDATE_RET(input != NULL);
1185 AES_VALIDATE_RET(output != NULL);
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001186
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001187 /* Data units must be at least 16 bytes long. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001188 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001189 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001190 }
Aorimn5f778012016-06-09 23:22:58 +02001191
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001192 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001193 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001194 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001195 }
Aorimn5f778012016-06-09 23:22:58 +02001196
Jaeden Amerod82cd862018-04-28 15:02:45 +01001197 /* Compute the tweak. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001198 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1199 data_unit, tweak);
1200 if (ret != 0) {
1201 return ret;
1202 }
Aorimn5f778012016-06-09 23:22:58 +02001203
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001204 while (blocks--) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001205 size_t i;
1206
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001207 if (leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001208 /* We are on the last block in a decrypt operation that has
1209 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove49f99bc2022-12-04 16:44:21 +00001210 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001211 * the leftovers and then update the current tweak for use on this,
1212 * the last full block. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001213 memcpy(prev_tweak, tweak, sizeof(tweak));
1214 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001215 }
1216
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001217 for (i = 0; i < 16; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218 tmp[i] = input[i] ^ tweak[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001219 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001220
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001221 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1222 if (ret != 0) {
1223 return ret;
1224 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001225
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001226 for (i = 0; i < 16; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001227 output[i] = tmp[i] ^ tweak[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001228 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001229
1230 /* Update the tweak for the next block. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001231 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001232
1233 output += 16;
1234 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001235 }
1236
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001237 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001238 /* If we are on the leftover bytes in a decrypt operation, we need to
1239 * use the previous tweak for these bytes (as saved in prev_tweak). */
1240 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001241
Jaeden Amerod82cd862018-04-28 15:02:45 +01001242 /* We are now on the final part of the data unit, which doesn't divide
1243 * evenly by 16. It's time for ciphertext stealing. */
1244 size_t i;
1245 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001246
Jaeden Amerod82cd862018-04-28 15:02:45 +01001247 /* Copy ciphertext bytes from the previous block to our output for each
Shaun Case0e7791f2021-12-20 21:14:10 -08001248 * byte of ciphertext we won't steal. At the same time, copy the
Jaeden Amerod82cd862018-04-28 15:02:45 +01001249 * remainder of the input for this final round (since the loop bounds
1250 * are the same). */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001251 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001252 output[i] = prev_output[i];
1253 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001254 }
Aorimn5f778012016-06-09 23:22:58 +02001255
Jaeden Amerod82cd862018-04-28 15:02:45 +01001256 /* Copy ciphertext bytes from the previous block for input in this
1257 * round. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001258 for (; i < 16; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001259 tmp[i] = prev_output[i] ^ t[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001260 }
Aorimn5f778012016-06-09 23:22:58 +02001261
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001262 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1263 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001264 return ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001265 }
Aorimn5f778012016-06-09 23:22:58 +02001266
Jaeden Amerod82cd862018-04-28 15:02:45 +01001267 /* Write the result back to the previous block, overriding the previous
1268 * output we copied. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001269 for (i = 0; i < 16; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001270 prev_output[i] = tmp[i] ^ t[i];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001271 }
Aorimn5f778012016-06-09 23:22:58 +02001272 }
1273
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001274 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001275}
1276#endif /* MBEDTLS_CIPHER_MODE_XTS */
1277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001279/*
1280 * AES-CFB128 buffer encryption/decryption
1281 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001282int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1283 int mode,
1284 size_t length,
1285 size_t *iv_off,
1286 unsigned char iv[16],
1287 const unsigned char *input,
1288 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001289{
Paul Bakker27fdf462011-06-09 13:55:13 +00001290 int c;
Gilles Peskine377a3102021-07-07 21:08:28 +02001291 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001292 size_t n;
1293
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001294 AES_VALIDATE_RET(ctx != NULL);
1295 AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT ||
1296 mode == MBEDTLS_AES_DECRYPT);
1297 AES_VALIDATE_RET(iv_off != NULL);
1298 AES_VALIDATE_RET(iv != NULL);
1299 AES_VALIDATE_RET(input != NULL);
1300 AES_VALIDATE_RET(output != NULL);
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001301
1302 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001303
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001304 if (n > 15) {
1305 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1306 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001307
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001308 if (mode == MBEDTLS_AES_DECRYPT) {
1309 while (length--) {
1310 if (n == 0) {
1311 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1312 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001313 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001314 }
Gilles Peskine377a3102021-07-07 21:08:28 +02001315 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001316
1317 c = *input++;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001318 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001319 iv[n] = (unsigned char) c;
1320
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001321 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001322 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001323 } else {
1324 while (length--) {
1325 if (n == 0) {
1326 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1327 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001328 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001329 }
Gilles Peskine377a3102021-07-07 21:08:28 +02001330 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001331
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001332 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001333
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001334 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001335 }
1336 }
1337
1338 *iv_off = n;
Gilles Peskine377a3102021-07-07 21:08:28 +02001339 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001340
Gilles Peskine377a3102021-07-07 21:08:28 +02001341exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001342 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001343}
Paul Bakker556efba2014-01-24 15:38:12 +01001344
1345/*
1346 * AES-CFB8 buffer encryption/decryption
1347 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001348int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1349 int mode,
1350 size_t length,
1351 unsigned char iv[16],
1352 const unsigned char *input,
1353 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001354{
Gilles Peskine377a3102021-07-07 21:08:28 +02001355 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001356 unsigned char c;
1357 unsigned char ov[17];
1358
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001359 AES_VALIDATE_RET(ctx != NULL);
1360 AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT ||
1361 mode == MBEDTLS_AES_DECRYPT);
1362 AES_VALIDATE_RET(iv != NULL);
1363 AES_VALIDATE_RET(input != NULL);
1364 AES_VALIDATE_RET(output != NULL);
1365 while (length--) {
1366 memcpy(ov, iv, 16);
1367 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1368 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001369 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001370 }
Paul Bakker556efba2014-01-24 15:38:12 +01001371
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001372 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001373 ov[16] = *input;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001374 }
Paul Bakker556efba2014-01-24 15:38:12 +01001375
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001376 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001377
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001378 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001379 ov[16] = c;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001380 }
Paul Bakker556efba2014-01-24 15:38:12 +01001381
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001382 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001383 }
Gilles Peskine377a3102021-07-07 21:08:28 +02001384 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001385
Gilles Peskine377a3102021-07-07 21:08:28 +02001386exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001387 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001388}
Simon Butcher76a5b222018-04-22 22:57:27 +01001389#endif /* MBEDTLS_CIPHER_MODE_CFB */
1390
1391#if defined(MBEDTLS_CIPHER_MODE_OFB)
1392/*
1393 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1394 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001395int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1396 size_t length,
1397 size_t *iv_off,
1398 unsigned char iv[16],
1399 const unsigned char *input,
1400 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001401{
Simon Butcherad4e4932018-04-29 00:43:47 +01001402 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001403 size_t n;
1404
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001405 AES_VALIDATE_RET(ctx != NULL);
1406 AES_VALIDATE_RET(iv_off != NULL);
1407 AES_VALIDATE_RET(iv != NULL);
1408 AES_VALIDATE_RET(input != NULL);
1409 AES_VALIDATE_RET(output != NULL);
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001410
1411 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001412
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001413 if (n > 15) {
1414 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1415 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001416
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001417 while (length--) {
1418 if (n == 0) {
1419 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1420 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001421 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001422 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001423 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001424 *output++ = *input++ ^ iv[n];
1425
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001426 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001427 }
1428
1429 *iv_off = n;
1430
Simon Butcherad4e4932018-04-29 00:43:47 +01001431exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001432 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001433}
1434#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001435
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001436#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001437/*
1438 * AES-CTR buffer encryption/decryption
1439 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001440int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1441 size_t length,
1442 size_t *nc_off,
1443 unsigned char nonce_counter[16],
1444 unsigned char stream_block[16],
1445 const unsigned char *input,
1446 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001447{
Paul Bakker369e14b2012-04-18 14:16:09 +00001448 int c, i;
Gilles Peskine377a3102021-07-07 21:08:28 +02001449 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001450 size_t n;
1451
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001452 AES_VALIDATE_RET(ctx != NULL);
1453 AES_VALIDATE_RET(nc_off != NULL);
1454 AES_VALIDATE_RET(nonce_counter != NULL);
1455 AES_VALIDATE_RET(stream_block != NULL);
1456 AES_VALIDATE_RET(input != NULL);
1457 AES_VALIDATE_RET(output != NULL);
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001458
1459 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001460
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001461 if (n > 0x0F) {
1462 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1463 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001464
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001465 while (length--) {
1466 if (n == 0) {
1467 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1468 if (ret != 0) {
Gilles Peskine377a3102021-07-07 21:08:28 +02001469 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001470 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001471
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001472 for (i = 16; i > 0; i--) {
1473 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001474 break;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001475 }
1476 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001477 }
1478 c = *input++;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001479 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001480
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001481 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001482 }
1483
1484 *nc_off = n;
Gilles Peskine377a3102021-07-07 21:08:28 +02001485 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001486
Gilles Peskine377a3102021-07-07 21:08:28 +02001487exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001488 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001489}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001490#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001493
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001495/*
1496 * AES test vectors from:
1497 *
1498 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1499 */
1500static const unsigned char aes_test_ecb_dec[3][16] =
1501{
1502 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1503 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1504 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1505 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1506 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1507 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1508};
1509
1510static const unsigned char aes_test_ecb_enc[3][16] =
1511{
1512 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1513 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1514 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1515 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1516 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1517 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1518};
1519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001521static const unsigned char aes_test_cbc_dec[3][16] =
1522{
1523 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1524 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1525 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1526 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1527 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1528 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1529};
1530
1531static const unsigned char aes_test_cbc_enc[3][16] =
1532{
1533 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1534 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1535 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1536 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1537 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1538 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1539};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001540#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001542#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001543/*
1544 * AES-CFB128 test vectors from:
1545 *
1546 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1547 */
1548static const unsigned char aes_test_cfb128_key[3][32] =
1549{
1550 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1551 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1552 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1553 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1554 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1555 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1556 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1557 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1558 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1559};
1560
1561static const unsigned char aes_test_cfb128_iv[16] =
1562{
1563 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1564 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1565};
1566
1567static const unsigned char aes_test_cfb128_pt[64] =
1568{
1569 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1570 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1571 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1572 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1573 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1574 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1575 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1576 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1577};
1578
1579static const unsigned char aes_test_cfb128_ct[3][64] =
1580{
1581 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1582 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1583 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1584 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1585 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1586 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1587 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1588 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1589 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1590 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1591 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1592 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1593 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1594 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1595 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1596 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1597 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1598 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1599 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1600 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1601 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1602 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1603 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1604 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1605};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001606#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001607
Simon Butcherad4e4932018-04-29 00:43:47 +01001608#if defined(MBEDTLS_CIPHER_MODE_OFB)
1609/*
1610 * AES-OFB test vectors from:
1611 *
Simon Butcher5db13622018-06-04 22:11:25 +01001612 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001613 */
1614static const unsigned char aes_test_ofb_key[3][32] =
1615{
1616 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1617 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1618 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1619 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1620 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1621 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1622 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1623 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1624 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1625};
1626
1627static const unsigned char aes_test_ofb_iv[16] =
1628{
1629 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1630 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1631};
1632
1633static const unsigned char aes_test_ofb_pt[64] =
1634{
1635 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1636 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1637 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1638 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1639 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1640 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1641 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1642 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1643};
1644
1645static const unsigned char aes_test_ofb_ct[3][64] =
1646{
1647 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1648 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1649 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1650 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1651 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1652 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1653 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1654 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1655 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1656 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1657 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1658 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1659 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1660 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1661 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1662 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1663 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1664 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1665 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1666 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1667 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1668 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1669 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1670 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1671};
1672#endif /* MBEDTLS_CIPHER_MODE_OFB */
1673
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001675/*
1676 * AES-CTR test vectors from:
1677 *
1678 * http://www.faqs.org/rfcs/rfc3686.html
1679 */
1680
1681static const unsigned char aes_test_ctr_key[3][16] =
1682{
1683 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1684 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1685 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1686 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1687 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1688 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1689};
1690
1691static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1692{
1693 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1695 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1696 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1697 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1698 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1699};
1700
1701static const unsigned char aes_test_ctr_pt[3][48] =
1702{
1703 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1704 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1705
1706 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1707 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1708 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1709 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1710
1711 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1712 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1713 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1714 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1715 0x20, 0x21, 0x22, 0x23 }
1716};
1717
1718static const unsigned char aes_test_ctr_ct[3][48] =
1719{
1720 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1721 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1722 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1723 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1724 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1725 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1726 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1727 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1728 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1729 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1730 0x25, 0xB2, 0x07, 0x2F }
1731};
1732
1733static const int aes_test_ctr_len[3] =
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001734{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001735#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001736
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001737#if defined(MBEDTLS_CIPHER_MODE_XTS)
1738/*
1739 * AES-XTS test vectors from:
1740 *
1741 * IEEE P1619/D16 Annex B
1742 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1743 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1744 */
1745static const unsigned char aes_test_xts_key[][32] =
1746{
1747 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1751 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1752 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1753 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1754 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1755 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1756 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1757 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1758 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1759};
1760
1761static const unsigned char aes_test_xts_pt32[][32] =
1762{
1763 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1765 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1767 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1768 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1769 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1770 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1771 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1772 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1773 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1774 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1775};
1776
1777static const unsigned char aes_test_xts_ct32[][32] =
1778{
1779 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1780 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1781 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1782 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1783 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1784 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1785 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1786 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1787 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1788 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1789 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1790 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1791};
1792
1793static const unsigned char aes_test_xts_data_unit[][16] =
1794{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001795 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1797 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1799 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001801};
1802
1803#endif /* MBEDTLS_CIPHER_MODE_XTS */
1804
Paul Bakker5121ce52009-01-03 21:22:43 +00001805/*
1806 * Checkup routine
1807 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001808int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001809{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001810 int ret = 0, i, j, u, mode;
1811 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001812 unsigned char key[32];
1813 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001814 const unsigned char *aes_tests;
Andrzej Kurek8ffd8a62022-09-27 07:54:16 -04001815#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1816 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001817 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001818#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001819#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001820 unsigned char prv[16];
1821#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001822#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1823 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001824 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001825#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001826#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001827 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001828#endif
1829#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001830 unsigned char nonce_counter[16];
1831 unsigned char stream_block[16];
1832#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001833 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001834
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001835 memset(key, 0, 32);
1836 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001837
Gilles Peskine2c8ad942023-03-10 22:35:24 +01001838 if (verbose != 0) {
1839#if defined(MBEDTLS_AES_ALT)
1840 mbedtls_printf(" AES note: alternative implementation.\n");
1841#else /* MBEDTLS_AES_ALT */
1842#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1843 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1844 mbedtls_printf(" AES note: using VIA Padlock.\n");
1845 } else
1846#endif
1847#if defined(MBEDTLS_AESNI_HAVE_CODE)
1848 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
Tom Cosgrove20458c02023-03-18 14:48:49 +00001849 mbedtls_printf(" AES note: using AESNI via ");
1850#if MBEDTLS_AESNI_HAVE_CODE == 1
1851 mbedtls_printf("assembly");
1852#elif MBEDTLS_AESNI_HAVE_CODE == 2
1853 mbedtls_printf("intrinsics");
1854#else
1855 mbedtls_printf("(unknown)");
1856#endif
1857 mbedtls_printf(".\n");
Gilles Peskine2c8ad942023-03-10 22:35:24 +01001858 } else
1859#endif
Gilles Peskine2c8ad942023-03-10 22:35:24 +01001860 mbedtls_printf(" AES note: built-in implementation.\n");
1861#endif /* MBEDTLS_AES_ALT */
1862 }
1863
Paul Bakker5121ce52009-01-03 21:22:43 +00001864 /*
1865 * ECB mode
1866 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001867 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001868 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001869 keybits = 128 + u * 64;
1870 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001871
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001872 if (verbose != 0) {
1873 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1874 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001875 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001876
1877 memset(buf, 0, 16);
1878
1879 if (mode == MBEDTLS_AES_DECRYPT) {
1880 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1881 aes_tests = aes_test_ecb_dec[u];
1882 } else {
1883 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001884 aes_tests = aes_test_ecb_enc[u];
1885 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001886
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001887 /*
1888 * AES-192 is an optional feature that may be unavailable when
1889 * there is an alternative underlying implementation i.e. when
1890 * MBEDTLS_AES_ALT is defined.
1891 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001892 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1893 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001894 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001895 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001896 goto exit;
1897 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001898
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001899 for (j = 0; j < 10000; j++) {
1900 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1901 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001902 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001903 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001904 }
1905
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001906 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001907 ret = 1;
1908 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 }
1910
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001911 if (verbose != 0) {
1912 mbedtls_printf("passed\n");
1913 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001914 }
1915
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001916 if (verbose != 0) {
1917 mbedtls_printf("\n");
1918 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001919
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001920#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001921 /*
1922 * CBC mode
1923 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001924 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001925 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001926 keybits = 128 + u * 64;
1927 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001928
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001929 if (verbose != 0) {
1930 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1931 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001933
1934 memset(iv, 0, 16);
1935 memset(prv, 0, 16);
1936 memset(buf, 0, 16);
1937
1938 if (mode == MBEDTLS_AES_DECRYPT) {
1939 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1940 aes_tests = aes_test_cbc_dec[u];
1941 } else {
1942 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001943 aes_tests = aes_test_cbc_enc[u];
1944 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001945
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001946 /*
1947 * AES-192 is an optional feature that may be unavailable when
1948 * there is an alternative underlying implementation i.e. when
1949 * MBEDTLS_AES_ALT is defined.
1950 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001951 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1952 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001953 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001954 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001955 goto exit;
1956 }
1957
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001958 for (j = 0; j < 10000; j++) {
1959 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001960 unsigned char tmp[16];
1961
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001962 memcpy(tmp, prv, 16);
1963 memcpy(prv, buf, 16);
1964 memcpy(buf, tmp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001965 }
1966
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001967 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1968 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001969 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001970 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001971
1972 }
1973
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001974 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001975 ret = 1;
1976 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001977 }
1978
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001979 if (verbose != 0) {
1980 mbedtls_printf("passed\n");
1981 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001982 }
1983
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001984 if (verbose != 0) {
1985 mbedtls_printf("\n");
1986 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001987#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001989#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001990 /*
1991 * CFB128 mode
1992 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001993 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001994 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001995 keybits = 128 + u * 64;
1996 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001997
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001998 if (verbose != 0) {
1999 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
2000 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2001 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002002
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002003 memcpy(iv, aes_test_cfb128_iv, 16);
2004 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002005
2006 offset = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002007 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002008 /*
2009 * AES-192 is an optional feature that may be unavailable when
2010 * there is an alternative underlying implementation i.e. when
2011 * MBEDTLS_AES_ALT is defined.
2012 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002013 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2014 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002015 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002016 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002017 goto exit;
2018 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002019
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002020 if (mode == MBEDTLS_AES_DECRYPT) {
2021 memcpy(buf, aes_test_cfb128_ct[u], 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002022 aes_tests = aes_test_cfb128_pt;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002023 } else {
2024 memcpy(buf, aes_test_cfb128_pt, 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002025 aes_tests = aes_test_cfb128_ct[u];
2026 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002027
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002028 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2029 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002030 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002031 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002032
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002033 if (memcmp(buf, aes_tests, 64) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002034 ret = 1;
2035 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002036 }
2037
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002038 if (verbose != 0) {
2039 mbedtls_printf("passed\n");
2040 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002041 }
2042
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002043 if (verbose != 0) {
2044 mbedtls_printf("\n");
2045 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002046#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002047
Simon Butcherad4e4932018-04-29 00:43:47 +01002048#if defined(MBEDTLS_CIPHER_MODE_OFB)
2049 /*
2050 * OFB mode
2051 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002052 for (i = 0; i < 6; i++) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002053 u = i >> 1;
2054 keybits = 128 + u * 64;
2055 mode = i & 1;
2056
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002057 if (verbose != 0) {
2058 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2059 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2060 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002061
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002062 memcpy(iv, aes_test_ofb_iv, 16);
2063 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002064
2065 offset = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002066 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Simon Butcherad4e4932018-04-29 00:43:47 +01002067 /*
2068 * AES-192 is an optional feature that may be unavailable when
2069 * there is an alternative underlying implementation i.e. when
2070 * MBEDTLS_AES_ALT is defined.
2071 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002072 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2073 mbedtls_printf("skipped\n");
Simon Butcherad4e4932018-04-29 00:43:47 +01002074 continue;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002075 } else if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002076 goto exit;
2077 }
2078
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002079 if (mode == MBEDTLS_AES_DECRYPT) {
2080 memcpy(buf, aes_test_ofb_ct[u], 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002081 aes_tests = aes_test_ofb_pt;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002082 } else {
2083 memcpy(buf, aes_test_ofb_pt, 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002084 aes_tests = aes_test_ofb_ct[u];
2085 }
2086
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002087 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2088 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002089 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002090 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002091
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002092 if (memcmp(buf, aes_tests, 64) != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002093 ret = 1;
2094 goto exit;
2095 }
2096
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002097 if (verbose != 0) {
2098 mbedtls_printf("passed\n");
2099 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002100 }
2101
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002102 if (verbose != 0) {
2103 mbedtls_printf("\n");
2104 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002105#endif /* MBEDTLS_CIPHER_MODE_OFB */
2106
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002107#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002108 /*
2109 * CTR mode
2110 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002111 for (i = 0; i < 6; i++) {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002112 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002113 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002114
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002115 if (verbose != 0) {
2116 mbedtls_printf(" AES-CTR-128 (%s): ",
2117 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2118 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002119
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002120 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2121 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002122
2123 offset = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002124 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002125 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002126 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002127
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002128 len = aes_test_ctr_len[u];
2129
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002130 if (mode == MBEDTLS_AES_DECRYPT) {
2131 memcpy(buf, aes_test_ctr_ct[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002132 aes_tests = aes_test_ctr_pt[u];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002133 } else {
2134 memcpy(buf, aes_test_ctr_pt[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002135 aes_tests = aes_test_ctr_ct[u];
2136 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002137
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002138 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2139 stream_block, buf, buf);
2140 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002141 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002142 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002143
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002144 if (memcmp(buf, aes_tests, len) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002145 ret = 1;
2146 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002147 }
2148
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002149 if (verbose != 0) {
2150 mbedtls_printf("passed\n");
2151 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002152 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002153
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002154 if (verbose != 0) {
2155 mbedtls_printf("\n");
2156 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002157#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002158
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002159#if defined(MBEDTLS_CIPHER_MODE_XTS)
2160 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002161 static const int num_tests =
2162 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2163 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002164
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002165 /*
2166 * XTS mode
2167 */
2168 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002169
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002170 for (i = 0; i < num_tests << 1; i++) {
2171 const unsigned char *data_unit;
2172 u = i >> 1;
2173 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002174
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002175 if (verbose != 0) {
2176 mbedtls_printf(" AES-XTS-128 (%s): ",
2177 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2178 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002179
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002180 memset(key, 0, sizeof(key));
2181 memcpy(key, aes_test_xts_key[u], 32);
2182 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002183
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002184 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002185
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002186 if (mode == MBEDTLS_AES_DECRYPT) {
2187 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2188 if (ret != 0) {
2189 goto exit;
2190 }
2191 memcpy(buf, aes_test_xts_ct32[u], len);
2192 aes_tests = aes_test_xts_pt32[u];
2193 } else {
2194 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2195 if (ret != 0) {
2196 goto exit;
2197 }
2198 memcpy(buf, aes_test_xts_pt32[u], len);
2199 aes_tests = aes_test_xts_ct32[u];
2200 }
2201
2202
2203 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2204 buf, buf);
2205 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002206 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002207 }
2208
2209 if (memcmp(buf, aes_tests, len) != 0) {
2210 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002211 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002212 }
2213
2214 if (verbose != 0) {
2215 mbedtls_printf("passed\n");
2216 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002217 }
2218
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002219 if (verbose != 0) {
2220 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002221 }
2222
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002223 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002224 }
2225#endif /* MBEDTLS_CIPHER_MODE_XTS */
2226
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002227 ret = 0;
2228
2229exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002230 if (ret != 0 && verbose != 0) {
2231 mbedtls_printf("failed\n");
2232 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002233
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002234 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002235
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01002236 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002237}
2238
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002239#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241#endif /* MBEDTLS_AES_C */