blob: 6a7e6102fd58e4ffdfde8739794a7e10a5e3e8ff [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;
566 case 192: ctx->nr = 12; break;
567 case 256: ctx->nr = 14; break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000569 }
570
Simon Butcher5201e412018-12-06 17:40:14 +0000571#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000573 aes_gen_tables();
574 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000575 }
576#endif
577
Gilles Peskine0de8f852023-03-16 17:14:59 +0100578 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100579 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000580
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100581#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
583 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
584 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100585#endif
586
Jerry Yu3f2fb712023-01-10 17:05:42 +0800587#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
588 if (mbedtls_aesce_has_support()) {
589 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
590 }
591#endif
592
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 for (i = 0; i < (keybits >> 5); i++) {
594 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000595 }
596
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000598 case 10:
599
Gilles Peskine449bd832023-01-11 14:50:10 +0100600 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000601 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
603 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
604 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
605 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000606
607 RK[5] = RK[1] ^ RK[4];
608 RK[6] = RK[2] ^ RK[5];
609 RK[7] = RK[3] ^ RK[6];
610 }
611 break;
612
613 case 12:
614
Gilles Peskine449bd832023-01-11 14:50:10 +0100615 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
618 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
619 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
620 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000621
622 RK[7] = RK[1] ^ RK[6];
623 RK[8] = RK[2] ^ RK[7];
624 RK[9] = RK[3] ^ RK[8];
625 RK[10] = RK[4] ^ RK[9];
626 RK[11] = RK[5] ^ RK[10];
627 }
628 break;
629
630 case 14:
631
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000633 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100634 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
635 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
636 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
637 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000638
639 RK[9] = RK[1] ^ RK[8];
640 RK[10] = RK[2] ^ RK[9];
641 RK[11] = RK[3] ^ RK[10];
642
643 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
645 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
646 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
647 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000648
649 RK[13] = RK[5] ^ RK[12];
650 RK[14] = RK[6] ^ RK[13];
651 RK[15] = RK[7] ^ RK[14];
652 }
653 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000654 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000655
Gilles Peskine449bd832023-01-11 14:50:10 +0100656 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000657}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200658#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000659
660/*
661 * AES key schedule (decryption)
662 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200663#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100664int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
665 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000666{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200667 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000669 uint32_t *RK;
670 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200671
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000673
Gilles Peskine0de8f852023-03-16 17:14:59 +0100674 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100675 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000676
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200677 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200679 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000681
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200682 ctx->nr = cty.nr;
683
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100684#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
686 mbedtls_aesni_inverse_key((unsigned char *) RK,
687 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200688 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100689 }
690#endif
691
Jerry Yue096da12023-01-10 17:07:01 +0800692#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
693 if (mbedtls_aesce_has_support()) {
694 mbedtls_aesce_inverse_key(
695 (unsigned char *) RK,
696 (const unsigned char *) (cty.buf + cty.rk_offset),
697 ctx->nr);
698 goto exit;
699 }
700#endif
701
Werner Lewisdd76ef32022-05-30 12:00:21 +0100702 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000703
704 *RK++ = *SK++;
705 *RK++ = *SK++;
706 *RK++ = *SK++;
707 *RK++ = *SK++;
708
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
710 for (j = 0; j < 4; j++, SK++) {
711 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
712 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
713 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
714 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000715 }
716 }
717
718 *RK++ = *SK++;
719 *RK++ = *SK++;
720 *RK++ = *SK++;
721 *RK++ = *SK++;
722
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200723exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100724 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000725
Gilles Peskine449bd832023-01-11 14:50:10 +0100726 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000727}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100728#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100729
730#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100731static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
732 unsigned int keybits,
733 const unsigned char **key1,
734 unsigned int *key1bits,
735 const unsigned char **key2,
736 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100737{
738 const unsigned int half_keybits = keybits / 2;
739 const unsigned int half_keybytes = half_keybits / 8;
740
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100742 case 256: break;
743 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100744 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100745 }
746
747 *key1bits = half_keybits;
748 *key2bits = half_keybits;
749 *key1 = &key[0];
750 *key2 = &key[half_keybytes];
751
752 return 0;
753}
754
Gilles Peskine449bd832023-01-11 14:50:10 +0100755int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
756 const unsigned char *key,
757 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100758{
Janos Follath24eed8d2019-11-22 13:21:35 +0000759 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100760 const unsigned char *key1, *key2;
761 unsigned int key1bits, key2bits;
762
Gilles Peskine449bd832023-01-11 14:50:10 +0100763 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
764 &key2, &key2bits);
765 if (ret != 0) {
766 return ret;
767 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100768
769 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100770 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
771 if (ret != 0) {
772 return ret;
773 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100774
775 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100776 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100777}
778
Gilles Peskine449bd832023-01-11 14:50:10 +0100779int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
780 const unsigned char *key,
781 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100782{
Janos Follath24eed8d2019-11-22 13:21:35 +0000783 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100784 const unsigned char *key1, *key2;
785 unsigned int key1bits, key2bits;
786
Gilles Peskine449bd832023-01-11 14:50:10 +0100787 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
788 &key2, &key2bits);
789 if (ret != 0) {
790 return ret;
791 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100792
793 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100794 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
795 if (ret != 0) {
796 return ret;
797 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100798
799 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100800 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100801}
802#endif /* MBEDTLS_CIPHER_MODE_XTS */
803
Gilles Peskine449bd832023-01-11 14:50:10 +0100804#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100805 do \
806 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100807 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
808 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
809 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
810 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100811 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
813 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
814 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
815 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100816 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100817 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
818 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
819 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
820 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100821 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
823 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
824 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
825 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
826 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000827
Gilles Peskine449bd832023-01-11 14:50:10 +0100828#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100829 do \
830 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
832 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
833 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
834 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100835 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
837 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
838 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
839 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100840 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100841 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
842 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
843 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
844 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100845 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100846 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
847 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
848 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
849 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
850 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000851
852/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200853 * AES-ECB block encryption
854 */
855#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100856int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
857 const unsigned char input[16],
858 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200859{
860 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100861 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100862 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200863 uint32_t X[4];
864 uint32_t Y[4];
865 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200866
Gilles Peskine449bd832023-01-11 14:50:10 +0100867 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
868 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
869 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
870 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200871
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
873 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]);
874 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 +0200875 }
876
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 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 +0200878
Gilles Peskine5197c662020-08-26 17:03:24 +0200879 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
881 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
882 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
883 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200884
Gilles Peskine5197c662020-08-26 17:03:24 +0200885 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
887 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
888 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
889 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200890
Gilles Peskine5197c662020-08-26 17:03:24 +0200891 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
894 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200896
Gilles Peskine5197c662020-08-26 17:03:24 +0200897 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100898 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
900 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
901 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200902
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
904 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
905 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
906 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000907
Gilles Peskine449bd832023-01-11 14:50:10 +0100908 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500909
Gilles Peskine449bd832023-01-11 14:50:10 +0100910 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200911}
912#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
913
914/*
915 * AES-ECB block decryption
916 */
917#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100918int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
919 const unsigned char input[16],
920 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200921{
922 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100923 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200925 uint32_t X[4];
926 uint32_t Y[4];
927 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200928
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
930 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
931 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
932 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200933
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
935 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]);
936 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 +0200937 }
938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 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 +0200940
Gilles Peskine5197c662020-08-26 17:03:24 +0200941 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
943 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
944 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
945 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200946
Gilles Peskine5197c662020-08-26 17:03:24 +0200947 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
949 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
950 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
951 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200952
Gilles Peskine5197c662020-08-26 17:03:24 +0200953 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
956 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
957 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200958
Gilles Peskine5197c662020-08-26 17:03:24 +0200959 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
962 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
963 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200964
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
966 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
967 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
968 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000969
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500971
Gilles Peskine449bd832023-01-11 14:50:10 +0100972 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200973}
974#endif /* !MBEDTLS_AES_DECRYPT_ALT */
975
Gilles Peskine0de8f852023-03-16 17:14:59 +0100976#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100977/* VIA Padlock and our intrinsics-based implementation of AESNI require
978 * the round keys to be aligned on a 16-byte boundary. We take care of this
979 * before creating them, but the AES context may have moved (this can happen
980 * if the library is called from a language with managed memory), and in later
981 * calls it might have a different alignment with respect to 16-byte memory.
982 * So we may need to realign.
983 */
984static void aes_maybe_realign(mbedtls_aes_context *ctx)
985{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100986 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
987 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100988 memmove(ctx->buf + new_offset, // new address
989 ctx->buf + ctx->rk_offset, // current address
990 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
991 ctx->rk_offset = new_offset;
992 }
993}
994#endif
995
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200996/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000997 * AES-ECB block encryption/decryption
998 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100999int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1000 int mode,
1001 const unsigned char input[16],
1002 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001003{
Gilles Peskine449bd832023-01-11 14:50:10 +01001004 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001005 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001006 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001007
Gilles Peskine0de8f852023-03-16 17:14:59 +01001008#if defined(MAY_NEED_TO_ALIGN)
1009 aes_maybe_realign(ctx);
1010#endif
1011
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001012#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001013 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1014 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1015 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001016#endif
1017
Jerry Yu2bb3d812023-01-10 17:38:26 +08001018#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1019 if (mbedtls_aesce_has_support()) {
1020 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1021 }
1022#endif
1023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001024#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001026 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001027 }
1028#endif
1029
Gilles Peskine449bd832023-01-11 14:50:10 +01001030 if (mode == MBEDTLS_AES_ENCRYPT) {
1031 return mbedtls_internal_aes_encrypt(ctx, input, output);
1032 } else {
1033 return mbedtls_internal_aes_decrypt(ctx, input, output);
1034 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001035}
1036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001038
1039#if defined(__ARM_NEON) && defined(__aarch64__)
1040 /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1041 * the result for the next block in CBC, and the cost of transferring that data from
1042 * NEON registers, it is faster to use the following on aarch64.
1043 * For 32-bit arm, NEON should be faster. */
1044#define CBC_XOR_16(r, a, b) do { \
1045 mbedtls_put_unaligned_uint64(r, \
1046 mbedtls_get_unaligned_uint64(a) ^ \
1047 mbedtls_get_unaligned_uint64(b)); \
1048 mbedtls_put_unaligned_uint64(r + 8, \
1049 mbedtls_get_unaligned_uint64(a + 8) ^ \
1050 mbedtls_get_unaligned_uint64(b + 8)); \
1051} while (0)
1052#else
1053#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1054#endif
1055
Paul Bakker5121ce52009-01-03 21:22:43 +00001056/*
1057 * AES-CBC buffer encryption/decryption
1058 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001059int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1060 int mode,
1061 size_t length,
1062 unsigned char iv[16],
1063 const unsigned char *input,
1064 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001065{
Gilles Peskine7820a572021-07-07 21:08:28 +02001066 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001067 unsigned char temp[16];
1068
Gilles Peskine449bd832023-01-11 14:50:10 +01001069 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001070 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001071 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001072
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 if (length % 16) {
1074 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1075 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001077#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 if (aes_padlock_ace > 0) {
1079 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1080 return 0;
1081 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001082
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001083 // If padlock data misaligned, we just fall back to
1084 // unaccelerated mode
1085 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001086 }
1087#endif
1088
Dave Rodgman906c63c2023-06-14 17:53:51 +01001089 const unsigned char *ivp = iv;
1090
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 if (mode == MBEDTLS_AES_DECRYPT) {
Dave Rodgman262d8ce2023-05-22 23:13:45 +01001092 while (length > 0) {
1093 memcpy(temp, input, 16);
Dave Rodgman9d1635e2023-06-04 12:55:15 -04001094 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
Dave Rodgman262d8ce2023-05-22 23:13:45 +01001095 if (ret != 0) {
1096 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001097 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001098 CBC_XOR_16(output, output, iv);
Dave Rodgman262d8ce2023-05-22 23:13:45 +01001099
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 memcpy(iv, temp, 16);
Dave Rodgman262d8ce2023-05-22 23:13:45 +01001101
1102 input += 16;
1103 output += 16;
1104 length -= 16;
Paul Bakker5121ce52009-01-03 21:22:43 +00001105 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001106 } else {
1107 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001108 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001109
Dave Rodgman906c63c2023-06-14 17:53:51 +01001110 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001112 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001113 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001114 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001115
1116 input += 16;
1117 output += 16;
1118 length -= 16;
1119 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001120 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001121 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001122 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001123
Gilles Peskine7820a572021-07-07 21:08:28 +02001124exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001125 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001126}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001127#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001128
Aorimn5f778012016-06-09 23:22:58 +02001129#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001130
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001131typedef unsigned char mbedtls_be128[16];
1132
1133/*
1134 * GF(2^128) multiplication function
1135 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001136 * This function multiplies a field element by x in the polynomial field
1137 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001138 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001139 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001140 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001141static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1142 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001143{
1144 uint64_t a, b, ra, rb;
1145
Gilles Peskine449bd832023-01-11 14:50:10 +01001146 a = MBEDTLS_GET_UINT64_LE(x, 0);
1147 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001148
Gilles Peskine449bd832023-01-11 14:50:10 +01001149 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1150 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001151
Gilles Peskine449bd832023-01-11 14:50:10 +01001152 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1153 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001154}
1155
Aorimn5f778012016-06-09 23:22:58 +02001156/*
1157 * AES-XTS buffer encryption/decryption
1158 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001159int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1160 int mode,
1161 size_t length,
1162 const unsigned char data_unit[16],
1163 const unsigned char *input,
1164 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001165{
Janos Follath24eed8d2019-11-22 13:21:35 +00001166 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001167 size_t blocks = length / 16;
1168 size_t leftover = length % 16;
1169 unsigned char tweak[16];
1170 unsigned char prev_tweak[16];
1171 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001172
Gilles Peskine449bd832023-01-11 14:50:10 +01001173 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001174 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001176
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001177 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001179 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 }
Aorimn5f778012016-06-09 23:22:58 +02001181
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001182 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001183 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001184 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 }
Aorimn5f778012016-06-09 23:22:58 +02001186
Jaeden Amerod82cd862018-04-28 15:02:45 +01001187 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1189 data_unit, tweak);
1190 if (ret != 0) {
1191 return ret;
1192 }
Aorimn5f778012016-06-09 23:22:58 +02001193
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001195 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001196 /* We are on the last block in a decrypt operation that has
1197 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001198 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001199 * the leftovers and then update the current tweak for use on this,
1200 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001201 memcpy(prev_tweak, tweak, sizeof(tweak));
1202 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001203 }
1204
Gilles Peskine449bd832023-01-11 14:50:10 +01001205 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1208 if (ret != 0) {
1209 return ret;
1210 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001211
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213
1214 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001216
1217 output += 16;
1218 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001219 }
1220
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001222 /* If we are on the leftover bytes in a decrypt operation, we need to
1223 * use the previous tweak for these bytes (as saved in prev_tweak). */
1224 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001225
Jaeden Amerod82cd862018-04-28 15:02:45 +01001226 /* We are now on the final part of the data unit, which doesn't divide
1227 * evenly by 16. It's time for ciphertext stealing. */
1228 size_t i;
1229 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001230
Jaeden Amerod82cd862018-04-28 15:02:45 +01001231 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001232 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001234 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001235 }
Aorimn5f778012016-06-09 23:22:58 +02001236
Dave Rodgman069e7f42022-11-24 19:37:26 +00001237 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001239
Jaeden Amerod82cd862018-04-28 15:02:45 +01001240 /* Copy ciphertext bytes from the previous block for input in this
1241 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001243
Gilles Peskine449bd832023-01-11 14:50:10 +01001244 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1245 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001246 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001247 }
Aorimn5f778012016-06-09 23:22:58 +02001248
Jaeden Amerod82cd862018-04-28 15:02:45 +01001249 /* Write the result back to the previous block, overriding the previous
1250 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001252 }
1253
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001255}
1256#endif /* MBEDTLS_CIPHER_MODE_XTS */
1257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001259/*
1260 * AES-CFB128 buffer encryption/decryption
1261 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001262int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1263 int mode,
1264 size_t length,
1265 size_t *iv_off,
1266 unsigned char iv[16],
1267 const unsigned char *input,
1268 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001269{
Paul Bakker27fdf462011-06-09 13:55:13 +00001270 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001271 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001272 size_t n;
1273
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001275 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001277
1278 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001279
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 if (n > 15) {
1281 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1282 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001283
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 if (mode == MBEDTLS_AES_DECRYPT) {
1285 while (length--) {
1286 if (n == 0) {
1287 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1288 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001289 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001291 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001292
1293 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 iv[n] = (unsigned char) c;
1296
Gilles Peskine449bd832023-01-11 14:50:10 +01001297 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001298 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 } else {
1300 while (length--) {
1301 if (n == 0) {
1302 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1303 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001304 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001306 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001307
Gilles Peskine449bd832023-01-11 14:50:10 +01001308 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001309
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001311 }
1312 }
1313
1314 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001315 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001316
Gilles Peskine7820a572021-07-07 21:08:28 +02001317exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001319}
Paul Bakker556efba2014-01-24 15:38:12 +01001320
1321/*
1322 * AES-CFB8 buffer encryption/decryption
1323 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001324int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1325 int mode,
1326 size_t length,
1327 unsigned char iv[16],
1328 const unsigned char *input,
1329 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001330{
Gilles Peskine7820a572021-07-07 21:08:28 +02001331 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001332 unsigned char c;
1333 unsigned char ov[17];
1334
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001336 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 }
1338 while (length--) {
1339 memcpy(ov, iv, 16);
1340 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1341 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001342 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 }
Paul Bakker556efba2014-01-24 15:38:12 +01001344
Gilles Peskine449bd832023-01-11 14:50:10 +01001345 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001346 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 }
Paul Bakker556efba2014-01-24 15:38:12 +01001348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001350
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001352 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 }
Paul Bakker556efba2014-01-24 15:38:12 +01001354
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001356 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001357 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001358
Gilles Peskine7820a572021-07-07 21:08:28 +02001359exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001360 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001361}
Simon Butcher76a5b222018-04-22 22:57:27 +01001362#endif /* MBEDTLS_CIPHER_MODE_CFB */
1363
1364#if defined(MBEDTLS_CIPHER_MODE_OFB)
1365/*
1366 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1367 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001368int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1369 size_t length,
1370 size_t *iv_off,
1371 unsigned char iv[16],
1372 const unsigned char *input,
1373 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001374{
Simon Butcherad4e4932018-04-29 00:43:47 +01001375 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001376 size_t n;
1377
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001378 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001379
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 if (n > 15) {
1381 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1382 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001383
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 while (length--) {
1385 if (n == 0) {
1386 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1387 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001388 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001389 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001390 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001391 *output++ = *input++ ^ iv[n];
1392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001394 }
1395
1396 *iv_off = n;
1397
Simon Butcherad4e4932018-04-29 00:43:47 +01001398exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001400}
1401#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001403#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001404/*
1405 * AES-CTR buffer encryption/decryption
1406 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001407int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1408 size_t length,
1409 size_t *nc_off,
1410 unsigned char nonce_counter[16],
1411 unsigned char stream_block[16],
1412 const unsigned char *input,
1413 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001414{
Paul Bakker369e14b2012-04-18 14:16:09 +00001415 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001416 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001417 size_t n;
1418
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001419 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001420
Gilles Peskine449bd832023-01-11 14:50:10 +01001421 if (n > 0x0F) {
1422 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1423 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 while (length--) {
1426 if (n == 0) {
1427 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1428 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001429 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001431
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 for (i = 16; i > 0; i--) {
1433 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001434 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 }
1436 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001437 }
1438 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001442 }
1443
1444 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001445 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001446
Gilles Peskine7820a572021-07-07 21:08:28 +02001447exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001449}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001450#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001455/*
1456 * AES test vectors from:
1457 *
1458 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1459 */
1460static const unsigned char aes_test_ecb_dec[3][16] =
1461{
1462 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1463 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1464 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1465 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1466 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1467 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1468};
1469
1470static const unsigned char aes_test_ecb_enc[3][16] =
1471{
1472 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1473 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1474 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1475 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1476 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1477 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1478};
1479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001481static const unsigned char aes_test_cbc_dec[3][16] =
1482{
1483 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1484 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1485 { 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 }
1489};
1490
1491static const unsigned char aes_test_cbc_enc[3][16] =
1492{
1493 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1494 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1495 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1496 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1497 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1498 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1499};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001502#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001503/*
1504 * AES-CFB128 test vectors from:
1505 *
1506 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1507 */
1508static const unsigned char aes_test_cfb128_key[3][32] =
1509{
1510 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1511 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1512 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1513 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1514 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1515 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1516 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1517 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1518 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1519};
1520
1521static const unsigned char aes_test_cfb128_iv[16] =
1522{
1523 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1524 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1525};
1526
1527static const unsigned char aes_test_cfb128_pt[64] =
1528{
1529 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1530 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1531 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1532 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1533 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1534 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1535 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1536 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1537};
1538
1539static const unsigned char aes_test_cfb128_ct[3][64] =
1540{
1541 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1542 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1543 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1544 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1545 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1546 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1547 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1548 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1549 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1550 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1551 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1552 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1553 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1554 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1555 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1556 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1557 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1558 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1559 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1560 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1561 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1562 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1563 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1564 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1565};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001566#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001567
Simon Butcherad4e4932018-04-29 00:43:47 +01001568#if defined(MBEDTLS_CIPHER_MODE_OFB)
1569/*
1570 * AES-OFB test vectors from:
1571 *
Simon Butcher5db13622018-06-04 22:11:25 +01001572 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001573 */
1574static const unsigned char aes_test_ofb_key[3][32] =
1575{
1576 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1577 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1578 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1579 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1580 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1581 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1582 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1583 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1584 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1585};
1586
1587static const unsigned char aes_test_ofb_iv[16] =
1588{
1589 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1590 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1591};
1592
1593static const unsigned char aes_test_ofb_pt[64] =
1594{
1595 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1596 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1597 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1598 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1599 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1600 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1601 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1602 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1603};
1604
1605static const unsigned char aes_test_ofb_ct[3][64] =
1606{
1607 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1608 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1609 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1610 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1611 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1612 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1613 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1614 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1615 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1616 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1617 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1618 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1619 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1620 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1621 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1622 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1623 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1624 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1625 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1626 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1627 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1628 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1629 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1630 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1631};
1632#endif /* MBEDTLS_CIPHER_MODE_OFB */
1633
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001635/*
1636 * AES-CTR test vectors from:
1637 *
1638 * http://www.faqs.org/rfcs/rfc3686.html
1639 */
1640
1641static const unsigned char aes_test_ctr_key[3][16] =
1642{
1643 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1644 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1645 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1646 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1647 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1648 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1649};
1650
1651static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1652{
1653 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1655 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1656 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1657 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1658 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1659};
1660
1661static const unsigned char aes_test_ctr_pt[3][48] =
1662{
1663 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1664 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1665
1666 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1667 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1668 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1669 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1670
1671 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1672 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1673 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1674 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1675 0x20, 0x21, 0x22, 0x23 }
1676};
1677
1678static const unsigned char aes_test_ctr_ct[3][48] =
1679{
1680 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1681 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1682 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1683 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1684 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1685 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1686 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1687 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1688 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1689 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1690 0x25, 0xB2, 0x07, 0x2F }
1691};
1692
1693static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001694{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001695#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001696
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001697#if defined(MBEDTLS_CIPHER_MODE_XTS)
1698/*
1699 * AES-XTS test vectors from:
1700 *
1701 * IEEE P1619/D16 Annex B
1702 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1703 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1704 */
1705static const unsigned char aes_test_xts_key[][32] =
1706{
1707 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1711 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1712 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1713 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1714 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1715 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1716 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1717 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1718 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1719};
1720
1721static const unsigned char aes_test_xts_pt32[][32] =
1722{
1723 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1727 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1728 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1729 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1730 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1731 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1732 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1733 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1734 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1735};
1736
1737static const unsigned char aes_test_xts_ct32[][32] =
1738{
1739 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1740 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1741 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1742 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1743 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1744 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1745 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1746 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1747 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1748 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1749 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1750 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1751};
1752
1753static const unsigned char aes_test_xts_data_unit[][16] =
1754{
Gilles Peskine449bd832023-01-11 14:50:10 +01001755 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1757 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1759 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001761};
1762
1763#endif /* MBEDTLS_CIPHER_MODE_XTS */
1764
Paul Bakker5121ce52009-01-03 21:22:43 +00001765/*
1766 * Checkup routine
1767 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001768int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001769{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001770 int ret = 0, i, j, u, mode;
1771 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001772 unsigned char key[32];
1773 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001774 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001775#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1776 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001777 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001778#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001779#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001780 unsigned char prv[16];
1781#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001782#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1783 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001784 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001785#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001786#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001787 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001788#endif
1789#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001790 unsigned char nonce_counter[16];
1791 unsigned char stream_block[16];
1792#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001793 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001794
Gilles Peskine449bd832023-01-11 14:50:10 +01001795 memset(key, 0, 32);
1796 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001797
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001798 if (verbose != 0) {
1799#if defined(MBEDTLS_AES_ALT)
1800 mbedtls_printf(" AES note: alternative implementation.\n");
1801#else /* MBEDTLS_AES_ALT */
1802#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1803 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1804 mbedtls_printf(" AES note: using VIA Padlock.\n");
1805 } else
1806#endif
1807#if defined(MBEDTLS_AESNI_HAVE_CODE)
1808 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1809 mbedtls_printf(" AES note: using AESNI.\n");
1810 } else
1811#endif
1812#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1813 if (mbedtls_aesce_has_support()) {
1814 mbedtls_printf(" AES note: using AESCE.\n");
1815 } else
1816#endif
1817 mbedtls_printf(" AES note: built-in implementation.\n");
1818#endif /* MBEDTLS_AES_ALT */
1819 }
1820
Paul Bakker5121ce52009-01-03 21:22:43 +00001821 /*
1822 * ECB mode
1823 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001824 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001825 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001826 keybits = 128 + u * 64;
1827 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001828
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 if (verbose != 0) {
1830 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1831 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001832 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001833
1834 memset(buf, 0, 16);
1835
1836 if (mode == MBEDTLS_AES_DECRYPT) {
1837 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1838 aes_tests = aes_test_ecb_dec[u];
1839 } else {
1840 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001841 aes_tests = aes_test_ecb_enc[u];
1842 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001843
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001844 /*
1845 * AES-192 is an optional feature that may be unavailable when
1846 * there is an alternative underlying implementation i.e. when
1847 * MBEDTLS_AES_ALT is defined.
1848 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1850 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001851 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001853 goto exit;
1854 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001855
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 for (j = 0; j < 10000; j++) {
1857 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1858 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001859 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001860 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001861 }
1862
Gilles Peskine449bd832023-01-11 14:50:10 +01001863 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001864 ret = 1;
1865 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001866 }
1867
Gilles Peskine449bd832023-01-11 14:50:10 +01001868 if (verbose != 0) {
1869 mbedtls_printf("passed\n");
1870 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001871 }
1872
Gilles Peskine449bd832023-01-11 14:50:10 +01001873 if (verbose != 0) {
1874 mbedtls_printf("\n");
1875 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001876
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001877#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001878 /*
1879 * CBC mode
1880 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001881 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001882 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001883 keybits = 128 + u * 64;
1884 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001885
Gilles Peskine449bd832023-01-11 14:50:10 +01001886 if (verbose != 0) {
1887 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1888 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001889 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001890
1891 memset(iv, 0, 16);
1892 memset(prv, 0, 16);
1893 memset(buf, 0, 16);
1894
1895 if (mode == MBEDTLS_AES_DECRYPT) {
1896 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1897 aes_tests = aes_test_cbc_dec[u];
1898 } else {
1899 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001900 aes_tests = aes_test_cbc_enc[u];
1901 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001902
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001903 /*
1904 * AES-192 is an optional feature that may be unavailable when
1905 * there is an alternative underlying implementation i.e. when
1906 * MBEDTLS_AES_ALT is defined.
1907 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001908 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1909 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001910 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001911 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001912 goto exit;
1913 }
1914
Gilles Peskine449bd832023-01-11 14:50:10 +01001915 for (j = 0; j < 10000; j++) {
1916 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001917 unsigned char tmp[16];
1918
Gilles Peskine449bd832023-01-11 14:50:10 +01001919 memcpy(tmp, prv, 16);
1920 memcpy(prv, buf, 16);
1921 memcpy(buf, tmp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001922 }
1923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1925 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001926 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001927 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001928
1929 }
1930
Gilles Peskine449bd832023-01-11 14:50:10 +01001931 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001932 ret = 1;
1933 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001934 }
1935
Gilles Peskine449bd832023-01-11 14:50:10 +01001936 if (verbose != 0) {
1937 mbedtls_printf("passed\n");
1938 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001939 }
1940
Gilles Peskine449bd832023-01-11 14:50:10 +01001941 if (verbose != 0) {
1942 mbedtls_printf("\n");
1943 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001944#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001945
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001946#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001947 /*
1948 * CFB128 mode
1949 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001950 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001951 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001952 keybits = 128 + u * 64;
1953 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001954
Gilles Peskine449bd832023-01-11 14:50:10 +01001955 if (verbose != 0) {
1956 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1957 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1958 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001959
Gilles Peskine449bd832023-01-11 14:50:10 +01001960 memcpy(iv, aes_test_cfb128_iv, 16);
1961 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001962
1963 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001965 /*
1966 * AES-192 is an optional feature that may be unavailable when
1967 * there is an alternative underlying implementation i.e. when
1968 * MBEDTLS_AES_ALT is defined.
1969 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001970 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1971 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001972 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001973 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001974 goto exit;
1975 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001976
Gilles Peskine449bd832023-01-11 14:50:10 +01001977 if (mode == MBEDTLS_AES_DECRYPT) {
1978 memcpy(buf, aes_test_cfb128_ct[u], 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001979 aes_tests = aes_test_cfb128_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01001980 } else {
1981 memcpy(buf, aes_test_cfb128_pt, 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001982 aes_tests = aes_test_cfb128_ct[u];
1983 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001984
Gilles Peskine449bd832023-01-11 14:50:10 +01001985 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
1986 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001987 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001988 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001989
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 if (memcmp(buf, aes_tests, 64) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001991 ret = 1;
1992 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001993 }
1994
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 if (verbose != 0) {
1996 mbedtls_printf("passed\n");
1997 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001998 }
1999
Gilles Peskine449bd832023-01-11 14:50:10 +01002000 if (verbose != 0) {
2001 mbedtls_printf("\n");
2002 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002003#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002004
Simon Butcherad4e4932018-04-29 00:43:47 +01002005#if defined(MBEDTLS_CIPHER_MODE_OFB)
2006 /*
2007 * OFB mode
2008 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 for (i = 0; i < 6; i++) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002010 u = i >> 1;
2011 keybits = 128 + u * 64;
2012 mode = i & 1;
2013
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 if (verbose != 0) {
2015 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2016 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2017 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002018
Gilles Peskine449bd832023-01-11 14:50:10 +01002019 memcpy(iv, aes_test_ofb_iv, 16);
2020 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002021
2022 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002023 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Simon Butcherad4e4932018-04-29 00:43:47 +01002024 /*
2025 * AES-192 is an optional feature that may be unavailable when
2026 * there is an alternative underlying implementation i.e. when
2027 * MBEDTLS_AES_ALT is defined.
2028 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002029 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2030 mbedtls_printf("skipped\n");
Simon Butcherad4e4932018-04-29 00:43:47 +01002031 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002032 } else if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002033 goto exit;
2034 }
2035
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 if (mode == MBEDTLS_AES_DECRYPT) {
2037 memcpy(buf, aes_test_ofb_ct[u], 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002038 aes_tests = aes_test_ofb_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 } else {
2040 memcpy(buf, aes_test_ofb_pt, 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002041 aes_tests = aes_test_ofb_ct[u];
2042 }
2043
Gilles Peskine449bd832023-01-11 14:50:10 +01002044 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2045 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002046 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002048
Gilles Peskine449bd832023-01-11 14:50:10 +01002049 if (memcmp(buf, aes_tests, 64) != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002050 ret = 1;
2051 goto exit;
2052 }
2053
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 if (verbose != 0) {
2055 mbedtls_printf("passed\n");
2056 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002057 }
2058
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 if (verbose != 0) {
2060 mbedtls_printf("\n");
2061 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002062#endif /* MBEDTLS_CIPHER_MODE_OFB */
2063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002064#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002065 /*
2066 * CTR mode
2067 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 for (i = 0; i < 6; i++) {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002069 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002070 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002071
Gilles Peskine449bd832023-01-11 14:50:10 +01002072 if (verbose != 0) {
2073 mbedtls_printf(" AES-CTR-128 (%s): ",
2074 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2075 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002076
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2078 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002079
2080 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002082 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002084
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002085 len = aes_test_ctr_len[u];
2086
Gilles Peskine449bd832023-01-11 14:50:10 +01002087 if (mode == MBEDTLS_AES_DECRYPT) {
2088 memcpy(buf, aes_test_ctr_ct[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002089 aes_tests = aes_test_ctr_pt[u];
Gilles Peskine449bd832023-01-11 14:50:10 +01002090 } else {
2091 memcpy(buf, aes_test_ctr_pt[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002092 aes_tests = aes_test_ctr_ct[u];
2093 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002094
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2096 stream_block, buf, buf);
2097 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002098 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002100
Gilles Peskine449bd832023-01-11 14:50:10 +01002101 if (memcmp(buf, aes_tests, len) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002102 ret = 1;
2103 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002104 }
2105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 if (verbose != 0) {
2107 mbedtls_printf("passed\n");
2108 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002109 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002110
Gilles Peskine449bd832023-01-11 14:50:10 +01002111 if (verbose != 0) {
2112 mbedtls_printf("\n");
2113 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002115
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002116#if defined(MBEDTLS_CIPHER_MODE_XTS)
2117 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 static const int num_tests =
2119 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2120 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002121
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 /*
2123 * XTS mode
2124 */
2125 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002126
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 for (i = 0; i < num_tests << 1; i++) {
2128 const unsigned char *data_unit;
2129 u = i >> 1;
2130 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002131
Gilles Peskine449bd832023-01-11 14:50:10 +01002132 if (verbose != 0) {
2133 mbedtls_printf(" AES-XTS-128 (%s): ",
2134 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2135 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002136
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 memset(key, 0, sizeof(key));
2138 memcpy(key, aes_test_xts_key[u], 32);
2139 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002140
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002142
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 if (mode == MBEDTLS_AES_DECRYPT) {
2144 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2145 if (ret != 0) {
2146 goto exit;
2147 }
2148 memcpy(buf, aes_test_xts_ct32[u], len);
2149 aes_tests = aes_test_xts_pt32[u];
2150 } else {
2151 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2152 if (ret != 0) {
2153 goto exit;
2154 }
2155 memcpy(buf, aes_test_xts_pt32[u], len);
2156 aes_tests = aes_test_xts_ct32[u];
2157 }
2158
2159
2160 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2161 buf, buf);
2162 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002163 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 }
2165
2166 if (memcmp(buf, aes_tests, len) != 0) {
2167 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002168 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002169 }
2170
2171 if (verbose != 0) {
2172 mbedtls_printf("passed\n");
2173 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002174 }
2175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 if (verbose != 0) {
2177 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002178 }
2179
Gilles Peskine449bd832023-01-11 14:50:10 +01002180 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002181 }
2182#endif /* MBEDTLS_CIPHER_MODE_XTS */
2183
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002184 ret = 0;
2185
2186exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002187 if (ret != 0 && verbose != 0) {
2188 mbedtls_printf("failed\n");
2189 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002190
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002192
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002194}
2195
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002196#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002198#endif /* MBEDTLS_AES_C */