blob: 564f62083940d028d50b1086bc38428b59e6eda4 [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)
Chris Jones16dbaeb2021-03-09 17:47:55 +000037#include "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)
Chris Jones187782f2021-03-09 17:28:35 +000040#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080042#if defined(MBEDTLS_AESCE_C)
43#include "aesce.h"
44#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020049
Gilles Peskine0f454e42023-03-16 14:58:46 +010050#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +000051static int aes_padlock_ace = -1;
52#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * Forward S-box
57 */
58static const unsigned char FSb[256] =
59{
60 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
61 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
62 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
63 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
64 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
65 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
66 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
67 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
68 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
69 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
70 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
71 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
72 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
73 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
74 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
75 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
76 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
77 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
78 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
79 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
80 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
81 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
82 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
83 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
84 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
85 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
86 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
87 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
88 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
89 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
90 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
91 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
92};
93
94/*
95 * Forward tables
96 */
97#define FT \
98\
Gilles Peskine449bd832023-01-11 14:50:10 +010099 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
100 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
101 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
102 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
103 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
104 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
105 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
106 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
107 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
108 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
109 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
110 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
111 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
112 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
113 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
114 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
115 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
116 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
117 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
118 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
119 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
120 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
121 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
122 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
123 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
124 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
125 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
126 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
127 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
128 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
129 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
130 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
131 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
132 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
133 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
134 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
135 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
136 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
137 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
138 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
139 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
140 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
141 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
142 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
143 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
144 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
145 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
146 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
147 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
148 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
149 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
150 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
151 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
152 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
153 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
154 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
155 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
156 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
157 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
158 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
159 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
160 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
161 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
162 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 +0000163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000165static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000166#undef V
167
Hanno Beckerad049a92017-06-19 16:31:54 +0100168#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000171static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000172#undef V
173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000175static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000176#undef V
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000179static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000180#undef V
181
Hanno Becker177d3cf2017-06-07 15:52:48 +0100182#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200183
Paul Bakker5121ce52009-01-03 21:22:43 +0000184#undef FT
185
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100186#if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT))
Paul Bakker5121ce52009-01-03 21:22:43 +0000187/*
188 * Reverse S-box
189 */
190static const unsigned char RSb[256] =
191{
192 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
193 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
194 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
195 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
196 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
197 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
198 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
199 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
200 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
201 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
202 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
203 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
204 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
205 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
206 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
207 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
208 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
209 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
210 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
211 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
212 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
213 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
214 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
215 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
216 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
217 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
218 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
219 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
220 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
221 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
222 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
223 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
224};
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100225#endif /* !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT)) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000226
227/*
228 * Reverse tables
229 */
230#define RT \
231\
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
233 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
234 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
235 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
236 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
237 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
238 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
239 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
240 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
241 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
242 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
243 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
244 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
245 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
246 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
247 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
248 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
249 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
250 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
251 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
252 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
253 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
254 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
255 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
256 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
257 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
258 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
259 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
260 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
261 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
262 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
263 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
264 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
265 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
266 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
267 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
268 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
269 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
270 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
271 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
272 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
273 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
274 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
275 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
276 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
277 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
278 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
279 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
280 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
281 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
282 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
283 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
284 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
285 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
286 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
287 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
288 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
289 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
290 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
291 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
292 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
293 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
294 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
295 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 +0000296
Gilles Peskine449bd832023-01-11 14:50:10 +0100297#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000298static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000299#undef V
300
Hanno Beckerad049a92017-06-19 16:31:54 +0100301#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200302
Gilles Peskine449bd832023-01-11 14:50:10 +0100303#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000304static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000305#undef V
306
Gilles Peskine449bd832023-01-11 14:50:10 +0100307#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000308static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000309#undef V
310
Gilles Peskine449bd832023-01-11 14:50:10 +0100311#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000312static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000313#undef V
314
Hanno Becker177d3cf2017-06-07 15:52:48 +0100315#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200316
Paul Bakker5121ce52009-01-03 21:22:43 +0000317#undef RT
318
Dave Rodgman34152a42023-06-27 18:31:24 +0100319#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000320/*
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};
Dave Rodgman34152a42023-06-27 18:31:24 +0100329#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000332
333/*
334 * Forward S-box & tables
335 */
336static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200337static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100338#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200339static uint32_t FT1[256];
340static uint32_t FT2[256];
341static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100342#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000343
344/*
345 * Reverse S-box & tables
346 */
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100347#if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT))
Paul Bakker5121ce52009-01-03 21:22:43 +0000348static unsigned char RSb[256];
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100349#endif
Paul Bakker5c2364c2012-10-01 14:41:15 +0000350static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100351#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000352static uint32_t RT1[256];
353static uint32_t RT2[256];
354static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100355#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000356
Dave Rodgman8c753f92023-06-27 18:16:13 +0100357#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000358/*
359 * Round constants
360 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363/*
364 * Tables generation code
365 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100366#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
367#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
368#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000369
370static int aes_init_done = 0;
371
Gilles Peskine449bd832023-01-11 14:50:10 +0100372static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000373{
374 int i, x, y, z;
375 int pow[256];
376 int log[256];
377
378 /*
379 * compute pow and log tables over GF(2^8)
380 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100381 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000382 pow[i] = x;
383 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000385 }
386
387 /*
388 * calculate the round constants
389 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000391 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000393 }
394
395 /*
396 * generate the forward and reverse S-boxes
397 */
398 FSb[0x00] = 0x63;
399 RSb[0x63] = 0x00;
400
Gilles Peskine449bd832023-01-11 14:50:10 +0100401 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 x = pow[255 - log[i]];
403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
405 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
406 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
407 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000408 x ^= y ^ 0x63;
409
410 FSb[i] = (unsigned char) x;
411 RSb[x] = (unsigned char) i;
412 }
413
414 /*
415 * generate the forward and reverse tables
416 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100417 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000418 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 y = MBEDTLS_BYTE_0(XTIME(x));
420 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000421
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 FT0[i] = ((uint32_t) y) ^
423 ((uint32_t) x << 8) ^
424 ((uint32_t) x << 16) ^
425 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000426
Hanno Beckerad049a92017-06-19 16:31:54 +0100427#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 FT1[i] = ROTL8(FT0[i]);
429 FT2[i] = ROTL8(FT1[i]);
430 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100431#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
433 x = RSb[i];
434
Gilles Peskine449bd832023-01-11 14:50:10 +0100435 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
436 ((uint32_t) MUL(0x09, x) << 8) ^
437 ((uint32_t) MUL(0x0D, x) << 16) ^
438 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000439
Hanno Beckerad049a92017-06-19 16:31:54 +0100440#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100441 RT1[i] = ROTL8(RT0[i]);
442 RT2[i] = ROTL8(RT1[i]);
443 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100444#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 }
446}
447
Dave Rodgman8c753f92023-06-27 18:16:13 +0100448#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
449
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200450#undef ROTL8
451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
Hanno Beckerad049a92017-06-19 16:31:54 +0100454#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200455
Gilles Peskine449bd832023-01-11 14:50:10 +0100456#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
457#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
458#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200459
460#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100461#define AES_RT1(idx) ROTL8(RT0[idx])
462#define AES_RT2(idx) ROTL16(RT0[idx])
463#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200464
465#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100466#define AES_FT1(idx) ROTL8(FT0[idx])
467#define AES_FT2(idx) ROTL16(FT0[idx])
468#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200469
Hanno Becker177d3cf2017-06-07 15:52:48 +0100470#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200471
472#define AES_RT0(idx) RT0[idx]
473#define AES_RT1(idx) RT1[idx]
474#define AES_RT2(idx) RT2[idx]
475#define AES_RT3(idx) RT3[idx]
476
477#define AES_FT0(idx) FT0[idx]
478#define AES_FT1(idx) FT1[idx]
479#define AES_FT2(idx) FT2[idx]
480#define AES_FT3(idx) FT3[idx]
481
Hanno Becker177d3cf2017-06-07 15:52:48 +0100482#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200483
Gilles Peskine449bd832023-01-11 14:50:10 +0100484void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485{
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487}
488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490{
Gilles Peskine449bd832023-01-11 14:50:10 +0100491 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200492 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200494
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200496}
497
Jaeden Amero9366feb2018-05-29 18:55:17 +0100498#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100499void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100500{
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 mbedtls_aes_init(&ctx->crypt);
502 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100503}
504
Gilles Peskine449bd832023-01-11 14:50:10 +0100505void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100506{
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100508 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 }
Simon Butcher5201e412018-12-06 17:40:14 +0000510
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 mbedtls_aes_free(&ctx->crypt);
512 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100513}
514#endif /* MBEDTLS_CIPHER_MODE_XTS */
515
Gilles Peskine0de8f852023-03-16 17:14:59 +0100516/* Some implementations need the round keys to be aligned.
517 * Return an offset to be added to buf, such that (buf + offset) is
518 * correctly aligned.
519 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
520 * i.e. an offset of 1 means 4 bytes and so on.
521 */
522#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100523 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100524#define MAY_NEED_TO_ALIGN
525#endif
Dave Rodgman28a539a2023-06-27 18:22:34 +0100526
527#if defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100528static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
529{
530#if defined(MAY_NEED_TO_ALIGN)
531 int align_16_bytes = 0;
532
533#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
534 if (aes_padlock_ace == -1) {
535 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
536 }
537 if (aes_padlock_ace) {
538 align_16_bytes = 1;
539 }
540#endif
541
Gilles Peskine9c682e72023-03-16 17:21:33 +0100542#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100543 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
544 align_16_bytes = 1;
545 }
546#endif
547
548 if (align_16_bytes) {
549 /* These implementations needs 16-byte alignment
550 * for the round key array. */
551 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
552 if (delta == 0) {
553 return 0;
554 } else {
555 return 4 - delta; // 16 bytes = 4 uint32_t
556 }
557 }
558#else /* MAY_NEED_TO_ALIGN */
559 (void) buf;
560#endif /* MAY_NEED_TO_ALIGN */
561
562 return 0;
563}
Dave Rodgman28a539a2023-06-27 18:22:34 +0100564#endif /* defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
Gilles Peskine0de8f852023-03-16 17:14:59 +0100565
Paul Bakker5121ce52009-01-03 21:22:43 +0000566/*
567 * AES key schedule (encryption)
568 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200569#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100570int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
571 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000572{
Paul Bakker23986e52011-04-24 08:57:21 +0000573 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000574 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000575
Gilles Peskine449bd832023-01-11 14:50:10 +0100576 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000577 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800578#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000579 case 192: ctx->nr = 12; break;
580 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800581#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000583 }
584
Simon Butcher5201e412018-12-06 17:40:14 +0000585#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100586 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000587 aes_gen_tables();
588 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000589 }
590#endif
591
Gilles Peskine0de8f852023-03-16 17:14:59 +0100592 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100593 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000594
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100595#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
597 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
598 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100599#endif
600
Jerry Yu3f2fb712023-01-10 17:05:42 +0800601#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
602 if (mbedtls_aesce_has_support()) {
603 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
604 }
605#endif
606
Gilles Peskine449bd832023-01-11 14:50:10 +0100607 for (i = 0; i < (keybits >> 5); i++) {
608 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000609 }
610
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000612 case 10:
613
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000615 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
617 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
618 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
619 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000620
621 RK[5] = RK[1] ^ RK[4];
622 RK[6] = RK[2] ^ RK[5];
623 RK[7] = RK[3] ^ RK[6];
624 }
625 break;
626
Arto Kinnunen732ca322023-04-14 14:26:10 +0800627#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000628 case 12:
629
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000631 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
633 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
634 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
635 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000636
637 RK[7] = RK[1] ^ RK[6];
638 RK[8] = RK[2] ^ RK[7];
639 RK[9] = RK[3] ^ RK[8];
640 RK[10] = RK[4] ^ RK[9];
641 RK[11] = RK[5] ^ RK[10];
642 }
643 break;
644
645 case 14:
646
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000648 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
651 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
652 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000653
654 RK[9] = RK[1] ^ RK[8];
655 RK[10] = RK[2] ^ RK[9];
656 RK[11] = RK[3] ^ RK[10];
657
658 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
660 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
661 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
662 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
664 RK[13] = RK[5] ^ RK[12];
665 RK[14] = RK[6] ^ RK[13];
666 RK[15] = RK[7] ^ RK[14];
667 }
668 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800669#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000670 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000671
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000673}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200674#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000675
676/*
677 * AES key schedule (decryption)
678 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200679#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100680int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
681 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000682{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200683 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000685 uint32_t *RK;
686 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200687
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000689
Gilles Peskine0de8f852023-03-16 17:14:59 +0100690 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100691 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000692
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200693 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100694 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200695 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000697
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200698 ctx->nr = cty.nr;
699
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100700#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100701 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
702 mbedtls_aesni_inverse_key((unsigned char *) RK,
703 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200704 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100705 }
706#endif
707
Jerry Yue096da12023-01-10 17:07:01 +0800708#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
709 if (mbedtls_aesce_has_support()) {
710 mbedtls_aesce_inverse_key(
711 (unsigned char *) RK,
712 (const unsigned char *) (cty.buf + cty.rk_offset),
713 ctx->nr);
714 goto exit;
715 }
716#endif
717
Werner Lewisdd76ef32022-05-30 12:00:21 +0100718 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000719
720 *RK++ = *SK++;
721 *RK++ = *SK++;
722 *RK++ = *SK++;
723 *RK++ = *SK++;
724
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
726 for (j = 0; j < 4; j++, SK++) {
727 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
728 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
729 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
730 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000731 }
732 }
733
734 *RK++ = *SK++;
735 *RK++ = *SK++;
736 *RK++ = *SK++;
737 *RK++ = *SK++;
738
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200739exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000741
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000743}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100744#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100745
746#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100747static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
748 unsigned int keybits,
749 const unsigned char **key1,
750 unsigned int *key1bits,
751 const unsigned char **key2,
752 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100753{
754 const unsigned int half_keybits = keybits / 2;
755 const unsigned int half_keybytes = half_keybits / 8;
756
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100758 case 256: break;
759 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100760 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100761 }
762
763 *key1bits = half_keybits;
764 *key2bits = half_keybits;
765 *key1 = &key[0];
766 *key2 = &key[half_keybytes];
767
768 return 0;
769}
770
Gilles Peskine449bd832023-01-11 14:50:10 +0100771int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
772 const unsigned char *key,
773 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100774{
Janos Follath24eed8d2019-11-22 13:21:35 +0000775 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100776 const unsigned char *key1, *key2;
777 unsigned int key1bits, key2bits;
778
Gilles Peskine449bd832023-01-11 14:50:10 +0100779 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
780 &key2, &key2bits);
781 if (ret != 0) {
782 return ret;
783 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100784
785 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
787 if (ret != 0) {
788 return ret;
789 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100790
791 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100792 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100793}
794
Gilles Peskine449bd832023-01-11 14:50:10 +0100795int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
796 const unsigned char *key,
797 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100798{
Janos Follath24eed8d2019-11-22 13:21:35 +0000799 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100800 const unsigned char *key1, *key2;
801 unsigned int key1bits, key2bits;
802
Gilles Peskine449bd832023-01-11 14:50:10 +0100803 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
804 &key2, &key2bits);
805 if (ret != 0) {
806 return ret;
807 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100808
809 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100810 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
811 if (ret != 0) {
812 return ret;
813 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100814
815 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100816 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100817}
818#endif /* MBEDTLS_CIPHER_MODE_XTS */
819
Gilles Peskine449bd832023-01-11 14:50:10 +0100820#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100821 do \
822 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100823 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
824 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
825 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
826 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100827 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100828 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
829 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
830 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
831 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100832 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100833 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
834 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
835 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
836 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100837 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100838 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
839 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
840 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
841 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
842 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000843
Gilles Peskine449bd832023-01-11 14:50:10 +0100844#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100845 do \
846 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100847 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
848 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
849 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
850 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100851 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100852 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
853 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
854 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
855 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100856 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100857 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
858 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
859 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
860 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100861 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100862 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
863 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
864 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
865 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
866 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000867
868/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200869 * AES-ECB block encryption
870 */
871#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100872int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
873 const unsigned char input[16],
874 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200875{
876 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100877 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100878 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200879 uint32_t X[4];
880 uint32_t Y[4];
881 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200882
Gilles Peskine449bd832023-01-11 14:50:10 +0100883 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
884 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
885 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
886 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200887
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
889 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]);
890 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 +0200891 }
892
Gilles Peskine449bd832023-01-11 14:50:10 +0100893 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 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine5197c662020-08-26 17:03:24 +0200907 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100908 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
909 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
910 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
911 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200912
Gilles Peskine5197c662020-08-26 17:03:24 +0200913 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
915 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
916 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
917 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200918
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
920 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
921 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
922 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500925
Gilles Peskine449bd832023-01-11 14:50:10 +0100926 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200927}
928#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
929
930/*
931 * AES-ECB block decryption
932 */
933#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100934int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
935 const unsigned char input[16],
936 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200937{
938 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100939 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200941 uint32_t X[4];
942 uint32_t Y[4];
943 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200944
Gilles Peskine449bd832023-01-11 14:50:10 +0100945 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
946 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
947 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
948 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200949
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
951 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]);
952 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 +0200953 }
954
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 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 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine5197c662020-08-26 17:03:24 +0200969 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
971 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
972 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
973 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200974
Gilles Peskine5197c662020-08-26 17:03:24 +0200975 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
977 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
978 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
979 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200980
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
982 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
983 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
984 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000985
Gilles Peskine449bd832023-01-11 14:50:10 +0100986 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500987
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200989}
990#endif /* !MBEDTLS_AES_DECRYPT_ALT */
991
Gilles Peskine0de8f852023-03-16 17:14:59 +0100992#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100993/* VIA Padlock and our intrinsics-based implementation of AESNI require
994 * the round keys to be aligned on a 16-byte boundary. We take care of this
995 * before creating them, but the AES context may have moved (this can happen
996 * if the library is called from a language with managed memory), and in later
997 * calls it might have a different alignment with respect to 16-byte memory.
998 * So we may need to realign.
999 */
1000static void aes_maybe_realign(mbedtls_aes_context *ctx)
1001{
Gilles Peskine0de8f852023-03-16 17:14:59 +01001002 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
1003 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001004 memmove(ctx->buf + new_offset, // new address
1005 ctx->buf + ctx->rk_offset, // current address
1006 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1007 ctx->rk_offset = new_offset;
1008 }
1009}
1010#endif
1011
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001012/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001013 * AES-ECB block encryption/decryption
1014 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001015int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1016 int mode,
1017 const unsigned char input[16],
1018 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001019{
Gilles Peskine449bd832023-01-11 14:50:10 +01001020 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001021 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001022 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001023
Gilles Peskine0de8f852023-03-16 17:14:59 +01001024#if defined(MAY_NEED_TO_ALIGN)
1025 aes_maybe_realign(ctx);
1026#endif
1027
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001028#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1030 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1031 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001032#endif
1033
Jerry Yu2bb3d812023-01-10 17:38:26 +08001034#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1035 if (mbedtls_aesce_has_support()) {
1036 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1037 }
1038#endif
1039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001040#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001041 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001042 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001043 }
1044#endif
1045
Gilles Peskine449bd832023-01-11 14:50:10 +01001046 if (mode == MBEDTLS_AES_ENCRYPT) {
1047 return mbedtls_internal_aes_encrypt(ctx, input, output);
1048 } else {
1049 return mbedtls_internal_aes_decrypt(ctx, input, output);
1050 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001051}
1052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001053#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001054
1055#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001056/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1057 * the result for the next block in CBC, and the cost of transferring that data from
1058 * NEON registers, it is faster to use the following on aarch64.
1059 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001060#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001061 mbedtls_put_unaligned_uint64(r, \
1062 mbedtls_get_unaligned_uint64(a) ^ \
1063 mbedtls_get_unaligned_uint64(b)); \
1064 mbedtls_put_unaligned_uint64(r + 8, \
1065 mbedtls_get_unaligned_uint64(a + 8) ^ \
1066 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001067} while (0)
1068#else
1069#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1070#endif
1071
Paul Bakker5121ce52009-01-03 21:22:43 +00001072/*
1073 * AES-CBC buffer encryption/decryption
1074 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001075int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1076 int mode,
1077 size_t length,
1078 unsigned char iv[16],
1079 const unsigned char *input,
1080 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001081{
Gilles Peskine7820a572021-07-07 21:08:28 +02001082 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001083 unsigned char temp[16];
1084
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001086 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001088
Gilles Peskine449bd832023-01-11 14:50:10 +01001089 if (length % 16) {
1090 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1091 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001094 if (aes_padlock_ace > 0) {
1095 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1096 return 0;
1097 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001098
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001099 // If padlock data misaligned, we just fall back to
1100 // unaccelerated mode
1101 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001102 }
1103#endif
1104
Dave Rodgman906c63c2023-06-14 17:53:51 +01001105 const unsigned char *ivp = iv;
1106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 if (mode == MBEDTLS_AES_DECRYPT) {
1108 while (length > 0) {
1109 memcpy(temp, input, 16);
1110 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1111 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001112 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001113 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001114 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001115
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001117
1118 input += 16;
1119 output += 16;
1120 length -= 16;
1121 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001122 } else {
1123 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001124 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1127 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001128 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001130 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001131
1132 input += 16;
1133 output += 16;
1134 length -= 16;
1135 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001136 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001137 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001138 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001139
Gilles Peskine7820a572021-07-07 21:08:28 +02001140exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001141 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001142}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001144
Aorimn5f778012016-06-09 23:22:58 +02001145#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001146
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001147typedef unsigned char mbedtls_be128[16];
1148
1149/*
1150 * GF(2^128) multiplication function
1151 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001152 * This function multiplies a field element by x in the polynomial field
1153 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001154 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001155 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001156 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001157static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1158 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001159{
1160 uint64_t a, b, ra, rb;
1161
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 a = MBEDTLS_GET_UINT64_LE(x, 0);
1163 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001164
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1166 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001167
Gilles Peskine449bd832023-01-11 14:50:10 +01001168 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1169 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001170}
1171
Aorimn5f778012016-06-09 23:22:58 +02001172/*
1173 * AES-XTS buffer encryption/decryption
1174 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001175int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1176 int mode,
1177 size_t length,
1178 const unsigned char data_unit[16],
1179 const unsigned char *input,
1180 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001181{
Janos Follath24eed8d2019-11-22 13:21:35 +00001182 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001183 size_t blocks = length / 16;
1184 size_t leftover = length % 16;
1185 unsigned char tweak[16];
1186 unsigned char prev_tweak[16];
1187 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001190 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001192
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001193 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001195 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 }
Aorimn5f778012016-06-09 23:22:58 +02001197
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001198 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001200 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001201 }
Aorimn5f778012016-06-09 23:22:58 +02001202
Jaeden Amerod82cd862018-04-28 15:02:45 +01001203 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1205 data_unit, tweak);
1206 if (ret != 0) {
1207 return ret;
1208 }
Aorimn5f778012016-06-09 23:22:58 +02001209
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001211 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001212 /* We are on the last block in a decrypt operation that has
1213 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001214 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001215 * the leftovers and then update the current tweak for use on this,
1216 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 memcpy(prev_tweak, tweak, sizeof(tweak));
1218 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001219 }
1220
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001222
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1224 if (ret != 0) {
1225 return ret;
1226 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001229
1230 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +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 Peskine449bd832023-01-11 14:50:10 +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
Dave Rodgman069e7f42022-11-24 19:37:26 +00001248 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001250 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001251 }
Aorimn5f778012016-06-09 23:22:58 +02001252
Dave Rodgman069e7f42022-11-24 19:37:26 +00001253 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001255
Jaeden Amerod82cd862018-04-28 15:02:45 +01001256 /* Copy ciphertext bytes from the previous block for input in this
1257 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001259
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1261 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001262 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001263 }
Aorimn5f778012016-06-09 23:22:58 +02001264
Jaeden Amerod82cd862018-04-28 15:02:45 +01001265 /* Write the result back to the previous block, overriding the previous
1266 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001268 }
1269
Gilles Peskine449bd832023-01-11 14:50:10 +01001270 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001271}
1272#endif /* MBEDTLS_CIPHER_MODE_XTS */
1273
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001275/*
1276 * AES-CFB128 buffer encryption/decryption
1277 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001278int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1279 int mode,
1280 size_t length,
1281 size_t *iv_off,
1282 unsigned char iv[16],
1283 const unsigned char *input,
1284 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001285{
Paul Bakker27fdf462011-06-09 13:55:13 +00001286 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001287 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001288 size_t n;
1289
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001291 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001293
1294 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001295
Gilles Peskine449bd832023-01-11 14:50:10 +01001296 if (n > 15) {
1297 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1298 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001299
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 if (mode == MBEDTLS_AES_DECRYPT) {
1301 while (length--) {
1302 if (n == 0) {
1303 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1304 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001305 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001306 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001307 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001308
1309 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001311 iv[n] = (unsigned char) c;
1312
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001314 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 } else {
1316 while (length--) {
1317 if (n == 0) {
1318 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1319 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001320 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001321 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001322 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001323
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001325
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001327 }
1328 }
1329
1330 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001331 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001332
Gilles Peskine7820a572021-07-07 21:08:28 +02001333exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001335}
Paul Bakker556efba2014-01-24 15:38:12 +01001336
1337/*
1338 * AES-CFB8 buffer encryption/decryption
1339 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001340int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1341 int mode,
1342 size_t length,
1343 unsigned char iv[16],
1344 const unsigned char *input,
1345 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001346{
Gilles Peskine7820a572021-07-07 21:08:28 +02001347 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001348 unsigned char c;
1349 unsigned char ov[17];
1350
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001352 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 }
1354 while (length--) {
1355 memcpy(ov, iv, 16);
1356 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1357 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001358 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 }
Paul Bakker556efba2014-01-24 15:38:12 +01001360
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001362 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 }
Paul Bakker556efba2014-01-24 15:38:12 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001366
Gilles Peskine449bd832023-01-11 14:50:10 +01001367 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001368 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 }
Paul Bakker556efba2014-01-24 15:38:12 +01001370
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001372 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001373 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001374
Gilles Peskine7820a572021-07-07 21:08:28 +02001375exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001376 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001377}
Simon Butcher76a5b222018-04-22 22:57:27 +01001378#endif /* MBEDTLS_CIPHER_MODE_CFB */
1379
1380#if defined(MBEDTLS_CIPHER_MODE_OFB)
1381/*
1382 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1383 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001384int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1385 size_t length,
1386 size_t *iv_off,
1387 unsigned char iv[16],
1388 const unsigned char *input,
1389 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001390{
Simon Butcherad4e4932018-04-29 00:43:47 +01001391 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001392 size_t n;
1393
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001394 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001395
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 if (n > 15) {
1397 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1398 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001399
Gilles Peskine449bd832023-01-11 14:50:10 +01001400 while (length--) {
1401 if (n == 0) {
1402 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1403 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001404 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001405 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001406 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001407 *output++ = *input++ ^ iv[n];
1408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001410 }
1411
1412 *iv_off = n;
1413
Simon Butcherad4e4932018-04-29 00:43:47 +01001414exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001416}
1417#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001420/*
1421 * AES-CTR buffer encryption/decryption
1422 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001423int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1424 size_t length,
1425 size_t *nc_off,
1426 unsigned char nonce_counter[16],
1427 unsigned char stream_block[16],
1428 const unsigned char *input,
1429 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001430{
Paul Bakker369e14b2012-04-18 14:16:09 +00001431 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001432 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001433 size_t n;
1434
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001435 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 if (n > 0x0F) {
1438 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1439 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 while (length--) {
1442 if (n == 0) {
1443 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1444 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001445 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001447
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 for (i = 16; i > 0; i--) {
1449 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001450 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 }
1452 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001453 }
1454 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001455 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001456
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001458 }
1459
1460 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001461 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001462
Gilles Peskine7820a572021-07-07 21:08:28 +02001463exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001465}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001471/*
1472 * AES test vectors from:
1473 *
1474 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1475 */
Yanray Wang62c99912023-05-11 11:06:53 +08001476static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001477{
1478 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1479 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001480#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001481 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1482 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1483 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1484 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001485#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001486};
1487
Yanray Wang62c99912023-05-11 11:06:53 +08001488static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001489{
1490 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1491 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001492#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001493 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1494 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1495 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1496 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001497#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001498};
1499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001501static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001502{
1503 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1504 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001505#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001506 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1507 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1508 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1509 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001510#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001511};
1512
Yanray Wang62c99912023-05-11 11:06:53 +08001513static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001514{
1515 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1516 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001517#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001518 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1519 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1520 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1521 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001522#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001523};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001526#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001527/*
1528 * AES-CFB128 test vectors from:
1529 *
1530 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1531 */
Yanray Wang62c99912023-05-11 11:06:53 +08001532static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001533{
1534 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1535 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001536#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001537 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1538 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1539 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1540 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1541 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1542 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1543 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001544#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001545};
1546
1547static const unsigned char aes_test_cfb128_iv[16] =
1548{
1549 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1550 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1551};
1552
1553static const unsigned char aes_test_cfb128_pt[64] =
1554{
1555 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1556 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1557 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1558 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1559 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1560 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1561 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1562 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1563};
1564
Yanray Wang62c99912023-05-11 11:06:53 +08001565static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001566{
1567 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1568 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1569 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1570 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1571 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1572 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1573 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1574 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001575#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001576 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1577 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1578 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1579 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1580 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1581 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1582 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1583 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1584 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1585 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1586 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1587 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1588 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1589 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1590 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1591 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001592#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001593};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001594#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001595
Simon Butcherad4e4932018-04-29 00:43:47 +01001596#if defined(MBEDTLS_CIPHER_MODE_OFB)
1597/*
1598 * AES-OFB test vectors from:
1599 *
Simon Butcher5db13622018-06-04 22:11:25 +01001600 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001601 */
Yanray Wang62c99912023-05-11 11:06:53 +08001602static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001603{
1604 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1605 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001606#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001607 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1608 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1609 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1610 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1611 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1612 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1613 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001614#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001615};
1616
1617static const unsigned char aes_test_ofb_iv[16] =
1618{
1619 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1620 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1621};
1622
1623static const unsigned char aes_test_ofb_pt[64] =
1624{
1625 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1626 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1627 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1628 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1629 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1630 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1631 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1632 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1633};
1634
Yanray Wang62c99912023-05-11 11:06:53 +08001635static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001636{
1637 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1638 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1639 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1640 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1641 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1642 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1643 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1644 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001645#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001646 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1647 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1648 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1649 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1650 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1651 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1652 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1653 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1654 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1655 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1656 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1657 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1658 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1659 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1660 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1661 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001662#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001663};
1664#endif /* MBEDTLS_CIPHER_MODE_OFB */
1665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001666#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001667/*
1668 * AES-CTR test vectors from:
1669 *
1670 * http://www.faqs.org/rfcs/rfc3686.html
1671 */
1672
Yanray Wang62c99912023-05-11 11:06:53 +08001673static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001674{
1675 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1676 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1677 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1678 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1679 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1680 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1681};
1682
Yanray Wang62c99912023-05-11 11:06:53 +08001683static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001684{
1685 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1687 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1688 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1689 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1690 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1691};
1692
Yanray Wang62c99912023-05-11 11:06:53 +08001693static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001694{
1695 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1696 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001697 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1698 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1699 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1700 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1701
1702 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1703 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1704 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1705 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1706 0x20, 0x21, 0x22, 0x23 }
1707};
1708
Yanray Wang62c99912023-05-11 11:06:53 +08001709static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001710{
1711 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1712 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1713 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1714 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1715 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1716 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1717 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1718 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1719 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1720 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1721 0x25, 0xB2, 0x07, 0x2F }
1722};
1723
1724static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001725{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001726#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001727
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001728#if defined(MBEDTLS_CIPHER_MODE_XTS)
1729/*
1730 * AES-XTS test vectors from:
1731 *
1732 * IEEE P1619/D16 Annex B
1733 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1734 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1735 */
1736static const unsigned char aes_test_xts_key[][32] =
1737{
1738 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1742 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1743 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1744 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1745 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1746 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1747 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1748 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1749 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1750};
1751
1752static const unsigned char aes_test_xts_pt32[][32] =
1753{
1754 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1758 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1759 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1760 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1761 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1762 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1763 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1764 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1765 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1766};
1767
1768static const unsigned char aes_test_xts_ct32[][32] =
1769{
1770 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1771 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1772 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1773 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1774 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1775 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1776 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1777 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1778 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1779 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1780 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1781 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1782};
1783
1784static const unsigned char aes_test_xts_data_unit[][16] =
1785{
Gilles Peskine449bd832023-01-11 14:50:10 +01001786 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1788 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1790 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001792};
1793
1794#endif /* MBEDTLS_CIPHER_MODE_XTS */
1795
Paul Bakker5121ce52009-01-03 21:22:43 +00001796/*
1797 * Checkup routine
1798 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001799int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001800{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001801 int ret = 0, i, j, u, mode;
1802 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001803 unsigned char key[32];
1804 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001805 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001806#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1807 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001808 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001809#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001810#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001811 unsigned char prv[16];
1812#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001813#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1814 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001815 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001816#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001817#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001818 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001819#endif
1820#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001821 unsigned char nonce_counter[16];
1822 unsigned char stream_block[16];
1823#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001824 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001825
Gilles Peskine449bd832023-01-11 14:50:10 +01001826 memset(key, 0, 32);
1827 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001828
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001829 if (verbose != 0) {
1830#if defined(MBEDTLS_AES_ALT)
1831 mbedtls_printf(" AES note: alternative implementation.\n");
1832#else /* MBEDTLS_AES_ALT */
1833#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1834 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1835 mbedtls_printf(" AES note: using VIA Padlock.\n");
1836 } else
1837#endif
1838#if defined(MBEDTLS_AESNI_HAVE_CODE)
1839 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1840 mbedtls_printf(" AES note: using AESNI.\n");
1841 } else
1842#endif
1843#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1844 if (mbedtls_aesce_has_support()) {
1845 mbedtls_printf(" AES note: using AESCE.\n");
1846 } else
1847#endif
1848 mbedtls_printf(" AES note: built-in implementation.\n");
1849#endif /* MBEDTLS_AES_ALT */
1850 }
1851
Paul Bakker5121ce52009-01-03 21:22:43 +00001852 /*
1853 * ECB mode
1854 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001855 {
1856 static const int num_tests =
1857 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001858
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001859 for (i = 0; i < num_tests << 1; i++) {
1860 u = i >> 1;
1861 keybits = 128 + u * 64;
1862 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001863
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001864 if (verbose != 0) {
1865 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1866 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1867 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001868
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001869 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001870
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001871 if (mode == MBEDTLS_AES_DECRYPT) {
1872 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1873 aes_tests = aes_test_ecb_dec[u];
1874 } else {
1875 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1876 aes_tests = aes_test_ecb_enc[u];
1877 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001878
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001879 /*
1880 * AES-192 is an optional feature that may be unavailable when
1881 * there is an alternative underlying implementation i.e. when
1882 * MBEDTLS_AES_ALT is defined.
1883 */
1884 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1885 mbedtls_printf("skipped\n");
1886 continue;
1887 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001888 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001890
1891 for (j = 0; j < 10000; j++) {
1892 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1893 if (ret != 0) {
1894 goto exit;
1895 }
1896 }
1897
1898 if (memcmp(buf, aes_tests, 16) != 0) {
1899 ret = 1;
1900 goto exit;
1901 }
1902
1903 if (verbose != 0) {
1904 mbedtls_printf("passed\n");
1905 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001906 }
1907
Gilles Peskine449bd832023-01-11 14:50:10 +01001908 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001909 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001910 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001911 }
1912
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001913#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001914 /*
1915 * CBC mode
1916 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001917 {
1918 static const int num_tests =
1919 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001920
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001921 for (i = 0; i < num_tests << 1; i++) {
1922 u = i >> 1;
1923 keybits = 128 + u * 64;
1924 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001925
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001926 if (verbose != 0) {
1927 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1928 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001929 }
1930
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001931 memset(iv, 0, 16);
1932 memset(prv, 0, 16);
1933 memset(buf, 0, 16);
1934
1935 if (mode == MBEDTLS_AES_DECRYPT) {
1936 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1937 aes_tests = aes_test_cbc_dec[u];
1938 } else {
1939 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1940 aes_tests = aes_test_cbc_enc[u];
1941 }
1942
1943 /*
1944 * AES-192 is an optional feature that may be unavailable when
1945 * there is an alternative underlying implementation i.e. when
1946 * MBEDTLS_AES_ALT is defined.
1947 */
1948 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1949 mbedtls_printf("skipped\n");
1950 continue;
1951 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001952 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001953 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001954
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001955 for (j = 0; j < 10000; j++) {
1956 if (mode == MBEDTLS_AES_ENCRYPT) {
1957 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001958
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001959 memcpy(tmp, prv, 16);
1960 memcpy(prv, buf, 16);
1961 memcpy(buf, tmp, 16);
1962 }
1963
1964 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1965 if (ret != 0) {
1966 goto exit;
1967 }
1968
1969 }
1970
1971 if (memcmp(buf, aes_tests, 16) != 0) {
1972 ret = 1;
1973 goto exit;
1974 }
1975
1976 if (verbose != 0) {
1977 mbedtls_printf("passed\n");
1978 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001979 }
1980
Gilles Peskine449bd832023-01-11 14:50:10 +01001981 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001982 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001983 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001984 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001985#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001986
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001987#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001988 /*
1989 * CFB128 mode
1990 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001991 {
1992 static const int num_tests =
1993 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001994
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001995 for (i = 0; i < num_tests << 1; i++) {
1996 u = i >> 1;
1997 keybits = 128 + u * 64;
1998 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001999
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002000 if (verbose != 0) {
2001 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
2002 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2003 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002004
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002005 memcpy(iv, aes_test_cfb128_iv, 16);
2006 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002007
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002008 offset = 0;
2009 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2010 /*
2011 * AES-192 is an optional feature that may be unavailable when
2012 * there is an alternative underlying implementation i.e. when
2013 * MBEDTLS_AES_ALT is defined.
2014 */
2015 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2016 mbedtls_printf("skipped\n");
2017 continue;
2018 } else if (ret != 0) {
2019 goto exit;
2020 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002021
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002022 if (mode == MBEDTLS_AES_DECRYPT) {
2023 memcpy(buf, aes_test_cfb128_ct[u], 64);
2024 aes_tests = aes_test_cfb128_pt;
2025 } else {
2026 memcpy(buf, aes_test_cfb128_pt, 64);
2027 aes_tests = aes_test_cfb128_ct[u];
2028 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002029
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002030 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2031 if (ret != 0) {
2032 goto exit;
2033 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002034
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002035 if (memcmp(buf, aes_tests, 64) != 0) {
2036 ret = 1;
2037 goto exit;
2038 }
2039
2040 if (verbose != 0) {
2041 mbedtls_printf("passed\n");
2042 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002043 }
2044
Gilles Peskine449bd832023-01-11 14:50:10 +01002045 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002046 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002048 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002049#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002050
Simon Butcherad4e4932018-04-29 00:43:47 +01002051#if defined(MBEDTLS_CIPHER_MODE_OFB)
2052 /*
2053 * OFB mode
2054 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002055 {
2056 static const int num_tests =
2057 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002058
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002059 for (i = 0; i < num_tests << 1; i++) {
2060 u = i >> 1;
2061 keybits = 128 + u * 64;
2062 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002063
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002064 if (verbose != 0) {
2065 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2066 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2067 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002068
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002069 memcpy(iv, aes_test_ofb_iv, 16);
2070 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002071
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002072 offset = 0;
2073 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2074 /*
2075 * AES-192 is an optional feature that may be unavailable when
2076 * there is an alternative underlying implementation i.e. when
2077 * MBEDTLS_AES_ALT is defined.
2078 */
2079 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2080 mbedtls_printf("skipped\n");
2081 continue;
2082 } else if (ret != 0) {
2083 goto exit;
2084 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002085
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002086 if (mode == MBEDTLS_AES_DECRYPT) {
2087 memcpy(buf, aes_test_ofb_ct[u], 64);
2088 aes_tests = aes_test_ofb_pt;
2089 } else {
2090 memcpy(buf, aes_test_ofb_pt, 64);
2091 aes_tests = aes_test_ofb_ct[u];
2092 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002093
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002094 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2095 if (ret != 0) {
2096 goto exit;
2097 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002098
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002099 if (memcmp(buf, aes_tests, 64) != 0) {
2100 ret = 1;
2101 goto exit;
2102 }
2103
2104 if (verbose != 0) {
2105 mbedtls_printf("passed\n");
2106 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002107 }
2108
Gilles Peskine449bd832023-01-11 14:50:10 +01002109 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002110 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002111 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002112 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002113#endif /* MBEDTLS_CIPHER_MODE_OFB */
2114
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002115#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002116 /*
2117 * CTR mode
2118 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002119 {
2120 static const int num_tests =
2121 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002122
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002123 for (i = 0; i < num_tests << 1; i++) {
2124 u = i >> 1;
2125 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002126
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002127 if (verbose != 0) {
2128 mbedtls_printf(" AES-CTR-128 (%s): ",
2129 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2130 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002131
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002132 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2133 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002134
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002135 offset = 0;
2136 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2137 goto exit;
2138 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002139
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002140 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002141
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002142 if (mode == MBEDTLS_AES_DECRYPT) {
2143 memcpy(buf, aes_test_ctr_ct[u], len);
2144 aes_tests = aes_test_ctr_pt[u];
2145 } else {
2146 memcpy(buf, aes_test_ctr_pt[u], len);
2147 aes_tests = aes_test_ctr_ct[u];
2148 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002149
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002150 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2151 stream_block, buf, buf);
2152 if (ret != 0) {
2153 goto exit;
2154 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002155
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002156 if (memcmp(buf, aes_tests, len) != 0) {
2157 ret = 1;
2158 goto exit;
2159 }
2160
2161 if (verbose != 0) {
2162 mbedtls_printf("passed\n");
2163 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002165 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002166
Gilles Peskine449bd832023-01-11 14:50:10 +01002167 if (verbose != 0) {
2168 mbedtls_printf("\n");
2169 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002170#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002171
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002172#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002173 /*
2174 * XTS mode
2175 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002176 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 static const int num_tests =
2178 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2179 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002182
Gilles Peskine449bd832023-01-11 14:50:10 +01002183 for (i = 0; i < num_tests << 1; i++) {
2184 const unsigned char *data_unit;
2185 u = i >> 1;
2186 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 if (verbose != 0) {
2189 mbedtls_printf(" AES-XTS-128 (%s): ",
2190 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2191 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002192
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 memset(key, 0, sizeof(key));
2194 memcpy(key, aes_test_xts_key[u], 32);
2195 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002196
Gilles Peskine449bd832023-01-11 14:50:10 +01002197 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002198
Gilles Peskine449bd832023-01-11 14:50:10 +01002199 if (mode == MBEDTLS_AES_DECRYPT) {
2200 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2201 if (ret != 0) {
2202 goto exit;
2203 }
2204 memcpy(buf, aes_test_xts_ct32[u], len);
2205 aes_tests = aes_test_xts_pt32[u];
2206 } else {
2207 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2208 if (ret != 0) {
2209 goto exit;
2210 }
2211 memcpy(buf, aes_test_xts_pt32[u], len);
2212 aes_tests = aes_test_xts_ct32[u];
2213 }
2214
2215
2216 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2217 buf, buf);
2218 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002219 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 }
2221
2222 if (memcmp(buf, aes_tests, len) != 0) {
2223 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002224 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002225 }
2226
2227 if (verbose != 0) {
2228 mbedtls_printf("passed\n");
2229 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002230 }
2231
Gilles Peskine449bd832023-01-11 14:50:10 +01002232 if (verbose != 0) {
2233 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002234 }
2235
Gilles Peskine449bd832023-01-11 14:50:10 +01002236 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002237 }
2238#endif /* MBEDTLS_CIPHER_MODE_XTS */
2239
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002240 ret = 0;
2241
2242exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002243 if (ret != 0 && verbose != 0) {
2244 mbedtls_printf("failed\n");
2245 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002246
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002248
Gilles Peskine449bd832023-01-11 14:50:10 +01002249 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002250}
2251
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002252#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002254#endif /* MBEDTLS_AES_C */