blob: a1d8f860c6fc56e83be831a97ae4833df462e81b [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
Dave Rodgman8c753f92023-06-27 18:16:13 +0100351#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000352/*
353 * Round constants
354 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000355static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000356
357/*
358 * Tables generation code
359 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100360#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
361#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
362#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
364static int aes_init_done = 0;
365
Gilles Peskine449bd832023-01-11 14:50:10 +0100366static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000367{
368 int i, x, y, z;
369 int pow[256];
370 int log[256];
371
372 /*
373 * compute pow and log tables over GF(2^8)
374 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 pow[i] = x;
377 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100378 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000379 }
380
381 /*
382 * calculate the round constants
383 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000385 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000387 }
388
389 /*
390 * generate the forward and reverse S-boxes
391 */
392 FSb[0x00] = 0x63;
393 RSb[0x63] = 0x00;
394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000396 x = pow[255 - log[i]];
397
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 y = x; 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));
401 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 x ^= y ^ 0x63;
403
404 FSb[i] = (unsigned char) x;
405 RSb[x] = (unsigned char) i;
406 }
407
408 /*
409 * generate the forward and reverse tables
410 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000412 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100413 y = MBEDTLS_BYTE_0(XTIME(x));
414 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 FT0[i] = ((uint32_t) y) ^
417 ((uint32_t) x << 8) ^
418 ((uint32_t) x << 16) ^
419 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Hanno Beckerad049a92017-06-19 16:31:54 +0100421#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 FT1[i] = ROTL8(FT0[i]);
423 FT2[i] = ROTL8(FT1[i]);
424 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100425#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000426
427 x = RSb[i];
428
Gilles Peskine449bd832023-01-11 14:50:10 +0100429 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
430 ((uint32_t) MUL(0x09, x) << 8) ^
431 ((uint32_t) MUL(0x0D, x) << 16) ^
432 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000433
Hanno Beckerad049a92017-06-19 16:31:54 +0100434#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100435 RT1[i] = ROTL8(RT0[i]);
436 RT2[i] = ROTL8(RT1[i]);
437 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100438#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000439 }
440}
441
Dave Rodgman8c753f92023-06-27 18:16:13 +0100442#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
443
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200444#undef ROTL8
445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Hanno Beckerad049a92017-06-19 16:31:54 +0100448#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
451#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
452#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200453
454#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100455#define AES_RT1(idx) ROTL8(RT0[idx])
456#define AES_RT2(idx) ROTL16(RT0[idx])
457#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200458
459#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100460#define AES_FT1(idx) ROTL8(FT0[idx])
461#define AES_FT2(idx) ROTL16(FT0[idx])
462#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200463
Hanno Becker177d3cf2017-06-07 15:52:48 +0100464#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200465
466#define AES_RT0(idx) RT0[idx]
467#define AES_RT1(idx) RT1[idx]
468#define AES_RT2(idx) RT2[idx]
469#define AES_RT3(idx) RT3[idx]
470
471#define AES_FT0(idx) FT0[idx]
472#define AES_FT1(idx) FT1[idx]
473#define AES_FT2(idx) FT2[idx]
474#define AES_FT3(idx) FT3[idx]
475
Hanno Becker177d3cf2017-06-07 15:52:48 +0100476#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200479{
Gilles Peskine449bd832023-01-11 14:50:10 +0100480 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200481}
482
Gilles Peskine449bd832023-01-11 14:50:10 +0100483void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200484{
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200486 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490}
491
Jaeden Amero9366feb2018-05-29 18:55:17 +0100492#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100493void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100494{
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 mbedtls_aes_init(&ctx->crypt);
496 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100497}
498
Gilles Peskine449bd832023-01-11 14:50:10 +0100499void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100500{
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100502 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 }
Simon Butcher5201e412018-12-06 17:40:14 +0000504
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 mbedtls_aes_free(&ctx->crypt);
506 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100507}
508#endif /* MBEDTLS_CIPHER_MODE_XTS */
509
Gilles Peskine0de8f852023-03-16 17:14:59 +0100510/* Some implementations need the round keys to be aligned.
511 * Return an offset to be added to buf, such that (buf + offset) is
512 * correctly aligned.
513 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
514 * i.e. an offset of 1 means 4 bytes and so on.
515 */
516#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100517 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100518#define MAY_NEED_TO_ALIGN
519#endif
Dave Rodgman28a539a2023-06-27 18:22:34 +0100520
521#if defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100522static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
523{
524#if defined(MAY_NEED_TO_ALIGN)
525 int align_16_bytes = 0;
526
527#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
528 if (aes_padlock_ace == -1) {
529 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
530 }
531 if (aes_padlock_ace) {
532 align_16_bytes = 1;
533 }
534#endif
535
Gilles Peskine9c682e72023-03-16 17:21:33 +0100536#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100537 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
538 align_16_bytes = 1;
539 }
540#endif
541
542 if (align_16_bytes) {
543 /* These implementations needs 16-byte alignment
544 * for the round key array. */
545 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
546 if (delta == 0) {
547 return 0;
548 } else {
549 return 4 - delta; // 16 bytes = 4 uint32_t
550 }
551 }
552#else /* MAY_NEED_TO_ALIGN */
553 (void) buf;
554#endif /* MAY_NEED_TO_ALIGN */
555
556 return 0;
557}
Dave Rodgman28a539a2023-06-27 18:22:34 +0100558#endif /* defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
Gilles Peskine0de8f852023-03-16 17:14:59 +0100559
Paul Bakker5121ce52009-01-03 21:22:43 +0000560/*
561 * AES key schedule (encryption)
562 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200563#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100564int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
565 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000566{
Paul Bakker23986e52011-04-24 08:57:21 +0000567 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000568 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000569
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800572#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000573 case 192: ctx->nr = 12; break;
574 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800575#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100576 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000577 }
578
Simon Butcher5201e412018-12-06 17:40:14 +0000579#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000581 aes_gen_tables();
582 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000583 }
584#endif
585
Gilles Peskine0de8f852023-03-16 17:14:59 +0100586 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100587 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000588
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100589#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100590 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
591 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
592 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100593#endif
594
Jerry Yu3f2fb712023-01-10 17:05:42 +0800595#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
596 if (mbedtls_aesce_has_support()) {
597 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
598 }
599#endif
600
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 for (i = 0; i < (keybits >> 5); i++) {
602 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 }
604
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000606 case 10:
607
Gilles Peskine449bd832023-01-11 14:50:10 +0100608 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000609 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100610 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
611 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
612 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
613 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000614
615 RK[5] = RK[1] ^ RK[4];
616 RK[6] = RK[2] ^ RK[5];
617 RK[7] = RK[3] ^ RK[6];
618 }
619 break;
620
Arto Kinnunen732ca322023-04-14 14:26:10 +0800621#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000622 case 12:
623
Gilles Peskine449bd832023-01-11 14:50:10 +0100624 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000625 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100626 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
627 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
628 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
629 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000630
631 RK[7] = RK[1] ^ RK[6];
632 RK[8] = RK[2] ^ RK[7];
633 RK[9] = RK[3] ^ RK[8];
634 RK[10] = RK[4] ^ RK[9];
635 RK[11] = RK[5] ^ RK[10];
636 }
637 break;
638
639 case 14:
640
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000642 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
644 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
645 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
646 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000647
648 RK[9] = RK[1] ^ RK[8];
649 RK[10] = RK[2] ^ RK[9];
650 RK[11] = RK[3] ^ RK[10];
651
652 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100653 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
654 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
655 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
656 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000657
658 RK[13] = RK[5] ^ RK[12];
659 RK[14] = RK[6] ^ RK[13];
660 RK[15] = RK[7] ^ RK[14];
661 }
662 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800663#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000664 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000665
Gilles Peskine449bd832023-01-11 14:50:10 +0100666 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000667}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200668#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000669
670/*
671 * AES key schedule (decryption)
672 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200673#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100674int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
675 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000676{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200677 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200678 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000679 uint32_t *RK;
680 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200681
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000683
Gilles Peskine0de8f852023-03-16 17:14:59 +0100684 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100685 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000686
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200687 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200689 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000691
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200692 ctx->nr = cty.nr;
693
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100694#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
696 mbedtls_aesni_inverse_key((unsigned char *) RK,
697 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200698 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100699 }
700#endif
701
Jerry Yue096da12023-01-10 17:07:01 +0800702#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
703 if (mbedtls_aesce_has_support()) {
704 mbedtls_aesce_inverse_key(
705 (unsigned char *) RK,
706 (const unsigned char *) (cty.buf + cty.rk_offset),
707 ctx->nr);
708 goto exit;
709 }
710#endif
711
Werner Lewisdd76ef32022-05-30 12:00:21 +0100712 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000713
714 *RK++ = *SK++;
715 *RK++ = *SK++;
716 *RK++ = *SK++;
717 *RK++ = *SK++;
718
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
720 for (j = 0; j < 4; j++, SK++) {
721 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
722 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
723 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
724 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000725 }
726 }
727
728 *RK++ = *SK++;
729 *RK++ = *SK++;
730 *RK++ = *SK++;
731 *RK++ = *SK++;
732
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200733exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000735
Gilles Peskine449bd832023-01-11 14:50:10 +0100736 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000737}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100738#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100739
740#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100741static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
742 unsigned int keybits,
743 const unsigned char **key1,
744 unsigned int *key1bits,
745 const unsigned char **key2,
746 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100747{
748 const unsigned int half_keybits = keybits / 2;
749 const unsigned int half_keybytes = half_keybits / 8;
750
Gilles Peskine449bd832023-01-11 14:50:10 +0100751 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100752 case 256: break;
753 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100754 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100755 }
756
757 *key1bits = half_keybits;
758 *key2bits = half_keybits;
759 *key1 = &key[0];
760 *key2 = &key[half_keybytes];
761
762 return 0;
763}
764
Gilles Peskine449bd832023-01-11 14:50:10 +0100765int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
766 const unsigned char *key,
767 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100768{
Janos Follath24eed8d2019-11-22 13:21:35 +0000769 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100770 const unsigned char *key1, *key2;
771 unsigned int key1bits, key2bits;
772
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
774 &key2, &key2bits);
775 if (ret != 0) {
776 return ret;
777 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100778
779 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
781 if (ret != 0) {
782 return ret;
783 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100784
785 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100787}
788
Gilles Peskine449bd832023-01-11 14:50:10 +0100789int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
790 const unsigned char *key,
791 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100792{
Janos Follath24eed8d2019-11-22 13:21:35 +0000793 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100794 const unsigned char *key1, *key2;
795 unsigned int key1bits, key2bits;
796
Gilles Peskine449bd832023-01-11 14:50:10 +0100797 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
798 &key2, &key2bits);
799 if (ret != 0) {
800 return ret;
801 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100802
803 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
805 if (ret != 0) {
806 return ret;
807 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100808
809 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100810 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100811}
812#endif /* MBEDTLS_CIPHER_MODE_XTS */
813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100815 do \
816 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100817 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
818 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
819 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
820 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100821 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
823 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
824 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
825 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100826 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
828 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
829 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
830 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100831 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
833 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
834 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
835 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
836 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000837
Gilles Peskine449bd832023-01-11 14:50:10 +0100838#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100839 do \
840 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100841 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
842 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
843 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
844 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100845 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100846 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
847 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
848 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
849 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100850 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100851 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
852 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
853 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
854 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100855 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100856 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
857 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
858 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
859 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
860 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000861
862/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200863 * AES-ECB block encryption
864 */
865#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100866int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
867 const unsigned char input[16],
868 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200869{
870 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100871 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200873 uint32_t X[4];
874 uint32_t Y[4];
875 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200876
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
878 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
879 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
880 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200881
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
883 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]);
884 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 +0200885 }
886
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 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 +0200888
Gilles Peskine5197c662020-08-26 17:03:24 +0200889 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
891 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
892 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine5197c662020-08-26 17:03:24 +0200907 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100908 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
909 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
910 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
911 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
914 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
915 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
916 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000917
Gilles Peskine449bd832023-01-11 14:50:10 +0100918 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500919
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200921}
922#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
923
924/*
925 * AES-ECB block decryption
926 */
927#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100928int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
929 const unsigned char input[16],
930 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200931{
932 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100933 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200935 uint32_t X[4];
936 uint32_t Y[4];
937 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
940 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
941 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
942 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
945 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
946 AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200947 }
948
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200950
Gilles Peskine5197c662020-08-26 17:03:24 +0200951 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine5197c662020-08-26 17:03:24 +0200969 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
971 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
972 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
973 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200974
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
976 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
977 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
978 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000979
Gilles Peskine449bd832023-01-11 14:50:10 +0100980 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500981
Gilles Peskine449bd832023-01-11 14:50:10 +0100982 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200983}
984#endif /* !MBEDTLS_AES_DECRYPT_ALT */
985
Gilles Peskine0de8f852023-03-16 17:14:59 +0100986#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100987/* VIA Padlock and our intrinsics-based implementation of AESNI require
988 * the round keys to be aligned on a 16-byte boundary. We take care of this
989 * before creating them, but the AES context may have moved (this can happen
990 * if the library is called from a language with managed memory), and in later
991 * calls it might have a different alignment with respect to 16-byte memory.
992 * So we may need to realign.
993 */
994static void aes_maybe_realign(mbedtls_aes_context *ctx)
995{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100996 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
997 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100998 memmove(ctx->buf + new_offset, // new address
999 ctx->buf + ctx->rk_offset, // current address
1000 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1001 ctx->rk_offset = new_offset;
1002 }
1003}
1004#endif
1005
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001006/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001007 * AES-ECB block encryption/decryption
1008 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001009int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1010 int mode,
1011 const unsigned char input[16],
1012 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001013{
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001015 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001016 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001017
Gilles Peskine0de8f852023-03-16 17:14:59 +01001018#if defined(MAY_NEED_TO_ALIGN)
1019 aes_maybe_realign(ctx);
1020#endif
1021
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001022#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1024 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1025 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001026#endif
1027
Jerry Yu2bb3d812023-01-10 17:38:26 +08001028#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1029 if (mbedtls_aesce_has_support()) {
1030 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1031 }
1032#endif
1033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001035 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001036 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001037 }
1038#endif
1039
Gilles Peskine449bd832023-01-11 14:50:10 +01001040 if (mode == MBEDTLS_AES_ENCRYPT) {
1041 return mbedtls_internal_aes_encrypt(ctx, input, output);
1042 } else {
1043 return mbedtls_internal_aes_decrypt(ctx, input, output);
1044 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001045}
1046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001048
1049#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001050/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1051 * the result for the next block in CBC, and the cost of transferring that data from
1052 * NEON registers, it is faster to use the following on aarch64.
1053 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001054#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001055 mbedtls_put_unaligned_uint64(r, \
1056 mbedtls_get_unaligned_uint64(a) ^ \
1057 mbedtls_get_unaligned_uint64(b)); \
1058 mbedtls_put_unaligned_uint64(r + 8, \
1059 mbedtls_get_unaligned_uint64(a + 8) ^ \
1060 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001061} while (0)
1062#else
1063#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1064#endif
1065
Paul Bakker5121ce52009-01-03 21:22:43 +00001066/*
1067 * AES-CBC buffer encryption/decryption
1068 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001069int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1070 int mode,
1071 size_t length,
1072 unsigned char iv[16],
1073 const unsigned char *input,
1074 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001075{
Gilles Peskine7820a572021-07-07 21:08:28 +02001076 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001077 unsigned char temp[16];
1078
Gilles Peskine449bd832023-01-11 14:50:10 +01001079 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001080 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001082
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 if (length % 16) {
1084 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1085 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 if (aes_padlock_ace > 0) {
1089 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1090 return 0;
1091 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001092
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001093 // If padlock data misaligned, we just fall back to
1094 // unaccelerated mode
1095 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001096 }
1097#endif
1098
Dave Rodgman906c63c2023-06-14 17:53:51 +01001099 const unsigned char *ivp = iv;
1100
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 if (mode == MBEDTLS_AES_DECRYPT) {
1102 while (length > 0) {
1103 memcpy(temp, input, 16);
1104 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1105 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001106 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001108 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001109
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001111
1112 input += 16;
1113 output += 16;
1114 length -= 16;
1115 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 } else {
1117 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001118 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001119
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1121 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001122 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001123 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001124 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001125
1126 input += 16;
1127 output += 16;
1128 length -= 16;
1129 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001130 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001131 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001132 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001133
Gilles Peskine7820a572021-07-07 21:08:28 +02001134exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001135 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001136}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001138
Aorimn5f778012016-06-09 23:22:58 +02001139#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001140
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001141typedef unsigned char mbedtls_be128[16];
1142
1143/*
1144 * GF(2^128) multiplication function
1145 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001146 * This function multiplies a field element by x in the polynomial field
1147 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001148 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001149 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001150 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001151static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1152 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001153{
1154 uint64_t a, b, ra, rb;
1155
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 a = MBEDTLS_GET_UINT64_LE(x, 0);
1157 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001158
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1160 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001161
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1163 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001164}
1165
Aorimn5f778012016-06-09 23:22:58 +02001166/*
1167 * AES-XTS buffer encryption/decryption
1168 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001169int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1170 int mode,
1171 size_t length,
1172 const unsigned char data_unit[16],
1173 const unsigned char *input,
1174 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001175{
Janos Follath24eed8d2019-11-22 13:21:35 +00001176 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001177 size_t blocks = length / 16;
1178 size_t leftover = length % 16;
1179 unsigned char tweak[16];
1180 unsigned char prev_tweak[16];
1181 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001182
Gilles Peskine449bd832023-01-11 14:50:10 +01001183 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001184 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001186
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001187 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001189 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 }
Aorimn5f778012016-06-09 23:22:58 +02001191
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001192 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001194 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 }
Aorimn5f778012016-06-09 23:22:58 +02001196
Jaeden Amerod82cd862018-04-28 15:02:45 +01001197 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1199 data_unit, tweak);
1200 if (ret != 0) {
1201 return ret;
1202 }
Aorimn5f778012016-06-09 23:22:58 +02001203
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001205 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206 /* We are on the last block in a decrypt operation that has
1207 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001208 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001209 * the leftovers and then update the current tweak for use on this,
1210 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 memcpy(prev_tweak, tweak, sizeof(tweak));
1212 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213 }
1214
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001216
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1218 if (ret != 0) {
1219 return ret;
1220 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001221
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001223
1224 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001226
1227 output += 16;
1228 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001229 }
1230
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001232 /* If we are on the leftover bytes in a decrypt operation, we need to
1233 * use the previous tweak for these bytes (as saved in prev_tweak). */
1234 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001235
Jaeden Amerod82cd862018-04-28 15:02:45 +01001236 /* We are now on the final part of the data unit, which doesn't divide
1237 * evenly by 16. It's time for ciphertext stealing. */
1238 size_t i;
1239 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001240
Jaeden Amerod82cd862018-04-28 15:02:45 +01001241 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001242 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001243 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001244 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001245 }
Aorimn5f778012016-06-09 23:22:58 +02001246
Dave Rodgman069e7f42022-11-24 19:37:26 +00001247 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001249
Jaeden Amerod82cd862018-04-28 15:02:45 +01001250 /* Copy ciphertext bytes from the previous block for input in this
1251 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001253
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1255 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001256 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001257 }
Aorimn5f778012016-06-09 23:22:58 +02001258
Jaeden Amerod82cd862018-04-28 15:02:45 +01001259 /* Write the result back to the previous block, overriding the previous
1260 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001262 }
1263
Gilles Peskine449bd832023-01-11 14:50:10 +01001264 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001265}
1266#endif /* MBEDTLS_CIPHER_MODE_XTS */
1267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001268#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001269/*
1270 * AES-CFB128 buffer encryption/decryption
1271 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001272int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1273 int mode,
1274 size_t length,
1275 size_t *iv_off,
1276 unsigned char iv[16],
1277 const unsigned char *input,
1278 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001279{
Paul Bakker27fdf462011-06-09 13:55:13 +00001280 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001281 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001282 size_t n;
1283
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001285 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001287
1288 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001289
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 if (n > 15) {
1291 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1292 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 if (mode == MBEDTLS_AES_DECRYPT) {
1295 while (length--) {
1296 if (n == 0) {
1297 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1298 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001299 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001301 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001302
1303 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001305 iv[n] = (unsigned char) c;
1306
Gilles Peskine449bd832023-01-11 14:50:10 +01001307 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001308 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001309 } else {
1310 while (length--) {
1311 if (n == 0) {
1312 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1313 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001314 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001316 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001317
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001319
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001321 }
1322 }
1323
1324 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001325 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001326
Gilles Peskine7820a572021-07-07 21:08:28 +02001327exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001328 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001329}
Paul Bakker556efba2014-01-24 15:38:12 +01001330
1331/*
1332 * AES-CFB8 buffer encryption/decryption
1333 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001334int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1335 int mode,
1336 size_t length,
1337 unsigned char iv[16],
1338 const unsigned char *input,
1339 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001340{
Gilles Peskine7820a572021-07-07 21:08:28 +02001341 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001342 unsigned char c;
1343 unsigned char ov[17];
1344
Gilles Peskine449bd832023-01-11 14:50:10 +01001345 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001346 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 }
1348 while (length--) {
1349 memcpy(ov, iv, 16);
1350 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1351 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001352 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 }
Paul Bakker556efba2014-01-24 15:38:12 +01001354
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001356 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001357 }
Paul Bakker556efba2014-01-24 15:38:12 +01001358
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001360
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001362 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 }
Paul Bakker556efba2014-01-24 15:38:12 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001366 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001367 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001368
Gilles Peskine7820a572021-07-07 21:08:28 +02001369exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001371}
Simon Butcher76a5b222018-04-22 22:57:27 +01001372#endif /* MBEDTLS_CIPHER_MODE_CFB */
1373
1374#if defined(MBEDTLS_CIPHER_MODE_OFB)
1375/*
1376 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1377 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001378int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1379 size_t length,
1380 size_t *iv_off,
1381 unsigned char iv[16],
1382 const unsigned char *input,
1383 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001384{
Simon Butcherad4e4932018-04-29 00:43:47 +01001385 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001386 size_t n;
1387
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001388 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001389
Gilles Peskine449bd832023-01-11 14:50:10 +01001390 if (n > 15) {
1391 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1392 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001393
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 while (length--) {
1395 if (n == 0) {
1396 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1397 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001398 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001400 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001401 *output++ = *input++ ^ iv[n];
1402
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001404 }
1405
1406 *iv_off = n;
1407
Simon Butcherad4e4932018-04-29 00:43:47 +01001408exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001410}
1411#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001414/*
1415 * AES-CTR buffer encryption/decryption
1416 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001417int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1418 size_t length,
1419 size_t *nc_off,
1420 unsigned char nonce_counter[16],
1421 unsigned char stream_block[16],
1422 const unsigned char *input,
1423 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001424{
Paul Bakker369e14b2012-04-18 14:16:09 +00001425 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001426 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001427 size_t n;
1428
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001429 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001430
Gilles Peskine449bd832023-01-11 14:50:10 +01001431 if (n > 0x0F) {
1432 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1433 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001434
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 while (length--) {
1436 if (n == 0) {
1437 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1438 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001439 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001441
Gilles Peskine449bd832023-01-11 14:50:10 +01001442 for (i = 16; i > 0; i--) {
1443 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001444 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 }
1446 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001447 }
1448 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001449 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001450
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001452 }
1453
1454 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001455 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001456
Gilles Peskine7820a572021-07-07 21:08:28 +02001457exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001458 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001459}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001461
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001462#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001465/*
1466 * AES test vectors from:
1467 *
1468 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1469 */
Yanray Wang62c99912023-05-11 11:06:53 +08001470static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001471{
1472 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1473 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001474#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001475 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1476 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1477 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1478 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001479#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001480};
1481
Yanray Wang62c99912023-05-11 11:06:53 +08001482static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001483{
1484 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1485 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001486#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001487 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1488 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1489 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1490 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001491#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001492};
1493
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001495static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001496{
1497 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1498 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001499#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001500 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1501 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1502 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1503 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001504#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001505};
1506
Yanray Wang62c99912023-05-11 11:06:53 +08001507static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001508{
1509 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1510 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001511#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001512 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1513 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1514 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1515 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001516#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001517};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001518#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001521/*
1522 * AES-CFB128 test vectors from:
1523 *
1524 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1525 */
Yanray Wang62c99912023-05-11 11:06:53 +08001526static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001527{
1528 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1529 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001530#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001531 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1532 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1533 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1534 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1535 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1536 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1537 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001538#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001539};
1540
1541static const unsigned char aes_test_cfb128_iv[16] =
1542{
1543 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1544 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1545};
1546
1547static const unsigned char aes_test_cfb128_pt[64] =
1548{
1549 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1550 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1551 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1552 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1553 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1554 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1555 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1556 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1557};
1558
Yanray Wang62c99912023-05-11 11:06:53 +08001559static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001560{
1561 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1562 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1563 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1564 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1565 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1566 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1567 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1568 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001569#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001570 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1571 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1572 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1573 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1574 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1575 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1576 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1577 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1578 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1579 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1580 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1581 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1582 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1583 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1584 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1585 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001586#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001587};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001588#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001589
Simon Butcherad4e4932018-04-29 00:43:47 +01001590#if defined(MBEDTLS_CIPHER_MODE_OFB)
1591/*
1592 * AES-OFB test vectors from:
1593 *
Simon Butcher5db13622018-06-04 22:11:25 +01001594 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001595 */
Yanray Wang62c99912023-05-11 11:06:53 +08001596static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001597{
1598 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1599 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001600#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001601 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1602 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1603 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1604 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1605 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1606 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1607 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001608#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001609};
1610
1611static const unsigned char aes_test_ofb_iv[16] =
1612{
1613 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1614 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1615};
1616
1617static const unsigned char aes_test_ofb_pt[64] =
1618{
1619 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1620 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1621 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1622 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1623 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1624 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1625 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1626 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1627};
1628
Yanray Wang62c99912023-05-11 11:06:53 +08001629static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001630{
1631 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1632 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1633 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1634 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1635 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1636 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1637 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1638 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001639#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001640 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1641 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1642 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1643 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1644 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1645 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1646 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1647 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1648 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1649 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1650 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1651 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1652 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1653 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1654 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1655 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001656#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001657};
1658#endif /* MBEDTLS_CIPHER_MODE_OFB */
1659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001660#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001661/*
1662 * AES-CTR test vectors from:
1663 *
1664 * http://www.faqs.org/rfcs/rfc3686.html
1665 */
1666
Yanray Wang62c99912023-05-11 11:06:53 +08001667static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001668{
1669 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1670 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1671 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1672 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1673 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1674 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1675};
1676
Yanray Wang62c99912023-05-11 11:06:53 +08001677static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001678{
1679 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1680 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1681 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1682 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1683 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1684 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1685};
1686
Yanray Wang62c99912023-05-11 11:06:53 +08001687static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001688{
1689 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1690 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001691 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1692 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1693 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1694 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1695
1696 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1697 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1698 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1699 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1700 0x20, 0x21, 0x22, 0x23 }
1701};
1702
Yanray Wang62c99912023-05-11 11:06:53 +08001703static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001704{
1705 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1706 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1707 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1708 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1709 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1710 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1711 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1712 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1713 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1714 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1715 0x25, 0xB2, 0x07, 0x2F }
1716};
1717
1718static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001719{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001720#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001721
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001722#if defined(MBEDTLS_CIPHER_MODE_XTS)
1723/*
1724 * AES-XTS test vectors from:
1725 *
1726 * IEEE P1619/D16 Annex B
1727 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1728 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1729 */
1730static const unsigned char aes_test_xts_key[][32] =
1731{
1732 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1736 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1737 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1738 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1739 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1740 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1741 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1742 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1743 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1744};
1745
1746static const unsigned char aes_test_xts_pt32[][32] =
1747{
1748 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1752 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1753 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1754 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1755 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1756 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1757 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1758 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1759 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1760};
1761
1762static const unsigned char aes_test_xts_ct32[][32] =
1763{
1764 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1765 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1766 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1767 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1768 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1769 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1770 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1771 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1772 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1773 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1774 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1775 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1776};
1777
1778static const unsigned char aes_test_xts_data_unit[][16] =
1779{
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1782 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1784 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001786};
1787
1788#endif /* MBEDTLS_CIPHER_MODE_XTS */
1789
Paul Bakker5121ce52009-01-03 21:22:43 +00001790/*
1791 * Checkup routine
1792 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001793int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001794{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001795 int ret = 0, i, j, u, mode;
1796 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001797 unsigned char key[32];
1798 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001799 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001800#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1801 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001802 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001803#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001805 unsigned char prv[16];
1806#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001807#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1808 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001809 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001810#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001811#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001812 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001813#endif
1814#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001815 unsigned char nonce_counter[16];
1816 unsigned char stream_block[16];
1817#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001818 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Gilles Peskine449bd832023-01-11 14:50:10 +01001820 memset(key, 0, 32);
1821 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001822
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001823 if (verbose != 0) {
1824#if defined(MBEDTLS_AES_ALT)
1825 mbedtls_printf(" AES note: alternative implementation.\n");
1826#else /* MBEDTLS_AES_ALT */
1827#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1828 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1829 mbedtls_printf(" AES note: using VIA Padlock.\n");
1830 } else
1831#endif
1832#if defined(MBEDTLS_AESNI_HAVE_CODE)
1833 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1834 mbedtls_printf(" AES note: using AESNI.\n");
1835 } else
1836#endif
1837#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1838 if (mbedtls_aesce_has_support()) {
1839 mbedtls_printf(" AES note: using AESCE.\n");
1840 } else
1841#endif
1842 mbedtls_printf(" AES note: built-in implementation.\n");
1843#endif /* MBEDTLS_AES_ALT */
1844 }
1845
Paul Bakker5121ce52009-01-03 21:22:43 +00001846 /*
1847 * ECB mode
1848 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001849 {
1850 static const int num_tests =
1851 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001852
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001853 for (i = 0; i < num_tests << 1; i++) {
1854 u = i >> 1;
1855 keybits = 128 + u * 64;
1856 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001857
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001858 if (verbose != 0) {
1859 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1860 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1861 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001862
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001863 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001864
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001865 if (mode == MBEDTLS_AES_DECRYPT) {
1866 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1867 aes_tests = aes_test_ecb_dec[u];
1868 } else {
1869 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1870 aes_tests = aes_test_ecb_enc[u];
1871 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001872
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001873 /*
1874 * AES-192 is an optional feature that may be unavailable when
1875 * there is an alternative underlying implementation i.e. when
1876 * MBEDTLS_AES_ALT is defined.
1877 */
1878 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1879 mbedtls_printf("skipped\n");
1880 continue;
1881 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001882 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001883 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001884
1885 for (j = 0; j < 10000; j++) {
1886 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1887 if (ret != 0) {
1888 goto exit;
1889 }
1890 }
1891
1892 if (memcmp(buf, aes_tests, 16) != 0) {
1893 ret = 1;
1894 goto exit;
1895 }
1896
1897 if (verbose != 0) {
1898 mbedtls_printf("passed\n");
1899 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001900 }
1901
Gilles Peskine449bd832023-01-11 14:50:10 +01001902 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001903 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001904 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001905 }
1906
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001907#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001908 /*
1909 * CBC mode
1910 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001911 {
1912 static const int num_tests =
1913 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001914
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001915 for (i = 0; i < num_tests << 1; i++) {
1916 u = i >> 1;
1917 keybits = 128 + u * 64;
1918 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001919
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001920 if (verbose != 0) {
1921 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1922 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001923 }
1924
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001925 memset(iv, 0, 16);
1926 memset(prv, 0, 16);
1927 memset(buf, 0, 16);
1928
1929 if (mode == MBEDTLS_AES_DECRYPT) {
1930 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1931 aes_tests = aes_test_cbc_dec[u];
1932 } else {
1933 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1934 aes_tests = aes_test_cbc_enc[u];
1935 }
1936
1937 /*
1938 * AES-192 is an optional feature that may be unavailable when
1939 * there is an alternative underlying implementation i.e. when
1940 * MBEDTLS_AES_ALT is defined.
1941 */
1942 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1943 mbedtls_printf("skipped\n");
1944 continue;
1945 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001946 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001947 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001948
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001949 for (j = 0; j < 10000; j++) {
1950 if (mode == MBEDTLS_AES_ENCRYPT) {
1951 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001952
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001953 memcpy(tmp, prv, 16);
1954 memcpy(prv, buf, 16);
1955 memcpy(buf, tmp, 16);
1956 }
1957
1958 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1959 if (ret != 0) {
1960 goto exit;
1961 }
1962
1963 }
1964
1965 if (memcmp(buf, aes_tests, 16) != 0) {
1966 ret = 1;
1967 goto exit;
1968 }
1969
1970 if (verbose != 0) {
1971 mbedtls_printf("passed\n");
1972 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001973 }
1974
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001976 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001977 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001978 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001979#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001981#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001982 /*
1983 * CFB128 mode
1984 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001985 {
1986 static const int num_tests =
1987 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001988
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001989 for (i = 0; i < num_tests << 1; i++) {
1990 u = i >> 1;
1991 keybits = 128 + u * 64;
1992 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001993
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001994 if (verbose != 0) {
1995 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1996 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1997 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001998
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001999 memcpy(iv, aes_test_cfb128_iv, 16);
2000 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002001
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002002 offset = 0;
2003 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2004 /*
2005 * AES-192 is an optional feature that may be unavailable when
2006 * there is an alternative underlying implementation i.e. when
2007 * MBEDTLS_AES_ALT is defined.
2008 */
2009 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2010 mbedtls_printf("skipped\n");
2011 continue;
2012 } else if (ret != 0) {
2013 goto exit;
2014 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002015
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002016 if (mode == MBEDTLS_AES_DECRYPT) {
2017 memcpy(buf, aes_test_cfb128_ct[u], 64);
2018 aes_tests = aes_test_cfb128_pt;
2019 } else {
2020 memcpy(buf, aes_test_cfb128_pt, 64);
2021 aes_tests = aes_test_cfb128_ct[u];
2022 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002023
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002024 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2025 if (ret != 0) {
2026 goto exit;
2027 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002028
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002029 if (memcmp(buf, aes_tests, 64) != 0) {
2030 ret = 1;
2031 goto exit;
2032 }
2033
2034 if (verbose != 0) {
2035 mbedtls_printf("passed\n");
2036 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002037 }
2038
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002040 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002041 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002042 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002044
Simon Butcherad4e4932018-04-29 00:43:47 +01002045#if defined(MBEDTLS_CIPHER_MODE_OFB)
2046 /*
2047 * OFB mode
2048 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002049 {
2050 static const int num_tests =
2051 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002052
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002053 for (i = 0; i < num_tests << 1; i++) {
2054 u = i >> 1;
2055 keybits = 128 + u * 64;
2056 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002057
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002058 if (verbose != 0) {
2059 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2060 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2061 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002062
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002063 memcpy(iv, aes_test_ofb_iv, 16);
2064 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002065
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002066 offset = 0;
2067 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2068 /*
2069 * AES-192 is an optional feature that may be unavailable when
2070 * there is an alternative underlying implementation i.e. when
2071 * MBEDTLS_AES_ALT is defined.
2072 */
2073 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2074 mbedtls_printf("skipped\n");
2075 continue;
2076 } else if (ret != 0) {
2077 goto exit;
2078 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002079
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002080 if (mode == MBEDTLS_AES_DECRYPT) {
2081 memcpy(buf, aes_test_ofb_ct[u], 64);
2082 aes_tests = aes_test_ofb_pt;
2083 } else {
2084 memcpy(buf, aes_test_ofb_pt, 64);
2085 aes_tests = aes_test_ofb_ct[u];
2086 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002087
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002088 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2089 if (ret != 0) {
2090 goto exit;
2091 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002092
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002093 if (memcmp(buf, aes_tests, 64) != 0) {
2094 ret = 1;
2095 goto exit;
2096 }
2097
2098 if (verbose != 0) {
2099 mbedtls_printf("passed\n");
2100 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002101 }
2102
Gilles Peskine449bd832023-01-11 14:50:10 +01002103 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002104 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002106 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002107#endif /* MBEDTLS_CIPHER_MODE_OFB */
2108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002109#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002110 /*
2111 * CTR mode
2112 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002113 {
2114 static const int num_tests =
2115 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002116
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002117 for (i = 0; i < num_tests << 1; i++) {
2118 u = i >> 1;
2119 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002120
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002121 if (verbose != 0) {
2122 mbedtls_printf(" AES-CTR-128 (%s): ",
2123 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2124 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002125
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002126 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2127 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002128
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002129 offset = 0;
2130 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2131 goto exit;
2132 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002133
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002134 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002135
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002136 if (mode == MBEDTLS_AES_DECRYPT) {
2137 memcpy(buf, aes_test_ctr_ct[u], len);
2138 aes_tests = aes_test_ctr_pt[u];
2139 } else {
2140 memcpy(buf, aes_test_ctr_pt[u], len);
2141 aes_tests = aes_test_ctr_ct[u];
2142 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002143
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002144 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2145 stream_block, buf, buf);
2146 if (ret != 0) {
2147 goto exit;
2148 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002149
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002150 if (memcmp(buf, aes_tests, len) != 0) {
2151 ret = 1;
2152 goto exit;
2153 }
2154
2155 if (verbose != 0) {
2156 mbedtls_printf("passed\n");
2157 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002158 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002159 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002160
Gilles Peskine449bd832023-01-11 14:50:10 +01002161 if (verbose != 0) {
2162 mbedtls_printf("\n");
2163 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002164#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002165
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002166#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002167 /*
2168 * XTS mode
2169 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002170 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002171 static const int num_tests =
2172 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2173 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002174
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 for (i = 0; i < num_tests << 1; i++) {
2178 const unsigned char *data_unit;
2179 u = i >> 1;
2180 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 if (verbose != 0) {
2183 mbedtls_printf(" AES-XTS-128 (%s): ",
2184 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2185 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002186
Gilles Peskine449bd832023-01-11 14:50:10 +01002187 memset(key, 0, sizeof(key));
2188 memcpy(key, aes_test_xts_key[u], 32);
2189 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002190
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002192
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 if (mode == MBEDTLS_AES_DECRYPT) {
2194 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2195 if (ret != 0) {
2196 goto exit;
2197 }
2198 memcpy(buf, aes_test_xts_ct32[u], len);
2199 aes_tests = aes_test_xts_pt32[u];
2200 } else {
2201 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2202 if (ret != 0) {
2203 goto exit;
2204 }
2205 memcpy(buf, aes_test_xts_pt32[u], len);
2206 aes_tests = aes_test_xts_ct32[u];
2207 }
2208
2209
2210 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2211 buf, buf);
2212 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002213 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 }
2215
2216 if (memcmp(buf, aes_tests, len) != 0) {
2217 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002218 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002219 }
2220
2221 if (verbose != 0) {
2222 mbedtls_printf("passed\n");
2223 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002224 }
2225
Gilles Peskine449bd832023-01-11 14:50:10 +01002226 if (verbose != 0) {
2227 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002228 }
2229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002231 }
2232#endif /* MBEDTLS_CIPHER_MODE_XTS */
2233
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002234 ret = 0;
2235
2236exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002237 if (ret != 0 && verbose != 0) {
2238 mbedtls_printf("failed\n");
2239 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002240
Gilles Peskine449bd832023-01-11 14:50:10 +01002241 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002242
Gilles Peskine449bd832023-01-11 14:50:10 +01002243 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002244}
2245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002246#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002248#endif /* MBEDTLS_AES_C */