blob: 6ec4d78086bcc4140ff62969a3b29e4c9772c334 [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
186/*
187 * Reverse S-box
188 */
189static const unsigned char RSb[256] =
190{
191 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
192 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
193 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
194 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
195 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
196 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
197 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
198 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
199 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
200 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
201 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
202 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
203 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
204 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
205 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
206 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
207 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
208 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
209 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
210 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
211 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
212 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
213 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
214 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
215 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
216 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
217 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
218 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
219 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
220 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
221 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
222 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
223};
224
225/*
226 * Reverse tables
227 */
228#define RT \
229\
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
231 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
232 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
233 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
234 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
235 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
236 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
237 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
238 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
239 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
240 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
241 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
242 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
243 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
244 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
245 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
246 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
247 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
248 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
249 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
250 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
251 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
252 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
253 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
254 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
255 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
256 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
257 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
258 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
259 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
260 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
261 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
262 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
263 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
264 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
265 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
266 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
267 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
268 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
269 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
270 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
271 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
272 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
273 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
274 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
275 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
276 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
277 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
278 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
279 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
280 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
281 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
282 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
283 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
284 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
285 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
286 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
287 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
288 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
289 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
290 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
291 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
292 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
293 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 +0000294
Gilles Peskine449bd832023-01-11 14:50:10 +0100295#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000296static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000297#undef V
298
Hanno Beckerad049a92017-06-19 16:31:54 +0100299#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000302static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000303#undef V
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000307#undef V
308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000311#undef V
312
Hanno Becker177d3cf2017-06-07 15:52:48 +0100313#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200314
Paul Bakker5121ce52009-01-03 21:22:43 +0000315#undef RT
316
317/*
318 * Round constants
319 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000321{
322 0x00000001, 0x00000002, 0x00000004, 0x00000008,
323 0x00000010, 0x00000020, 0x00000040, 0x00000080,
324 0x0000001B, 0x00000036
325};
326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
329/*
330 * Forward S-box & tables
331 */
332static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200333static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100334#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200335static uint32_t FT1[256];
336static uint32_t FT2[256];
337static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100338#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Reverse S-box & tables
342 */
343static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000344static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100345#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346static uint32_t RT1[256];
347static uint32_t RT2[256];
348static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100349#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
351/*
352 * Round constants
353 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
356/*
357 * Tables generation code
358 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
360#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
361#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363static int aes_init_done = 0;
364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000366{
367 int i, x, y, z;
368 int pow[256];
369 int log[256];
370
371 /*
372 * compute pow and log tables over GF(2^8)
373 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 pow[i] = x;
376 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000378 }
379
380 /*
381 * calculate the round constants
382 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000384 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 }
387
388 /*
389 * generate the forward and reverse S-boxes
390 */
391 FSb[0x00] = 0x63;
392 RSb[0x63] = 0x00;
393
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000395 x = pow[255 - log[i]];
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
398 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
399 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
400 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000401 x ^= y ^ 0x63;
402
403 FSb[i] = (unsigned char) x;
404 RSb[x] = (unsigned char) i;
405 }
406
407 /*
408 * generate the forward and reverse tables
409 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000411 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 y = MBEDTLS_BYTE_0(XTIME(x));
413 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 FT0[i] = ((uint32_t) y) ^
416 ((uint32_t) x << 8) ^
417 ((uint32_t) x << 16) ^
418 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Hanno Beckerad049a92017-06-19 16:31:54 +0100420#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 FT1[i] = ROTL8(FT0[i]);
422 FT2[i] = ROTL8(FT1[i]);
423 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100424#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000425
426 x = RSb[i];
427
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
429 ((uint32_t) MUL(0x09, x) << 8) ^
430 ((uint32_t) MUL(0x0D, x) << 16) ^
431 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
Hanno Beckerad049a92017-06-19 16:31:54 +0100433#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 RT1[i] = ROTL8(RT0[i]);
435 RT2[i] = ROTL8(RT1[i]);
436 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100437#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000438 }
439}
440
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200441#undef ROTL8
442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Hanno Beckerad049a92017-06-19 16:31:54 +0100445#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
448#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
449#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200450
451#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100452#define AES_RT1(idx) ROTL8(RT0[idx])
453#define AES_RT2(idx) ROTL16(RT0[idx])
454#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200455
456#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100457#define AES_FT1(idx) ROTL8(FT0[idx])
458#define AES_FT2(idx) ROTL16(FT0[idx])
459#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200460
Hanno Becker177d3cf2017-06-07 15:52:48 +0100461#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200462
463#define AES_RT0(idx) RT0[idx]
464#define AES_RT1(idx) RT1[idx]
465#define AES_RT2(idx) RT2[idx]
466#define AES_RT3(idx) RT3[idx]
467
468#define AES_FT0(idx) FT0[idx]
469#define AES_FT1(idx) FT1[idx]
470#define AES_FT2(idx) FT2[idx]
471#define AES_FT3(idx) FT3[idx]
472
Hanno Becker177d3cf2017-06-07 15:52:48 +0100473#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200474
Gilles Peskine449bd832023-01-11 14:50:10 +0100475void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200476{
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200478}
479
Gilles Peskine449bd832023-01-11 14:50:10 +0100480void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200481{
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487}
488
Jaeden Amero9366feb2018-05-29 18:55:17 +0100489#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100490void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100491{
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 mbedtls_aes_init(&ctx->crypt);
493 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100494}
495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100497{
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100499 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 }
Simon Butcher5201e412018-12-06 17:40:14 +0000501
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 mbedtls_aes_free(&ctx->crypt);
503 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100504}
505#endif /* MBEDTLS_CIPHER_MODE_XTS */
506
Gilles Peskine0de8f852023-03-16 17:14:59 +0100507/* Some implementations need the round keys to be aligned.
508 * Return an offset to be added to buf, such that (buf + offset) is
509 * correctly aligned.
510 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
511 * i.e. an offset of 1 means 4 bytes and so on.
512 */
513#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100514 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100515#define MAY_NEED_TO_ALIGN
516#endif
517static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
518{
519#if defined(MAY_NEED_TO_ALIGN)
520 int align_16_bytes = 0;
521
522#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
523 if (aes_padlock_ace == -1) {
524 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
525 }
526 if (aes_padlock_ace) {
527 align_16_bytes = 1;
528 }
529#endif
530
Gilles Peskine9c682e72023-03-16 17:21:33 +0100531#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100532 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
533 align_16_bytes = 1;
534 }
535#endif
536
537 if (align_16_bytes) {
538 /* These implementations needs 16-byte alignment
539 * for the round key array. */
540 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
541 if (delta == 0) {
542 return 0;
543 } else {
544 return 4 - delta; // 16 bytes = 4 uint32_t
545 }
546 }
547#else /* MAY_NEED_TO_ALIGN */
548 (void) buf;
549#endif /* MAY_NEED_TO_ALIGN */
550
551 return 0;
552}
553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554/*
555 * AES key schedule (encryption)
556 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200557#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100558int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
559 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000560{
Paul Bakker23986e52011-04-24 08:57:21 +0000561 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000562 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
Gilles Peskine449bd832023-01-11 14:50:10 +0100564 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000565 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800566#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000567 case 192: ctx->nr = 12; break;
568 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800569#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 }
572
Simon Butcher5201e412018-12-06 17:40:14 +0000573#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000575 aes_gen_tables();
576 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000577 }
578#endif
579
Gilles Peskine0de8f852023-03-16 17:14:59 +0100580 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100581 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100583#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
585 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
586 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100587#endif
588
Jerry Yu3f2fb712023-01-10 17:05:42 +0800589#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
590 if (mbedtls_aesce_has_support()) {
591 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
592 }
593#endif
594
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 for (i = 0; i < (keybits >> 5); i++) {
596 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 }
598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000600 case 10:
601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
605 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
606 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
607 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000608
609 RK[5] = RK[1] ^ RK[4];
610 RK[6] = RK[2] ^ RK[5];
611 RK[7] = RK[3] ^ RK[6];
612 }
613 break;
614
Arto Kinnunen732ca322023-04-14 14:26:10 +0800615#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 case 12:
617
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
621 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
622 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
623 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625 RK[7] = RK[1] ^ RK[6];
626 RK[8] = RK[2] ^ RK[7];
627 RK[9] = RK[3] ^ RK[8];
628 RK[10] = RK[4] ^ RK[9];
629 RK[11] = RK[5] ^ RK[10];
630 }
631 break;
632
633 case 14:
634
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
638 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
639 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
640 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[9] = RK[1] ^ RK[8];
643 RK[10] = RK[2] ^ RK[9];
644 RK[11] = RK[3] ^ RK[10];
645
646 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
648 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[13] = RK[5] ^ RK[12];
653 RK[14] = RK[6] ^ RK[13];
654 RK[15] = RK[7] ^ RK[14];
655 }
656 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800657#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000658 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000659
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000661}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200662#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
664/*
665 * AES key schedule (decryption)
666 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200667#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100668int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
669 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000670{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200671 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000673 uint32_t *RK;
674 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200675
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000677
Gilles Peskine0de8f852023-03-16 17:14:59 +0100678 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100679 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000680
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200681 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200683 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100684 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000685
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200686 ctx->nr = cty.nr;
687
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100688#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100689 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
690 mbedtls_aesni_inverse_key((unsigned char *) RK,
691 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200692 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100693 }
694#endif
695
Jerry Yue096da12023-01-10 17:07:01 +0800696#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
697 if (mbedtls_aesce_has_support()) {
698 mbedtls_aesce_inverse_key(
699 (unsigned char *) RK,
700 (const unsigned char *) (cty.buf + cty.rk_offset),
701 ctx->nr);
702 goto exit;
703 }
704#endif
705
Werner Lewisdd76ef32022-05-30 12:00:21 +0100706 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
708 *RK++ = *SK++;
709 *RK++ = *SK++;
710 *RK++ = *SK++;
711 *RK++ = *SK++;
712
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
714 for (j = 0; j < 4; j++, SK++) {
715 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
716 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
717 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
718 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000719 }
720 }
721
722 *RK++ = *SK++;
723 *RK++ = *SK++;
724 *RK++ = *SK++;
725 *RK++ = *SK++;
726
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200727exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000729
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000731}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100732#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100733
734#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100735static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
736 unsigned int keybits,
737 const unsigned char **key1,
738 unsigned int *key1bits,
739 const unsigned char **key2,
740 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100741{
742 const unsigned int half_keybits = keybits / 2;
743 const unsigned int half_keybytes = half_keybits / 8;
744
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100746 case 256: break;
747 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100749 }
750
751 *key1bits = half_keybits;
752 *key2bits = half_keybits;
753 *key1 = &key[0];
754 *key2 = &key[half_keybytes];
755
756 return 0;
757}
758
Gilles Peskine449bd832023-01-11 14:50:10 +0100759int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
760 const unsigned char *key,
761 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100762{
Janos Follath24eed8d2019-11-22 13:21:35 +0000763 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100764 const unsigned char *key1, *key2;
765 unsigned int key1bits, key2bits;
766
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
768 &key2, &key2bits);
769 if (ret != 0) {
770 return ret;
771 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772
773 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
775 if (ret != 0) {
776 return ret;
777 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100778
779 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100781}
782
Gilles Peskine449bd832023-01-11 14:50:10 +0100783int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
784 const unsigned char *key,
785 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100786{
Janos Follath24eed8d2019-11-22 13:21:35 +0000787 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788 const unsigned char *key1, *key2;
789 unsigned int key1bits, key2bits;
790
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
792 &key2, &key2bits);
793 if (ret != 0) {
794 return ret;
795 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100796
797 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
799 if (ret != 0) {
800 return ret;
801 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100802
803 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100805}
806#endif /* MBEDTLS_CIPHER_MODE_XTS */
807
Gilles Peskine449bd832023-01-11 14:50:10 +0100808#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100809 do \
810 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100811 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
812 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
813 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
814 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100815 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100816 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
817 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
818 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
819 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100820 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
822 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
823 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
824 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100825 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
827 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
828 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
829 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
830 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100833 do \
834 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100835 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
836 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
837 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
838 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100839 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
841 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
842 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
843 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100844 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
846 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
847 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
848 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100849 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
851 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
852 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
853 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
854 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000855
856/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200857 * AES-ECB block encryption
858 */
859#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100860int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
861 const unsigned char input[16],
862 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200863{
864 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100865 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200867 uint32_t X[4];
868 uint32_t Y[4];
869 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200870
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
872 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
873 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
874 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200875
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
877 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]);
878 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 +0200879 }
880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 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 +0200882
Gilles Peskine5197c662020-08-26 17:03:24 +0200883 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
885 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
886 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
887 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200888
Gilles Peskine5197c662020-08-26 17:03:24 +0200889 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
891 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
892 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
908 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
909 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
910 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000911
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200915}
916#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
917
918/*
919 * AES-ECB block decryption
920 */
921#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100922int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
923 const unsigned char input[16],
924 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925{
926 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100927 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200929 uint32_t X[4];
930 uint32_t Y[4];
931 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200932
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
934 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
935 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
936 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
939 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]);
940 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 +0200941 }
942
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 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 +0200944
Gilles Peskine5197c662020-08-26 17:03:24 +0200945 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
947 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
948 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
949 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200950
Gilles Peskine5197c662020-08-26 17:03:24 +0200951 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
970 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
971 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
972 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000973
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500975
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200977}
978#endif /* !MBEDTLS_AES_DECRYPT_ALT */
979
Gilles Peskine0de8f852023-03-16 17:14:59 +0100980#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100981/* VIA Padlock and our intrinsics-based implementation of AESNI require
982 * the round keys to be aligned on a 16-byte boundary. We take care of this
983 * before creating them, but the AES context may have moved (this can happen
984 * if the library is called from a language with managed memory), and in later
985 * calls it might have a different alignment with respect to 16-byte memory.
986 * So we may need to realign.
987 */
988static void aes_maybe_realign(mbedtls_aes_context *ctx)
989{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100990 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
991 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100992 memmove(ctx->buf + new_offset, // new address
993 ctx->buf + ctx->rk_offset, // current address
994 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
995 ctx->rk_offset = new_offset;
996 }
997}
998#endif
999
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001000/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001001 * AES-ECB block encryption/decryption
1002 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001003int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1004 int mode,
1005 const unsigned char input[16],
1006 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001007{
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001009 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001011
Gilles Peskine0de8f852023-03-16 17:14:59 +01001012#if defined(MAY_NEED_TO_ALIGN)
1013 aes_maybe_realign(ctx);
1014#endif
1015
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001016#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1018 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1019 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001020#endif
1021
Jerry Yu2bb3d812023-01-10 17:38:26 +08001022#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1023 if (mbedtls_aesce_has_support()) {
1024 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1025 }
1026#endif
1027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001030 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001031 }
1032#endif
1033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 if (mode == MBEDTLS_AES_ENCRYPT) {
1035 return mbedtls_internal_aes_encrypt(ctx, input, output);
1036 } else {
1037 return mbedtls_internal_aes_decrypt(ctx, input, output);
1038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001039}
1040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001042
Paul Bakker5121ce52009-01-03 21:22:43 +00001043/*
1044 * AES-CBC buffer encryption/decryption
1045 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001046int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1047 int mode,
1048 size_t length,
1049 unsigned char iv[16],
1050 const unsigned char *input,
1051 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001052{
Gilles Peskine7820a572021-07-07 21:08:28 +02001053 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001054 unsigned char temp[16];
1055
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001057 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001058 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001059
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 if (length % 16) {
1061 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1062 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001064#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001065 if (aes_padlock_ace > 0) {
1066 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1067 return 0;
1068 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001069
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001070 // If padlock data misaligned, we just fall back to
1071 // unaccelerated mode
1072 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001073 }
1074#endif
1075
Dave Rodgman906c63c2023-06-14 17:53:51 +01001076 const unsigned char *ivp = iv;
1077
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 if (mode == MBEDTLS_AES_DECRYPT) {
1079 while (length > 0) {
1080 memcpy(temp, input, 16);
1081 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1082 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001083 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 }
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001085 /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1086 * the result for the next block in CBC, and the cost of transferring that data from
1087 * NEON registers, NEON is slower on aarch64. */
1088 mbedtls_xor_no_simd(output, output, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001089
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001091
1092 input += 16;
1093 output += 16;
1094 length -= 16;
1095 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 } else {
1097 while (length > 0) {
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001098 mbedtls_xor_no_simd(output, input, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001099
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1101 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001102 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001103 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001104 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001105
1106 input += 16;
1107 output += 16;
1108 length -= 16;
1109 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001110 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001111 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001112 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001113
Gilles Peskine7820a572021-07-07 21:08:28 +02001114exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001115 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001116}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001118
Aorimn5f778012016-06-09 23:22:58 +02001119#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001120
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001121typedef unsigned char mbedtls_be128[16];
1122
1123/*
1124 * GF(2^128) multiplication function
1125 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001126 * This function multiplies a field element by x in the polynomial field
1127 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001128 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001129 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001130 */
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001131MBEDTLS_OPTIMIZE_ALWAYS
1132static inline void mbedtls_gf128mul_x_ble(unsigned char r[16],
Gilles Peskine449bd832023-01-11 14:50:10 +01001133 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001134{
1135 uint64_t a, b, ra, rb;
1136
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 a = MBEDTLS_GET_UINT64_LE(x, 0);
1138 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001139
Gilles Peskine449bd832023-01-11 14:50:10 +01001140 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1141 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001142
Gilles Peskine449bd832023-01-11 14:50:10 +01001143 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1144 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001145}
1146
Aorimn5f778012016-06-09 23:22:58 +02001147/*
1148 * AES-XTS buffer encryption/decryption
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001149 *
1150 * Use of MBEDTLS_OPTIMIZE_ALWAYS here and for mbedtls_gf128mul_x_ble()
1151 * is a 3x performance improvement for gcc -Os!
Aorimn5f778012016-06-09 23:22:58 +02001152 */
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001153MBEDTLS_OPTIMIZE_ALWAYS
Gilles Peskine449bd832023-01-11 14:50:10 +01001154int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1155 int mode,
1156 size_t length,
1157 const unsigned char data_unit[16],
1158 const unsigned char *input,
1159 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001160{
Janos Follath24eed8d2019-11-22 13:21:35 +00001161 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001162 size_t blocks = length / 16;
1163 size_t leftover = length % 16;
1164 unsigned char tweak[16];
1165 unsigned char prev_tweak[16];
1166 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001167
Gilles Peskine449bd832023-01-11 14:50:10 +01001168 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001169 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001170 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001171
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001172 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001173 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001174 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 }
Aorimn5f778012016-06-09 23:22:58 +02001176
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001177 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001179 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 }
Aorimn5f778012016-06-09 23:22:58 +02001181
Jaeden Amerod82cd862018-04-28 15:02:45 +01001182 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001183 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1184 data_unit, tweak);
1185 if (ret != 0) {
1186 return ret;
1187 }
Aorimn5f778012016-06-09 23:22:58 +02001188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001190 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001191 /* We are on the last block in a decrypt operation that has
1192 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001193 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001194 * the leftovers and then update the current tweak for use on this,
1195 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 memcpy(prev_tweak, tweak, sizeof(tweak));
1197 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001198 }
1199
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001201
Gilles Peskine449bd832023-01-11 14:50:10 +01001202 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1203 if (ret != 0) {
1204 return ret;
1205 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001208
1209 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001211
1212 output += 16;
1213 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001214 }
1215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001217 /* If we are on the leftover bytes in a decrypt operation, we need to
1218 * use the previous tweak for these bytes (as saved in prev_tweak). */
1219 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001220
Jaeden Amerod82cd862018-04-28 15:02:45 +01001221 /* We are now on the final part of the data unit, which doesn't divide
1222 * evenly by 16. It's time for ciphertext stealing. */
1223 size_t i;
1224 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001225
Jaeden Amerod82cd862018-04-28 15:02:45 +01001226 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001227 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001229 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001230 }
Aorimn5f778012016-06-09 23:22:58 +02001231
Dave Rodgman069e7f42022-11-24 19:37:26 +00001232 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001234
Jaeden Amerod82cd862018-04-28 15:02:45 +01001235 /* Copy ciphertext bytes from the previous block for input in this
1236 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001238
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1240 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001241 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 }
Aorimn5f778012016-06-09 23:22:58 +02001243
Jaeden Amerod82cd862018-04-28 15:02:45 +01001244 /* Write the result back to the previous block, overriding the previous
1245 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001247 }
1248
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001250}
1251#endif /* MBEDTLS_CIPHER_MODE_XTS */
1252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001254/*
1255 * AES-CFB128 buffer encryption/decryption
1256 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001257int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1258 int mode,
1259 size_t length,
1260 size_t *iv_off,
1261 unsigned char iv[16],
1262 const unsigned char *input,
1263 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001264{
Paul Bakker27fdf462011-06-09 13:55:13 +00001265 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001266 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001267 size_t n;
1268
Gilles Peskine449bd832023-01-11 14:50:10 +01001269 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001270 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001272
1273 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001274
Gilles Peskine449bd832023-01-11 14:50:10 +01001275 if (n > 15) {
1276 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1277 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001278
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 if (mode == MBEDTLS_AES_DECRYPT) {
1280 while (length--) {
1281 if (n == 0) {
1282 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1283 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001284 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001285 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001286 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001287
1288 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001290 iv[n] = (unsigned char) c;
1291
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001293 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 } else {
1295 while (length--) {
1296 if (n == 0) {
1297 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1298 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001299 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001301 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001302
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001304
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001306 }
1307 }
1308
1309 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001310 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001311
Gilles Peskine7820a572021-07-07 21:08:28 +02001312exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001314}
Paul Bakker556efba2014-01-24 15:38:12 +01001315
1316/*
1317 * AES-CFB8 buffer encryption/decryption
1318 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001319int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1320 int mode,
1321 size_t length,
1322 unsigned char iv[16],
1323 const unsigned char *input,
1324 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001325{
Gilles Peskine7820a572021-07-07 21:08:28 +02001326 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001327 unsigned char c;
1328 unsigned char ov[17];
1329
Gilles Peskine449bd832023-01-11 14:50:10 +01001330 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001331 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001332 }
1333 while (length--) {
1334 memcpy(ov, iv, 16);
1335 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1336 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001337 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001338 }
Paul Bakker556efba2014-01-24 15:38:12 +01001339
Gilles Peskine449bd832023-01-11 14:50:10 +01001340 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001341 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 }
Paul Bakker556efba2014-01-24 15:38:12 +01001343
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001345
Gilles Peskine449bd832023-01-11 14:50:10 +01001346 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001347 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 }
Paul Bakker556efba2014-01-24 15:38:12 +01001349
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001351 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001352 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001353
Gilles Peskine7820a572021-07-07 21:08:28 +02001354exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001356}
Simon Butcher76a5b222018-04-22 22:57:27 +01001357#endif /* MBEDTLS_CIPHER_MODE_CFB */
1358
1359#if defined(MBEDTLS_CIPHER_MODE_OFB)
1360/*
1361 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1362 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001363int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1364 size_t length,
1365 size_t *iv_off,
1366 unsigned char iv[16],
1367 const unsigned char *input,
1368 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001369{
Simon Butcherad4e4932018-04-29 00:43:47 +01001370 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001371 size_t n;
1372
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001373 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001374
Gilles Peskine449bd832023-01-11 14:50:10 +01001375 if (n > 15) {
1376 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1377 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001378
Gilles Peskine449bd832023-01-11 14:50:10 +01001379 while (length--) {
1380 if (n == 0) {
1381 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1382 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001383 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001385 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001386 *output++ = *input++ ^ iv[n];
1387
Gilles Peskine449bd832023-01-11 14:50:10 +01001388 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001389 }
1390
1391 *iv_off = n;
1392
Simon Butcherad4e4932018-04-29 00:43:47 +01001393exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001395}
1396#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001399/*
1400 * AES-CTR buffer encryption/decryption
1401 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001402int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1403 size_t length,
1404 size_t *nc_off,
1405 unsigned char nonce_counter[16],
1406 unsigned char stream_block[16],
1407 const unsigned char *input,
1408 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001409{
Paul Bakker369e14b2012-04-18 14:16:09 +00001410 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001411 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001412 size_t n;
1413
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001414 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001415
Gilles Peskine449bd832023-01-11 14:50:10 +01001416 if (n > 0x0F) {
1417 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1418 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001419
Gilles Peskine449bd832023-01-11 14:50:10 +01001420 while (length--) {
1421 if (n == 0) {
1422 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1423 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001424 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001426
Gilles Peskine449bd832023-01-11 14:50:10 +01001427 for (i = 16; i > 0; i--) {
1428 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001429 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 }
1431 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001432 }
1433 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001434 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001435
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001437 }
1438
1439 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001440 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001441
Gilles Peskine7820a572021-07-07 21:08:28 +02001442exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001444}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001445#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001447#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001450/*
1451 * AES test vectors from:
1452 *
1453 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1454 */
Yanray Wang62c99912023-05-11 11:06:53 +08001455static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001456{
1457 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1458 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001459#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001460 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1461 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1462 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1463 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001464#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001465};
1466
Yanray Wang62c99912023-05-11 11:06:53 +08001467static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001468{
1469 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1470 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001471#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001472 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1473 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1474 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1475 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001476#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001477};
1478
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001479#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001480static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001481{
1482 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1483 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001484#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001485 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1486 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1487 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1488 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001489#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001490};
1491
Yanray Wang62c99912023-05-11 11:06:53 +08001492static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001493{
1494 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1495 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001496#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001497 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1498 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1499 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1500 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001501#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001502};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001503#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001505#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001506/*
1507 * AES-CFB128 test vectors from:
1508 *
1509 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1510 */
Yanray Wang62c99912023-05-11 11:06:53 +08001511static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001512{
1513 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1514 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001515#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001516 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1517 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1518 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1519 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1520 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1521 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1522 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001523#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001524};
1525
1526static const unsigned char aes_test_cfb128_iv[16] =
1527{
1528 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1529 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1530};
1531
1532static const unsigned char aes_test_cfb128_pt[64] =
1533{
1534 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1535 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1536 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1537 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1538 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1539 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1540 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1541 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1542};
1543
Yanray Wang62c99912023-05-11 11:06:53 +08001544static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001545{
1546 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1547 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1548 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1549 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1550 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1551 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1552 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1553 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001554#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001555 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1556 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1557 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1558 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1559 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1560 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1561 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1562 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1563 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1564 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1565 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1566 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1567 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1568 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1569 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1570 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001571#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001572};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001573#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001574
Simon Butcherad4e4932018-04-29 00:43:47 +01001575#if defined(MBEDTLS_CIPHER_MODE_OFB)
1576/*
1577 * AES-OFB test vectors from:
1578 *
Simon Butcher5db13622018-06-04 22:11:25 +01001579 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001580 */
Yanray Wang62c99912023-05-11 11:06:53 +08001581static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001582{
1583 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1584 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001585#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001586 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1587 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1588 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1589 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1590 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1591 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1592 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001593#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001594};
1595
1596static const unsigned char aes_test_ofb_iv[16] =
1597{
1598 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1599 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1600};
1601
1602static const unsigned char aes_test_ofb_pt[64] =
1603{
1604 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1605 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1606 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1607 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1608 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1609 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1610 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1611 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1612};
1613
Yanray Wang62c99912023-05-11 11:06:53 +08001614static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001615{
1616 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1617 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1618 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1619 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1620 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1621 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1622 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1623 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001624#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001625 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1626 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1627 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1628 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1629 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1630 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1631 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1632 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1633 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1634 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1635 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1636 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1637 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1638 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1639 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1640 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001641#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001642};
1643#endif /* MBEDTLS_CIPHER_MODE_OFB */
1644
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001645#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001646/*
1647 * AES-CTR test vectors from:
1648 *
1649 * http://www.faqs.org/rfcs/rfc3686.html
1650 */
1651
Yanray Wang62c99912023-05-11 11:06:53 +08001652static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001653{
1654 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1655 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1656 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1657 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1658 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1659 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1660};
1661
Yanray Wang62c99912023-05-11 11:06:53 +08001662static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001663{
1664 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1666 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1667 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1668 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1669 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1670};
1671
Yanray Wang62c99912023-05-11 11:06:53 +08001672static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001673{
1674 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1675 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001676 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1677 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1678 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1679 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1680
1681 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1682 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1683 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1684 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1685 0x20, 0x21, 0x22, 0x23 }
1686};
1687
Yanray Wang62c99912023-05-11 11:06:53 +08001688static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001689{
1690 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1691 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1692 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1693 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1694 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1695 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1696 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1697 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1698 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1699 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1700 0x25, 0xB2, 0x07, 0x2F }
1701};
1702
1703static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001704{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001705#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001706
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001707#if defined(MBEDTLS_CIPHER_MODE_XTS)
1708/*
1709 * AES-XTS test vectors from:
1710 *
1711 * IEEE P1619/D16 Annex B
1712 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1713 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1714 */
1715static const unsigned char aes_test_xts_key[][32] =
1716{
1717 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1721 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1722 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1723 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1724 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1725 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1726 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1727 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1728 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1729};
1730
1731static const unsigned char aes_test_xts_pt32[][32] =
1732{
1733 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1737 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1738 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1739 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1740 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1741 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1742 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1743 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1744 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1745};
1746
1747static const unsigned char aes_test_xts_ct32[][32] =
1748{
1749 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1750 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1751 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1752 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1753 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1754 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1755 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1756 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1757 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1758 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1759 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1760 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1761};
1762
1763static const unsigned char aes_test_xts_data_unit[][16] =
1764{
Gilles Peskine449bd832023-01-11 14:50:10 +01001765 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1767 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1769 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001771};
1772
1773#endif /* MBEDTLS_CIPHER_MODE_XTS */
1774
Paul Bakker5121ce52009-01-03 21:22:43 +00001775/*
1776 * Checkup routine
1777 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001778int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001779{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001780 int ret = 0, i, j, u, mode;
1781 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001782 unsigned char key[32];
1783 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001784 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001785#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1786 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001787 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001788#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001789#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001790 unsigned char prv[16];
1791#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001792#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1793 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001794 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001795#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001796#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001797 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001798#endif
1799#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001800 unsigned char nonce_counter[16];
1801 unsigned char stream_block[16];
1802#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001803 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001804
Gilles Peskine449bd832023-01-11 14:50:10 +01001805 memset(key, 0, 32);
1806 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001807
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001808 if (verbose != 0) {
1809#if defined(MBEDTLS_AES_ALT)
1810 mbedtls_printf(" AES note: alternative implementation.\n");
1811#else /* MBEDTLS_AES_ALT */
1812#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1813 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1814 mbedtls_printf(" AES note: using VIA Padlock.\n");
1815 } else
1816#endif
1817#if defined(MBEDTLS_AESNI_HAVE_CODE)
1818 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1819 mbedtls_printf(" AES note: using AESNI.\n");
1820 } else
1821#endif
1822#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1823 if (mbedtls_aesce_has_support()) {
1824 mbedtls_printf(" AES note: using AESCE.\n");
1825 } else
1826#endif
1827 mbedtls_printf(" AES note: built-in implementation.\n");
1828#endif /* MBEDTLS_AES_ALT */
1829 }
1830
Paul Bakker5121ce52009-01-03 21:22:43 +00001831 /*
1832 * ECB mode
1833 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001834 {
1835 static const int num_tests =
1836 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001837
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001838 for (i = 0; i < num_tests << 1; i++) {
1839 u = i >> 1;
1840 keybits = 128 + u * 64;
1841 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001842
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001843 if (verbose != 0) {
1844 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1845 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1846 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001847
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001848 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001849
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001850 if (mode == MBEDTLS_AES_DECRYPT) {
1851 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1852 aes_tests = aes_test_ecb_dec[u];
1853 } else {
1854 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1855 aes_tests = aes_test_ecb_enc[u];
1856 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001857
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001858 /*
1859 * AES-192 is an optional feature that may be unavailable when
1860 * there is an alternative underlying implementation i.e. when
1861 * MBEDTLS_AES_ALT is defined.
1862 */
1863 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1864 mbedtls_printf("skipped\n");
1865 continue;
1866 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001867 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001868 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001869
1870 for (j = 0; j < 10000; j++) {
1871 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1872 if (ret != 0) {
1873 goto exit;
1874 }
1875 }
1876
1877 if (memcmp(buf, aes_tests, 16) != 0) {
1878 ret = 1;
1879 goto exit;
1880 }
1881
1882 if (verbose != 0) {
1883 mbedtls_printf("passed\n");
1884 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001885 }
1886
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001888 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001890 }
1891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001892#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001893 /*
1894 * CBC mode
1895 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001896 {
1897 static const int num_tests =
1898 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001899
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001900 for (i = 0; i < num_tests << 1; i++) {
1901 u = i >> 1;
1902 keybits = 128 + u * 64;
1903 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001904
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001905 if (verbose != 0) {
1906 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1907 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001908 }
1909
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001910 memset(iv, 0, 16);
1911 memset(prv, 0, 16);
1912 memset(buf, 0, 16);
1913
1914 if (mode == MBEDTLS_AES_DECRYPT) {
1915 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1916 aes_tests = aes_test_cbc_dec[u];
1917 } else {
1918 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1919 aes_tests = aes_test_cbc_enc[u];
1920 }
1921
1922 /*
1923 * AES-192 is an optional feature that may be unavailable when
1924 * there is an alternative underlying implementation i.e. when
1925 * MBEDTLS_AES_ALT is defined.
1926 */
1927 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1928 mbedtls_printf("skipped\n");
1929 continue;
1930 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001931 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001932 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001933
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001934 for (j = 0; j < 10000; j++) {
1935 if (mode == MBEDTLS_AES_ENCRYPT) {
1936 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001937
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001938 memcpy(tmp, prv, 16);
1939 memcpy(prv, buf, 16);
1940 memcpy(buf, tmp, 16);
1941 }
1942
1943 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1944 if (ret != 0) {
1945 goto exit;
1946 }
1947
1948 }
1949
1950 if (memcmp(buf, aes_tests, 16) != 0) {
1951 ret = 1;
1952 goto exit;
1953 }
1954
1955 if (verbose != 0) {
1956 mbedtls_printf("passed\n");
1957 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001958 }
1959
Gilles Peskine449bd832023-01-11 14:50:10 +01001960 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001961 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001962 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001963 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001964#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001965
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001966#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001967 /*
1968 * CFB128 mode
1969 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001970 {
1971 static const int num_tests =
1972 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001973
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001974 for (i = 0; i < num_tests << 1; i++) {
1975 u = i >> 1;
1976 keybits = 128 + u * 64;
1977 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001978
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001979 if (verbose != 0) {
1980 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1981 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1982 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001983
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001984 memcpy(iv, aes_test_cfb128_iv, 16);
1985 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001986
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001987 offset = 0;
1988 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1989 /*
1990 * AES-192 is an optional feature that may be unavailable when
1991 * there is an alternative underlying implementation i.e. when
1992 * MBEDTLS_AES_ALT is defined.
1993 */
1994 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1995 mbedtls_printf("skipped\n");
1996 continue;
1997 } else if (ret != 0) {
1998 goto exit;
1999 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002000
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002001 if (mode == MBEDTLS_AES_DECRYPT) {
2002 memcpy(buf, aes_test_cfb128_ct[u], 64);
2003 aes_tests = aes_test_cfb128_pt;
2004 } else {
2005 memcpy(buf, aes_test_cfb128_pt, 64);
2006 aes_tests = aes_test_cfb128_ct[u];
2007 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002008
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002009 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2010 if (ret != 0) {
2011 goto exit;
2012 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002013
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002014 if (memcmp(buf, aes_tests, 64) != 0) {
2015 ret = 1;
2016 goto exit;
2017 }
2018
2019 if (verbose != 0) {
2020 mbedtls_printf("passed\n");
2021 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002022 }
2023
Gilles Peskine449bd832023-01-11 14:50:10 +01002024 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002025 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002027 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002028#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002029
Simon Butcherad4e4932018-04-29 00:43:47 +01002030#if defined(MBEDTLS_CIPHER_MODE_OFB)
2031 /*
2032 * OFB mode
2033 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002034 {
2035 static const int num_tests =
2036 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002037
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002038 for (i = 0; i < num_tests << 1; i++) {
2039 u = i >> 1;
2040 keybits = 128 + u * 64;
2041 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002042
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002043 if (verbose != 0) {
2044 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2045 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2046 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002047
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002048 memcpy(iv, aes_test_ofb_iv, 16);
2049 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002050
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002051 offset = 0;
2052 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2053 /*
2054 * AES-192 is an optional feature that may be unavailable when
2055 * there is an alternative underlying implementation i.e. when
2056 * MBEDTLS_AES_ALT is defined.
2057 */
2058 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2059 mbedtls_printf("skipped\n");
2060 continue;
2061 } else if (ret != 0) {
2062 goto exit;
2063 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002064
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002065 if (mode == MBEDTLS_AES_DECRYPT) {
2066 memcpy(buf, aes_test_ofb_ct[u], 64);
2067 aes_tests = aes_test_ofb_pt;
2068 } else {
2069 memcpy(buf, aes_test_ofb_pt, 64);
2070 aes_tests = aes_test_ofb_ct[u];
2071 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002072
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002073 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2074 if (ret != 0) {
2075 goto exit;
2076 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002077
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002078 if (memcmp(buf, aes_tests, 64) != 0) {
2079 ret = 1;
2080 goto exit;
2081 }
2082
2083 if (verbose != 0) {
2084 mbedtls_printf("passed\n");
2085 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002086 }
2087
Gilles Peskine449bd832023-01-11 14:50:10 +01002088 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002089 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002090 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002091 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002092#endif /* MBEDTLS_CIPHER_MODE_OFB */
2093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002094#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002095 /*
2096 * CTR mode
2097 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002098 {
2099 static const int num_tests =
2100 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002101
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002102 for (i = 0; i < num_tests << 1; i++) {
2103 u = i >> 1;
2104 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002106 if (verbose != 0) {
2107 mbedtls_printf(" AES-CTR-128 (%s): ",
2108 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2109 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002110
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002111 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2112 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002113
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002114 offset = 0;
2115 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2116 goto exit;
2117 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002118
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002119 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002120
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002121 if (mode == MBEDTLS_AES_DECRYPT) {
2122 memcpy(buf, aes_test_ctr_ct[u], len);
2123 aes_tests = aes_test_ctr_pt[u];
2124 } else {
2125 memcpy(buf, aes_test_ctr_pt[u], len);
2126 aes_tests = aes_test_ctr_ct[u];
2127 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002128
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002129 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2130 stream_block, buf, buf);
2131 if (ret != 0) {
2132 goto exit;
2133 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002134
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002135 if (memcmp(buf, aes_tests, len) != 0) {
2136 ret = 1;
2137 goto exit;
2138 }
2139
2140 if (verbose != 0) {
2141 mbedtls_printf("passed\n");
2142 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002144 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002145
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 if (verbose != 0) {
2147 mbedtls_printf("\n");
2148 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002149#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002150
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002151#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002152 /*
2153 * XTS mode
2154 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002155 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 static const int num_tests =
2157 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2158 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002159
Gilles Peskine449bd832023-01-11 14:50:10 +01002160 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002161
Gilles Peskine449bd832023-01-11 14:50:10 +01002162 for (i = 0; i < num_tests << 1; i++) {
2163 const unsigned char *data_unit;
2164 u = i >> 1;
2165 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002166
Gilles Peskine449bd832023-01-11 14:50:10 +01002167 if (verbose != 0) {
2168 mbedtls_printf(" AES-XTS-128 (%s): ",
2169 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2170 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002171
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 memset(key, 0, sizeof(key));
2173 memcpy(key, aes_test_xts_key[u], 32);
2174 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 if (mode == MBEDTLS_AES_DECRYPT) {
2179 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2180 if (ret != 0) {
2181 goto exit;
2182 }
2183 memcpy(buf, aes_test_xts_ct32[u], len);
2184 aes_tests = aes_test_xts_pt32[u];
2185 } else {
2186 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2187 if (ret != 0) {
2188 goto exit;
2189 }
2190 memcpy(buf, aes_test_xts_pt32[u], len);
2191 aes_tests = aes_test_xts_ct32[u];
2192 }
2193
2194
2195 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2196 buf, buf);
2197 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002198 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002199 }
2200
2201 if (memcmp(buf, aes_tests, len) != 0) {
2202 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002203 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002204 }
2205
2206 if (verbose != 0) {
2207 mbedtls_printf("passed\n");
2208 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002209 }
2210
Gilles Peskine449bd832023-01-11 14:50:10 +01002211 if (verbose != 0) {
2212 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002213 }
2214
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002216 }
2217#endif /* MBEDTLS_CIPHER_MODE_XTS */
2218
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002219 ret = 0;
2220
2221exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002222 if (ret != 0 && verbose != 0) {
2223 mbedtls_printf("failed\n");
2224 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002225
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002227
Gilles Peskine449bd832023-01-11 14:50:10 +01002228 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002229}
2230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002231#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002233#endif /* MBEDTLS_AES_C */