blob: 39cf332b86395e5ec94e5b6f33d92941771d90fe [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
21 *
22 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
23 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
31
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030033#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_PADLOCK_C)
Chris Jones16dbaeb2021-03-09 17:47:55 +000037#include "padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000040#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080042#if defined(MBEDTLS_AESCE_C)
43#include "aesce.h"
44#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020049
Gilles Peskine0f454e42023-03-16 14:58:46 +010050#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +000051static int aes_padlock_ace = -1;
52#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * Forward S-box
57 */
58static const unsigned char FSb[256] =
59{
60 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
61 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
62 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
63 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
64 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
65 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
66 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
67 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
68 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
69 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
70 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
71 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
72 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
73 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
74 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
75 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
76 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
77 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
78 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
79 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
80 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
81 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
82 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
83 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
84 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
85 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
86 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
87 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
88 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
89 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
90 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
91 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
92};
93
94/*
95 * Forward tables
96 */
97#define FT \
98\
Gilles Peskine449bd832023-01-11 14:50:10 +010099 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
100 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
101 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
102 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
103 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
104 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
105 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
106 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
107 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
108 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
109 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
110 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
111 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
112 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
113 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
114 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
115 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
116 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
117 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
118 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
119 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
120 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
121 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
122 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
123 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
124 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
125 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
126 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
127 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
128 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
129 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
130 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
131 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
132 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
133 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
134 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
135 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
136 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
137 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
138 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
139 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
140 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
141 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
142 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
143 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
144 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
145 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
146 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
147 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
148 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
149 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
150 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
151 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
152 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
153 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
154 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
155 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
156 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
157 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
158 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
159 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
160 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
161 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
162 V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000165static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000166#undef V
167
Hanno Beckerad049a92017-06-19 16:31:54 +0100168#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000171static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000172#undef V
173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000175static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000176#undef V
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000179static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000180#undef V
181
Hanno Becker177d3cf2017-06-07 15:52:48 +0100182#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200183
Paul Bakker5121ce52009-01-03 21:22:43 +0000184#undef FT
185
186/*
187 * Reverse S-box
188 */
189static const unsigned char RSb[256] =
190{
191 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
192 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
193 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
194 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
195 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
196 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
197 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
198 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
199 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
200 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
201 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
202 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
203 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
204 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
205 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
206 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
207 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
208 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
209 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
210 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
211 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
212 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
213 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
214 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
215 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
216 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
217 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
218 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
219 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
220 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
221 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
222 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
223};
224
225/*
226 * Reverse tables
227 */
228#define RT \
229\
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
231 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
232 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
233 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
234 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
235 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
236 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
237 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
238 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
239 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
240 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
241 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
242 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
243 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
244 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
245 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
246 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
247 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
248 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
249 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
250 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
251 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
252 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
253 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
254 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
255 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
256 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
257 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
258 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
259 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
260 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
261 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
262 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
263 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
264 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
265 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
266 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
267 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
268 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
269 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
270 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
271 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
272 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
273 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
274 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
275 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
276 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
277 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
278 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
279 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
280 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
281 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
282 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
283 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
284 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
285 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
286 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
287 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
288 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
289 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
290 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
291 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
292 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
293 V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000294
Gilles Peskine449bd832023-01-11 14:50:10 +0100295#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000296static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000297#undef V
298
Hanno Beckerad049a92017-06-19 16:31:54 +0100299#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000302static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000303#undef V
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000307#undef V
308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000311#undef V
312
Hanno Becker177d3cf2017-06-07 15:52:48 +0100313#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200314
Paul Bakker5121ce52009-01-03 21:22:43 +0000315#undef RT
316
317/*
318 * Round constants
319 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000321{
322 0x00000001, 0x00000002, 0x00000004, 0x00000008,
323 0x00000010, 0x00000020, 0x00000040, 0x00000080,
324 0x0000001B, 0x00000036
325};
326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
329/*
330 * Forward S-box & tables
331 */
332static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200333static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100334#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200335static uint32_t FT1[256];
336static uint32_t FT2[256];
337static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100338#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Reverse S-box & tables
342 */
343static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000344static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100345#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346static uint32_t RT1[256];
347static uint32_t RT2[256];
348static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100349#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
351/*
352 * Round constants
353 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
356/*
357 * Tables generation code
358 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
360#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
361#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363static int aes_init_done = 0;
364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000366{
367 int i, x, y, z;
368 int pow[256];
369 int log[256];
370
371 /*
372 * compute pow and log tables over GF(2^8)
373 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 pow[i] = x;
376 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000378 }
379
380 /*
381 * calculate the round constants
382 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000384 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 }
387
388 /*
389 * generate the forward and reverse S-boxes
390 */
391 FSb[0x00] = 0x63;
392 RSb[0x63] = 0x00;
393
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000395 x = pow[255 - log[i]];
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
398 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
399 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
400 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000401 x ^= y ^ 0x63;
402
403 FSb[i] = (unsigned char) x;
404 RSb[x] = (unsigned char) i;
405 }
406
407 /*
408 * generate the forward and reverse tables
409 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000411 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 y = MBEDTLS_BYTE_0(XTIME(x));
413 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 FT0[i] = ((uint32_t) y) ^
416 ((uint32_t) x << 8) ^
417 ((uint32_t) x << 16) ^
418 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Hanno Beckerad049a92017-06-19 16:31:54 +0100420#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 FT1[i] = ROTL8(FT0[i]);
422 FT2[i] = ROTL8(FT1[i]);
423 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100424#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000425
426 x = RSb[i];
427
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
429 ((uint32_t) MUL(0x09, x) << 8) ^
430 ((uint32_t) MUL(0x0D, x) << 16) ^
431 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
Hanno Beckerad049a92017-06-19 16:31:54 +0100433#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 RT1[i] = ROTL8(RT0[i]);
435 RT2[i] = ROTL8(RT1[i]);
436 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100437#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000438 }
439}
440
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200441#undef ROTL8
442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Hanno Beckerad049a92017-06-19 16:31:54 +0100445#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
448#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
449#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200450
451#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100452#define AES_RT1(idx) ROTL8(RT0[idx])
453#define AES_RT2(idx) ROTL16(RT0[idx])
454#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200455
456#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100457#define AES_FT1(idx) ROTL8(FT0[idx])
458#define AES_FT2(idx) ROTL16(FT0[idx])
459#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200460
Hanno Becker177d3cf2017-06-07 15:52:48 +0100461#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200462
463#define AES_RT0(idx) RT0[idx]
464#define AES_RT1(idx) RT1[idx]
465#define AES_RT2(idx) RT2[idx]
466#define AES_RT3(idx) RT3[idx]
467
468#define AES_FT0(idx) FT0[idx]
469#define AES_FT1(idx) FT1[idx]
470#define AES_FT2(idx) FT2[idx]
471#define AES_FT3(idx) FT3[idx]
472
Hanno Becker177d3cf2017-06-07 15:52:48 +0100473#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200474
Gilles Peskine449bd832023-01-11 14:50:10 +0100475void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200476{
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200478}
479
Gilles Peskine449bd832023-01-11 14:50:10 +0100480void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200481{
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487}
488
Jaeden Amero9366feb2018-05-29 18:55:17 +0100489#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100490void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100491{
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 mbedtls_aes_init(&ctx->crypt);
493 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100494}
495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100497{
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100499 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 }
Simon Butcher5201e412018-12-06 17:40:14 +0000501
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 mbedtls_aes_free(&ctx->crypt);
503 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100504}
505#endif /* MBEDTLS_CIPHER_MODE_XTS */
506
Gilles Peskine0de8f852023-03-16 17:14:59 +0100507/* Some implementations need the round keys to be aligned.
508 * Return an offset to be added to buf, such that (buf + offset) is
509 * correctly aligned.
510 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
511 * i.e. an offset of 1 means 4 bytes and so on.
512 */
513#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100514 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100515#define MAY_NEED_TO_ALIGN
516#endif
517static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
518{
519#if defined(MAY_NEED_TO_ALIGN)
520 int align_16_bytes = 0;
521
522#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
523 if (aes_padlock_ace == -1) {
524 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
525 }
526 if (aes_padlock_ace) {
527 align_16_bytes = 1;
528 }
529#endif
530
Gilles Peskine9c682e72023-03-16 17:21:33 +0100531#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100532 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
533 align_16_bytes = 1;
534 }
535#endif
536
537 if (align_16_bytes) {
538 /* These implementations needs 16-byte alignment
539 * for the round key array. */
540 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
541 if (delta == 0) {
542 return 0;
543 } else {
544 return 4 - delta; // 16 bytes = 4 uint32_t
545 }
546 }
547#else /* MAY_NEED_TO_ALIGN */
548 (void) buf;
549#endif /* MAY_NEED_TO_ALIGN */
550
551 return 0;
552}
553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554/*
555 * AES key schedule (encryption)
556 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200557#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100558int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
559 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000560{
Paul Bakker23986e52011-04-24 08:57:21 +0000561 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000562 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
Gilles Peskine449bd832023-01-11 14:50:10 +0100564 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000565 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800566#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000567 case 192: ctx->nr = 12; break;
568 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800569#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 }
572
Simon Butcher5201e412018-12-06 17:40:14 +0000573#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000575 aes_gen_tables();
576 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000577 }
578#endif
579
Gilles Peskine0de8f852023-03-16 17:14:59 +0100580 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100581 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100583#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
585 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
586 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100587#endif
588
Jerry Yu3f2fb712023-01-10 17:05:42 +0800589#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
590 if (mbedtls_aesce_has_support()) {
591 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
592 }
593#endif
594
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 for (i = 0; i < (keybits >> 5); i++) {
596 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 }
598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000600 case 10:
601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
605 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
606 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
607 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000608
609 RK[5] = RK[1] ^ RK[4];
610 RK[6] = RK[2] ^ RK[5];
611 RK[7] = RK[3] ^ RK[6];
612 }
613 break;
614
Arto Kinnunen732ca322023-04-14 14:26:10 +0800615#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 case 12:
617
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
621 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
622 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
623 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625 RK[7] = RK[1] ^ RK[6];
626 RK[8] = RK[2] ^ RK[7];
627 RK[9] = RK[3] ^ RK[8];
628 RK[10] = RK[4] ^ RK[9];
629 RK[11] = RK[5] ^ RK[10];
630 }
631 break;
632
633 case 14:
634
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
638 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
639 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
640 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[9] = RK[1] ^ RK[8];
643 RK[10] = RK[2] ^ RK[9];
644 RK[11] = RK[3] ^ RK[10];
645
646 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
648 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[13] = RK[5] ^ RK[12];
653 RK[14] = RK[6] ^ RK[13];
654 RK[15] = RK[7] ^ RK[14];
655 }
656 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800657#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000658 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000659
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000661}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200662#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
664/*
665 * AES key schedule (decryption)
666 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200667#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100668int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
669 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000670{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200671 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000673 uint32_t *RK;
674 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200675
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000677
Gilles Peskine0de8f852023-03-16 17:14:59 +0100678 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100679 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000680
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200681 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200683 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100684 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000685
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200686 ctx->nr = cty.nr;
687
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100688#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100689 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
690 mbedtls_aesni_inverse_key((unsigned char *) RK,
691 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200692 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100693 }
694#endif
695
Jerry Yue096da12023-01-10 17:07:01 +0800696#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
697 if (mbedtls_aesce_has_support()) {
698 mbedtls_aesce_inverse_key(
699 (unsigned char *) RK,
700 (const unsigned char *) (cty.buf + cty.rk_offset),
701 ctx->nr);
702 goto exit;
703 }
704#endif
705
Werner Lewisdd76ef32022-05-30 12:00:21 +0100706 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
708 *RK++ = *SK++;
709 *RK++ = *SK++;
710 *RK++ = *SK++;
711 *RK++ = *SK++;
712
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
714 for (j = 0; j < 4; j++, SK++) {
715 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
716 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
717 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
718 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000719 }
720 }
721
722 *RK++ = *SK++;
723 *RK++ = *SK++;
724 *RK++ = *SK++;
725 *RK++ = *SK++;
726
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200727exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000729
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000731}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100732#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100733
734#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100735static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
736 unsigned int keybits,
737 const unsigned char **key1,
738 unsigned int *key1bits,
739 const unsigned char **key2,
740 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100741{
742 const unsigned int half_keybits = keybits / 2;
743 const unsigned int half_keybytes = half_keybits / 8;
744
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100746 case 256: break;
747 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100749 }
750
751 *key1bits = half_keybits;
752 *key2bits = half_keybits;
753 *key1 = &key[0];
754 *key2 = &key[half_keybytes];
755
756 return 0;
757}
758
Gilles Peskine449bd832023-01-11 14:50:10 +0100759int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
760 const unsigned char *key,
761 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100762{
Janos Follath24eed8d2019-11-22 13:21:35 +0000763 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100764 const unsigned char *key1, *key2;
765 unsigned int key1bits, key2bits;
766
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
768 &key2, &key2bits);
769 if (ret != 0) {
770 return ret;
771 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772
773 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
775 if (ret != 0) {
776 return ret;
777 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100778
779 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100781}
782
Gilles Peskine449bd832023-01-11 14:50:10 +0100783int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
784 const unsigned char *key,
785 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100786{
Janos Follath24eed8d2019-11-22 13:21:35 +0000787 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788 const unsigned char *key1, *key2;
789 unsigned int key1bits, key2bits;
790
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
792 &key2, &key2bits);
793 if (ret != 0) {
794 return ret;
795 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100796
797 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
799 if (ret != 0) {
800 return ret;
801 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100802
803 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100805}
806#endif /* MBEDTLS_CIPHER_MODE_XTS */
807
Gilles Peskine449bd832023-01-11 14:50:10 +0100808#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100809 do \
810 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100811 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
812 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
813 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
814 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100815 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100816 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
817 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
818 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
819 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100820 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
822 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
823 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
824 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100825 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
827 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
828 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
829 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
830 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100833 do \
834 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100835 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
836 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
837 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
838 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100839 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
841 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
842 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
843 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100844 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
846 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
847 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
848 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100849 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
851 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
852 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
853 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
854 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000855
856/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200857 * AES-ECB block encryption
858 */
859#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100860int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
861 const unsigned char input[16],
862 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200863{
864 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100865 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200867 uint32_t X[4];
868 uint32_t Y[4];
869 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200870
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
872 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
873 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
874 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200875
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
877 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
878 AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200879 }
880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200882
Gilles Peskine5197c662020-08-26 17:03:24 +0200883 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
885 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
886 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
887 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200888
Gilles Peskine5197c662020-08-26 17:03:24 +0200889 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
891 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
892 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
908 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
909 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
910 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000911
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200915}
916#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
917
918/*
919 * AES-ECB block decryption
920 */
921#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100922int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
923 const unsigned char input[16],
924 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925{
926 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100927 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200929 uint32_t X[4];
930 uint32_t Y[4];
931 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200932
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
934 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
935 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
936 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
939 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
940 AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200941 }
942
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200944
Gilles Peskine5197c662020-08-26 17:03:24 +0200945 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
947 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
948 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
949 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200950
Gilles Peskine5197c662020-08-26 17:03:24 +0200951 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
970 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
971 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
972 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000973
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500975
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200977}
978#endif /* !MBEDTLS_AES_DECRYPT_ALT */
979
Gilles Peskine0de8f852023-03-16 17:14:59 +0100980#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100981/* VIA Padlock and our intrinsics-based implementation of AESNI require
982 * the round keys to be aligned on a 16-byte boundary. We take care of this
983 * before creating them, but the AES context may have moved (this can happen
984 * if the library is called from a language with managed memory), and in later
985 * calls it might have a different alignment with respect to 16-byte memory.
986 * So we may need to realign.
987 */
988static void aes_maybe_realign(mbedtls_aes_context *ctx)
989{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100990 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
991 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100992 memmove(ctx->buf + new_offset, // new address
993 ctx->buf + ctx->rk_offset, // current address
994 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
995 ctx->rk_offset = new_offset;
996 }
997}
998#endif
999
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001000/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001001 * AES-ECB block encryption/decryption
1002 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001003int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1004 int mode,
1005 const unsigned char input[16],
1006 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001007{
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001009 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001011
Gilles Peskine0de8f852023-03-16 17:14:59 +01001012#if defined(MAY_NEED_TO_ALIGN)
1013 aes_maybe_realign(ctx);
1014#endif
1015
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001016#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1018 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1019 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001020#endif
1021
Jerry Yu2bb3d812023-01-10 17:38:26 +08001022#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1023 if (mbedtls_aesce_has_support()) {
1024 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1025 }
1026#endif
1027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001030 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001031 }
1032#endif
1033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 if (mode == MBEDTLS_AES_ENCRYPT) {
1035 return mbedtls_internal_aes_encrypt(ctx, input, output);
1036 } else {
1037 return mbedtls_internal_aes_decrypt(ctx, input, output);
1038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001039}
1040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001042/*
1043 * AES-CBC buffer encryption/decryption
1044 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001045int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1046 int mode,
1047 size_t length,
1048 unsigned char iv[16],
1049 const unsigned char *input,
1050 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001051{
Gilles Peskine7820a572021-07-07 21:08:28 +02001052 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001053 unsigned char temp[16];
1054
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001056 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001058
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 if (length % 16) {
1060 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1061 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001063#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 if (aes_padlock_ace > 0) {
1065 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1066 return 0;
1067 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001068
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001069 // If padlock data misaligned, we just fall back to
1070 // unaccelerated mode
1071 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 }
1073#endif
1074
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 if (mode == MBEDTLS_AES_DECRYPT) {
1076 while (length > 0) {
1077 memcpy(temp, input, 16);
1078 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1079 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001080 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001082
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 mbedtls_xor(output, output, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001084
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001086
1087 input += 16;
1088 output += 16;
1089 length -= 16;
1090 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 } else {
1092 while (length > 0) {
1093 mbedtls_xor(output, input, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001094
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1096 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001097 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001098 }
1099 memcpy(iv, output, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001100
1101 input += 16;
1102 output += 16;
1103 length -= 16;
1104 }
1105 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001106 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001107
Gilles Peskine7820a572021-07-07 21:08:28 +02001108exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001109 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001110}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001111#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001112
Aorimn5f778012016-06-09 23:22:58 +02001113#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001114
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001115typedef unsigned char mbedtls_be128[16];
1116
1117/*
1118 * GF(2^128) multiplication function
1119 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001120 * This function multiplies a field element by x in the polynomial field
1121 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001122 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001123 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001124 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001125static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1126 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001127{
1128 uint64_t a, b, ra, rb;
1129
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 a = MBEDTLS_GET_UINT64_LE(x, 0);
1131 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001132
Gilles Peskine449bd832023-01-11 14:50:10 +01001133 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1134 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001135
Gilles Peskine449bd832023-01-11 14:50:10 +01001136 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1137 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001138}
1139
Aorimn5f778012016-06-09 23:22:58 +02001140/*
1141 * AES-XTS buffer encryption/decryption
1142 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001143int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1144 int mode,
1145 size_t length,
1146 const unsigned char data_unit[16],
1147 const unsigned char *input,
1148 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001149{
Janos Follath24eed8d2019-11-22 13:21:35 +00001150 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001151 size_t blocks = length / 16;
1152 size_t leftover = length % 16;
1153 unsigned char tweak[16];
1154 unsigned char prev_tweak[16];
1155 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001158 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001160
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001161 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001163 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001164 }
Aorimn5f778012016-06-09 23:22:58 +02001165
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001166 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001168 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 }
Aorimn5f778012016-06-09 23:22:58 +02001170
Jaeden Amerod82cd862018-04-28 15:02:45 +01001171 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001172 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1173 data_unit, tweak);
1174 if (ret != 0) {
1175 return ret;
1176 }
Aorimn5f778012016-06-09 23:22:58 +02001177
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 while (blocks--) {
1179 if (leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001180 /* We are on the last block in a decrypt operation that has
1181 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001182 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001183 * the leftovers and then update the current tweak for use on this,
1184 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 memcpy(prev_tweak, tweak, sizeof(tweak));
1186 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001187 }
1188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001190
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1192 if (ret != 0) {
1193 return ret;
1194 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001195
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001197
1198 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001200
1201 output += 16;
1202 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001203 }
1204
Gilles Peskine449bd832023-01-11 14:50:10 +01001205 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206 /* If we are on the leftover bytes in a decrypt operation, we need to
1207 * use the previous tweak for these bytes (as saved in prev_tweak). */
1208 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001209
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210 /* We are now on the final part of the data unit, which doesn't divide
1211 * evenly by 16. It's time for ciphertext stealing. */
1212 size_t i;
1213 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001214
Jaeden Amerod82cd862018-04-28 15:02:45 +01001215 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001216 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001219 }
Aorimn5f778012016-06-09 23:22:58 +02001220
Dave Rodgman069e7f42022-11-24 19:37:26 +00001221 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001223
Jaeden Amerod82cd862018-04-28 15:02:45 +01001224 /* Copy ciphertext bytes from the previous block for input in this
1225 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1229 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001230 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 }
Aorimn5f778012016-06-09 23:22:58 +02001232
Jaeden Amerod82cd862018-04-28 15:02:45 +01001233 /* Write the result back to the previous block, overriding the previous
1234 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001236 }
1237
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001239}
1240#endif /* MBEDTLS_CIPHER_MODE_XTS */
1241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001243/*
1244 * AES-CFB128 buffer encryption/decryption
1245 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001246int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1247 int mode,
1248 size_t length,
1249 size_t *iv_off,
1250 unsigned char iv[16],
1251 const unsigned char *input,
1252 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001253{
Paul Bakker27fdf462011-06-09 13:55:13 +00001254 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001255 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001256 size_t n;
1257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001259 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001261
1262 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001263
Gilles Peskine449bd832023-01-11 14:50:10 +01001264 if (n > 15) {
1265 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1266 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001267
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 if (mode == MBEDTLS_AES_DECRYPT) {
1269 while (length--) {
1270 if (n == 0) {
1271 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1272 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001273 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001275 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001276
1277 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001279 iv[n] = (unsigned char) c;
1280
Gilles Peskine449bd832023-01-11 14:50:10 +01001281 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001282 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001283 } else {
1284 while (length--) {
1285 if (n == 0) {
1286 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1287 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001288 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001290 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001291
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 }
1296 }
1297
1298 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001299 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001300
Gilles Peskine7820a572021-07-07 21:08:28 +02001301exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001302 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001303}
Paul Bakker556efba2014-01-24 15:38:12 +01001304
1305/*
1306 * AES-CFB8 buffer encryption/decryption
1307 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001308int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1309 int mode,
1310 size_t length,
1311 unsigned char iv[16],
1312 const unsigned char *input,
1313 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001314{
Gilles Peskine7820a572021-07-07 21:08:28 +02001315 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001316 unsigned char c;
1317 unsigned char ov[17];
1318
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001320 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001321 }
1322 while (length--) {
1323 memcpy(ov, iv, 16);
1324 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1325 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001326 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 }
Paul Bakker556efba2014-01-24 15:38:12 +01001328
Gilles Peskine449bd832023-01-11 14:50:10 +01001329 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001330 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 }
Paul Bakker556efba2014-01-24 15:38:12 +01001332
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001334
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001336 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 }
Paul Bakker556efba2014-01-24 15:38:12 +01001338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001340 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001341 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001342
Gilles Peskine7820a572021-07-07 21:08:28 +02001343exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001345}
Simon Butcher76a5b222018-04-22 22:57:27 +01001346#endif /* MBEDTLS_CIPHER_MODE_CFB */
1347
1348#if defined(MBEDTLS_CIPHER_MODE_OFB)
1349/*
1350 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1351 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001352int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1353 size_t length,
1354 size_t *iv_off,
1355 unsigned char iv[16],
1356 const unsigned char *input,
1357 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001358{
Simon Butcherad4e4932018-04-29 00:43:47 +01001359 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001360 size_t n;
1361
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001362 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001363
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 if (n > 15) {
1365 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1366 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001367
Gilles Peskine449bd832023-01-11 14:50:10 +01001368 while (length--) {
1369 if (n == 0) {
1370 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1371 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001372 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001374 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001375 *output++ = *input++ ^ iv[n];
1376
Gilles Peskine449bd832023-01-11 14:50:10 +01001377 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001378 }
1379
1380 *iv_off = n;
1381
Simon Butcherad4e4932018-04-29 00:43:47 +01001382exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001384}
1385#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001388/*
1389 * AES-CTR buffer encryption/decryption
1390 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001391int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1392 size_t length,
1393 size_t *nc_off,
1394 unsigned char nonce_counter[16],
1395 unsigned char stream_block[16],
1396 const unsigned char *input,
1397 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001398{
Paul Bakker369e14b2012-04-18 14:16:09 +00001399 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001400 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001401 size_t n;
1402
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001403 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001404
Gilles Peskine449bd832023-01-11 14:50:10 +01001405 if (n > 0x0F) {
1406 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1407 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 while (length--) {
1410 if (n == 0) {
1411 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1412 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001413 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001415
Gilles Peskine449bd832023-01-11 14:50:10 +01001416 for (i = 16; i > 0; i--) {
1417 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001418 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 }
1420 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001421 }
1422 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001426 }
1427
1428 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001429 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001430
Gilles Peskine7820a572021-07-07 21:08:28 +02001431exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001433}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001434#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001435
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001436#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001439/*
1440 * AES test vectors from:
1441 *
1442 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1443 */
1444static const unsigned char aes_test_ecb_dec[3][16] =
1445{
1446 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1447 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1448 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1449 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1450 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1451 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1452};
1453
1454static const unsigned char aes_test_ecb_enc[3][16] =
1455{
1456 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1457 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1458 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1459 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1460 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1461 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1462};
1463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001465static const unsigned char aes_test_cbc_dec[3][16] =
1466{
1467 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1468 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1469 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1470 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1471 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1472 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1473};
1474
1475static const unsigned char aes_test_cbc_enc[3][16] =
1476{
1477 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1478 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1479 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1480 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1481 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1482 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1483};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001484#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001486#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001487/*
1488 * AES-CFB128 test vectors from:
1489 *
1490 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1491 */
1492static const unsigned char aes_test_cfb128_key[3][32] =
1493{
1494 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1495 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1496 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1497 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1498 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1499 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1500 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1501 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1502 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1503};
1504
1505static const unsigned char aes_test_cfb128_iv[16] =
1506{
1507 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1508 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1509};
1510
1511static const unsigned char aes_test_cfb128_pt[64] =
1512{
1513 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1514 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1515 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1516 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1517 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1518 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1519 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1520 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1521};
1522
1523static const unsigned char aes_test_cfb128_ct[3][64] =
1524{
1525 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1526 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1527 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1528 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1529 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1530 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1531 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1532 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1533 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1534 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1535 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1536 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1537 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1538 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1539 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1540 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1541 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1542 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1543 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1544 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1545 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1546 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1547 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1548 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1549};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001551
Simon Butcherad4e4932018-04-29 00:43:47 +01001552#if defined(MBEDTLS_CIPHER_MODE_OFB)
1553/*
1554 * AES-OFB test vectors from:
1555 *
Simon Butcher5db13622018-06-04 22:11:25 +01001556 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001557 */
1558static const unsigned char aes_test_ofb_key[3][32] =
1559{
1560 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1561 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1562 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1563 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1564 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1565 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1566 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1567 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1568 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1569};
1570
1571static const unsigned char aes_test_ofb_iv[16] =
1572{
1573 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1574 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1575};
1576
1577static const unsigned char aes_test_ofb_pt[64] =
1578{
1579 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1580 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1581 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1582 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1583 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1584 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1585 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1586 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1587};
1588
1589static const unsigned char aes_test_ofb_ct[3][64] =
1590{
1591 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1592 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1593 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1594 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1595 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1596 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1597 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1598 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1599 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1600 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1601 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1602 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1603 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1604 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1605 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1606 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1607 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1608 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1609 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1610 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1611 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1612 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1613 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1614 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1615};
1616#endif /* MBEDTLS_CIPHER_MODE_OFB */
1617
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001618#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001619/*
1620 * AES-CTR test vectors from:
1621 *
1622 * http://www.faqs.org/rfcs/rfc3686.html
1623 */
1624
1625static const unsigned char aes_test_ctr_key[3][16] =
1626{
1627 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1628 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1629 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1630 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1631 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1632 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1633};
1634
1635static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1636{
1637 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1639 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1640 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1641 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1642 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1643};
1644
1645static const unsigned char aes_test_ctr_pt[3][48] =
1646{
1647 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1648 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1649
1650 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1651 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1652 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1653 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1654
1655 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1656 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1657 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1658 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1659 0x20, 0x21, 0x22, 0x23 }
1660};
1661
1662static const unsigned char aes_test_ctr_ct[3][48] =
1663{
1664 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1665 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1666 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1667 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1668 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1669 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1670 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1671 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1672 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1673 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1674 0x25, 0xB2, 0x07, 0x2F }
1675};
1676
1677static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001678{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001679#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001680
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001681#if defined(MBEDTLS_CIPHER_MODE_XTS)
1682/*
1683 * AES-XTS test vectors from:
1684 *
1685 * IEEE P1619/D16 Annex B
1686 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1687 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1688 */
1689static const unsigned char aes_test_xts_key[][32] =
1690{
1691 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1695 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1696 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1697 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1698 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1699 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1700 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1701 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1702 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1703};
1704
1705static const unsigned char aes_test_xts_pt32[][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 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1712 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1713 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1714 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1715 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1716 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1717 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1718 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1719};
1720
1721static const unsigned char aes_test_xts_ct32[][32] =
1722{
1723 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1724 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1725 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1726 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1727 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1728 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1729 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1730 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1731 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1732 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1733 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1734 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1735};
1736
1737static const unsigned char aes_test_xts_data_unit[][16] =
1738{
Gilles Peskine449bd832023-01-11 14:50:10 +01001739 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1741 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1743 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001745};
1746
1747#endif /* MBEDTLS_CIPHER_MODE_XTS */
1748
Paul Bakker5121ce52009-01-03 21:22:43 +00001749/*
1750 * Checkup routine
1751 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001752int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001753{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001754 int ret = 0, i, j, u, mode;
1755 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001756 unsigned char key[32];
1757 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001758 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001759#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1760 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001761 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001762#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001763#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001764 unsigned char prv[16];
1765#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001766#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1767 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001768 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001769#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001770#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001771 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001772#endif
1773#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001774 unsigned char nonce_counter[16];
1775 unsigned char stream_block[16];
1776#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001777 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001778
Gilles Peskine449bd832023-01-11 14:50:10 +01001779 memset(key, 0, 32);
1780 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001781
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001782 if (verbose != 0) {
1783#if defined(MBEDTLS_AES_ALT)
1784 mbedtls_printf(" AES note: alternative implementation.\n");
1785#else /* MBEDTLS_AES_ALT */
1786#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1787 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1788 mbedtls_printf(" AES note: using VIA Padlock.\n");
1789 } else
1790#endif
1791#if defined(MBEDTLS_AESNI_HAVE_CODE)
1792 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1793 mbedtls_printf(" AES note: using AESNI.\n");
1794 } else
1795#endif
1796#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1797 if (mbedtls_aesce_has_support()) {
1798 mbedtls_printf(" AES note: using AESCE.\n");
1799 } else
1800#endif
1801 mbedtls_printf(" AES note: built-in implementation.\n");
1802#endif /* MBEDTLS_AES_ALT */
1803 }
1804
Paul Bakker5121ce52009-01-03 21:22:43 +00001805 /*
1806 * ECB mode
1807 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001808 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001809 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001810 keybits = 128 + u * 64;
1811 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001812
Gilles Peskine449bd832023-01-11 14:50:10 +01001813 if (verbose != 0) {
1814 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1815 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001816 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001817
Arto Kinnunen0f066182023-04-20 10:02:46 +08001818#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1819 if (keybits > 128) {
1820 mbedtls_printf("skipped\n");
1821 continue;
1822 }
1823#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1824
Gilles Peskine449bd832023-01-11 14:50:10 +01001825 memset(buf, 0, 16);
1826
1827 if (mode == MBEDTLS_AES_DECRYPT) {
1828 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1829 aes_tests = aes_test_ecb_dec[u];
1830 } else {
1831 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001832 aes_tests = aes_test_ecb_enc[u];
1833 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001834
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001835 /*
1836 * AES-192 is an optional feature that may be unavailable when
1837 * there is an alternative underlying implementation i.e. when
1838 * MBEDTLS_AES_ALT is defined.
1839 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1841 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001842 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001843 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001844 goto exit;
1845 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001846
Gilles Peskine449bd832023-01-11 14:50:10 +01001847 for (j = 0; j < 10000; j++) {
1848 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1849 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001850 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001851 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001852 }
1853
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001855 ret = 1;
1856 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001857 }
1858
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 if (verbose != 0) {
1860 mbedtls_printf("passed\n");
1861 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001862 }
1863
Gilles Peskine449bd832023-01-11 14:50:10 +01001864 if (verbose != 0) {
1865 mbedtls_printf("\n");
1866 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001867
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001868#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001869 /*
1870 * CBC mode
1871 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001873 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001874 keybits = 128 + u * 64;
1875 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001876
Gilles Peskine449bd832023-01-11 14:50:10 +01001877 if (verbose != 0) {
1878 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1879 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001880 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001881
Arto Kinnunen0f066182023-04-20 10:02:46 +08001882#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1883 if (keybits > 128) {
1884 mbedtls_printf("skipped\n");
1885 continue;
1886 }
1887#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1888
Gilles Peskine449bd832023-01-11 14:50:10 +01001889 memset(iv, 0, 16);
1890 memset(prv, 0, 16);
1891 memset(buf, 0, 16);
1892
1893 if (mode == MBEDTLS_AES_DECRYPT) {
1894 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1895 aes_tests = aes_test_cbc_dec[u];
1896 } else {
1897 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001898 aes_tests = aes_test_cbc_enc[u];
1899 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001900
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001901 /*
1902 * AES-192 is an optional feature that may be unavailable when
1903 * there is an alternative underlying implementation i.e. when
1904 * MBEDTLS_AES_ALT is defined.
1905 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001906 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1907 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001908 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001909 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001910 goto exit;
1911 }
1912
Gilles Peskine449bd832023-01-11 14:50:10 +01001913 for (j = 0; j < 10000; j++) {
1914 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001915 unsigned char tmp[16];
1916
Gilles Peskine449bd832023-01-11 14:50:10 +01001917 memcpy(tmp, prv, 16);
1918 memcpy(prv, buf, 16);
1919 memcpy(buf, tmp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001920 }
1921
Gilles Peskine449bd832023-01-11 14:50:10 +01001922 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1923 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001924 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001925 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001926
1927 }
1928
Gilles Peskine449bd832023-01-11 14:50:10 +01001929 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001930 ret = 1;
1931 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 }
1933
Gilles Peskine449bd832023-01-11 14:50:10 +01001934 if (verbose != 0) {
1935 mbedtls_printf("passed\n");
1936 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001937 }
1938
Gilles Peskine449bd832023-01-11 14:50:10 +01001939 if (verbose != 0) {
1940 mbedtls_printf("\n");
1941 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001942#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001943
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001944#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001945 /*
1946 * CFB128 mode
1947 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001948 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001949 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001950 keybits = 128 + u * 64;
1951 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001952
Gilles Peskine449bd832023-01-11 14:50:10 +01001953 if (verbose != 0) {
1954 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1955 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1956 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001957
Arto Kinnunen0f066182023-04-20 10:02:46 +08001958#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1959 if (keybits > 128) {
1960 mbedtls_printf("skipped\n");
1961 continue;
1962 }
1963#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1964
Gilles Peskine449bd832023-01-11 14:50:10 +01001965 memcpy(iv, aes_test_cfb128_iv, 16);
1966 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001967
1968 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001969 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001970 /*
1971 * AES-192 is an optional feature that may be unavailable when
1972 * there is an alternative underlying implementation i.e. when
1973 * MBEDTLS_AES_ALT is defined.
1974 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1976 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001977 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001979 goto exit;
1980 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001981
Gilles Peskine449bd832023-01-11 14:50:10 +01001982 if (mode == MBEDTLS_AES_DECRYPT) {
1983 memcpy(buf, aes_test_cfb128_ct[u], 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001984 aes_tests = aes_test_cfb128_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01001985 } else {
1986 memcpy(buf, aes_test_cfb128_pt, 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001987 aes_tests = aes_test_cfb128_ct[u];
1988 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001989
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
1991 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001992 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001994
Gilles Peskine449bd832023-01-11 14:50:10 +01001995 if (memcmp(buf, aes_tests, 64) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001996 ret = 1;
1997 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001998 }
1999
Gilles Peskine449bd832023-01-11 14:50:10 +01002000 if (verbose != 0) {
2001 mbedtls_printf("passed\n");
2002 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002003 }
2004
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 if (verbose != 0) {
2006 mbedtls_printf("\n");
2007 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002008#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002009
Simon Butcherad4e4932018-04-29 00:43:47 +01002010#if defined(MBEDTLS_CIPHER_MODE_OFB)
2011 /*
2012 * OFB mode
2013 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 for (i = 0; i < 6; i++) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002015 u = i >> 1;
2016 keybits = 128 + u * 64;
2017 mode = i & 1;
2018
Gilles Peskine449bd832023-01-11 14:50:10 +01002019 if (verbose != 0) {
2020 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2021 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2022 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002023
Arto Kinnunen0f066182023-04-20 10:02:46 +08002024#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2025 if (keybits > 128) {
2026 mbedtls_printf("skipped\n");
2027 continue;
2028 }
2029#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2030
Gilles Peskine449bd832023-01-11 14:50:10 +01002031 memcpy(iv, aes_test_ofb_iv, 16);
2032 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002033
2034 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002035 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Simon Butcherad4e4932018-04-29 00:43:47 +01002036 /*
2037 * AES-192 is an optional feature that may be unavailable when
2038 * there is an alternative underlying implementation i.e. when
2039 * MBEDTLS_AES_ALT is defined.
2040 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002041 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2042 mbedtls_printf("skipped\n");
Simon Butcherad4e4932018-04-29 00:43:47 +01002043 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002044 } else if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002045 goto exit;
2046 }
2047
Gilles Peskine449bd832023-01-11 14:50:10 +01002048 if (mode == MBEDTLS_AES_DECRYPT) {
2049 memcpy(buf, aes_test_ofb_ct[u], 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002050 aes_tests = aes_test_ofb_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 } else {
2052 memcpy(buf, aes_test_ofb_pt, 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002053 aes_tests = aes_test_ofb_ct[u];
2054 }
2055
Gilles Peskine449bd832023-01-11 14:50:10 +01002056 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2057 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002058 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002060
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 if (memcmp(buf, aes_tests, 64) != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002062 ret = 1;
2063 goto exit;
2064 }
2065
Gilles Peskine449bd832023-01-11 14:50:10 +01002066 if (verbose != 0) {
2067 mbedtls_printf("passed\n");
2068 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002069 }
2070
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 if (verbose != 0) {
2072 mbedtls_printf("\n");
2073 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002074#endif /* MBEDTLS_CIPHER_MODE_OFB */
2075
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002076#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002077 /*
2078 * CTR mode
2079 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002080 for (i = 0; i < 6; i++) {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002081 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002082 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002083
Gilles Peskine449bd832023-01-11 14:50:10 +01002084 if (verbose != 0) {
2085 mbedtls_printf(" AES-CTR-128 (%s): ",
2086 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2087 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002088
Gilles Peskine449bd832023-01-11 14:50:10 +01002089 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2090 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002091
2092 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002093 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002094 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002096
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002097 len = aes_test_ctr_len[u];
2098
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 if (mode == MBEDTLS_AES_DECRYPT) {
2100 memcpy(buf, aes_test_ctr_ct[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002101 aes_tests = aes_test_ctr_pt[u];
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 } else {
2103 memcpy(buf, aes_test_ctr_pt[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002104 aes_tests = aes_test_ctr_ct[u];
2105 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2108 stream_block, buf, buf);
2109 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002110 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002111 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002112
Gilles Peskine449bd832023-01-11 14:50:10 +01002113 if (memcmp(buf, aes_tests, len) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002114 ret = 1;
2115 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002116 }
2117
Gilles Peskine449bd832023-01-11 14:50:10 +01002118 if (verbose != 0) {
2119 mbedtls_printf("passed\n");
2120 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002121 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002122
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 if (verbose != 0) {
2124 mbedtls_printf("\n");
2125 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002126#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002127
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002128#if defined(MBEDTLS_CIPHER_MODE_XTS)
2129 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002130 static const int num_tests =
2131 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2132 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002133
Gilles Peskine449bd832023-01-11 14:50:10 +01002134 /*
2135 * XTS mode
2136 */
2137 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002138
Gilles Peskine449bd832023-01-11 14:50:10 +01002139 for (i = 0; i < num_tests << 1; i++) {
2140 const unsigned char *data_unit;
2141 u = i >> 1;
2142 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002143
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 if (verbose != 0) {
2145 mbedtls_printf(" AES-XTS-128 (%s): ",
2146 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2147 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002148
Gilles Peskine449bd832023-01-11 14:50:10 +01002149 memset(key, 0, sizeof(key));
2150 memcpy(key, aes_test_xts_key[u], 32);
2151 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002152
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002154
Gilles Peskine449bd832023-01-11 14:50:10 +01002155 if (mode == MBEDTLS_AES_DECRYPT) {
2156 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2157 if (ret != 0) {
2158 goto exit;
2159 }
2160 memcpy(buf, aes_test_xts_ct32[u], len);
2161 aes_tests = aes_test_xts_pt32[u];
2162 } else {
2163 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2164 if (ret != 0) {
2165 goto exit;
2166 }
2167 memcpy(buf, aes_test_xts_pt32[u], len);
2168 aes_tests = aes_test_xts_ct32[u];
2169 }
2170
2171
2172 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2173 buf, buf);
2174 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002175 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 }
2177
2178 if (memcmp(buf, aes_tests, len) != 0) {
2179 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002180 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 }
2182
2183 if (verbose != 0) {
2184 mbedtls_printf("passed\n");
2185 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002186 }
2187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 if (verbose != 0) {
2189 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002190 }
2191
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002193 }
2194#endif /* MBEDTLS_CIPHER_MODE_XTS */
2195
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002196 ret = 0;
2197
2198exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002199 if (ret != 0 && verbose != 0) {
2200 mbedtls_printf("failed\n");
2201 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002202
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002204
Gilles Peskine449bd832023-01-11 14:50:10 +01002205 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002206}
2207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002208#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002209
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002210#endif /* MBEDTLS_AES_C */