blob: 2173611f4a66eab936b1ec961766f8d8b7fcdd7c [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
520static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
521{
522#if defined(MAY_NEED_TO_ALIGN)
523 int align_16_bytes = 0;
524
525#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
526 if (aes_padlock_ace == -1) {
527 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
528 }
529 if (aes_padlock_ace) {
530 align_16_bytes = 1;
531 }
532#endif
533
Gilles Peskine9c682e72023-03-16 17:21:33 +0100534#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100535 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
536 align_16_bytes = 1;
537 }
538#endif
539
540 if (align_16_bytes) {
541 /* These implementations needs 16-byte alignment
542 * for the round key array. */
543 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
544 if (delta == 0) {
545 return 0;
546 } else {
547 return 4 - delta; // 16 bytes = 4 uint32_t
548 }
549 }
550#else /* MAY_NEED_TO_ALIGN */
551 (void) buf;
552#endif /* MAY_NEED_TO_ALIGN */
553
554 return 0;
555}
556
Paul Bakker5121ce52009-01-03 21:22:43 +0000557/*
558 * AES key schedule (encryption)
559 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200560#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100561int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
562 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000563{
Paul Bakker23986e52011-04-24 08:57:21 +0000564 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000565 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000568 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800569#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000570 case 192: ctx->nr = 12; break;
571 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800572#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100573 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000574 }
575
Simon Butcher5201e412018-12-06 17:40:14 +0000576#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000578 aes_gen_tables();
579 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000580 }
581#endif
582
Gilles Peskine0de8f852023-03-16 17:14:59 +0100583 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100584 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000585
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100586#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100587 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
588 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
589 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100590#endif
591
Jerry Yu3f2fb712023-01-10 17:05:42 +0800592#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
593 if (mbedtls_aesce_has_support()) {
594 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
595 }
596#endif
597
Gilles Peskine449bd832023-01-11 14:50:10 +0100598 for (i = 0; i < (keybits >> 5); i++) {
599 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000600 }
601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 case 10:
604
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000606 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100607 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
608 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
609 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
610 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000611
612 RK[5] = RK[1] ^ RK[4];
613 RK[6] = RK[2] ^ RK[5];
614 RK[7] = RK[3] ^ RK[6];
615 }
616 break;
617
Arto Kinnunen732ca322023-04-14 14:26:10 +0800618#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 case 12:
620
Gilles Peskine449bd832023-01-11 14:50:10 +0100621 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000622 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
624 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
625 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
626 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000627
628 RK[7] = RK[1] ^ RK[6];
629 RK[8] = RK[2] ^ RK[7];
630 RK[9] = RK[3] ^ RK[8];
631 RK[10] = RK[4] ^ RK[9];
632 RK[11] = RK[5] ^ RK[10];
633 }
634 break;
635
636 case 14:
637
Gilles Peskine449bd832023-01-11 14:50:10 +0100638 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000639 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
641 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
642 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
643 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000644
645 RK[9] = RK[1] ^ RK[8];
646 RK[10] = RK[2] ^ RK[9];
647 RK[11] = RK[3] ^ RK[10];
648
649 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100650 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
651 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
652 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
653 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000654
655 RK[13] = RK[5] ^ RK[12];
656 RK[14] = RK[6] ^ RK[13];
657 RK[15] = RK[7] ^ RK[14];
658 }
659 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800660#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000661 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000662
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000664}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200665#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000666
667/*
668 * AES key schedule (decryption)
669 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200670#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100671int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
672 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000673{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200674 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000676 uint32_t *RK;
677 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200678
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000680
Gilles Peskine0de8f852023-03-16 17:14:59 +0100681 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100682 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000683
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200684 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200686 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100687 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000688
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200689 ctx->nr = cty.nr;
690
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100691#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100692 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
693 mbedtls_aesni_inverse_key((unsigned char *) RK,
694 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200695 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100696 }
697#endif
698
Jerry Yue096da12023-01-10 17:07:01 +0800699#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
700 if (mbedtls_aesce_has_support()) {
701 mbedtls_aesce_inverse_key(
702 (unsigned char *) RK,
703 (const unsigned char *) (cty.buf + cty.rk_offset),
704 ctx->nr);
705 goto exit;
706 }
707#endif
708
Werner Lewisdd76ef32022-05-30 12:00:21 +0100709 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000710
711 *RK++ = *SK++;
712 *RK++ = *SK++;
713 *RK++ = *SK++;
714 *RK++ = *SK++;
715
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
717 for (j = 0; j < 4; j++, SK++) {
718 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
719 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
720 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
721 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000722 }
723 }
724
725 *RK++ = *SK++;
726 *RK++ = *SK++;
727 *RK++ = *SK++;
728 *RK++ = *SK++;
729
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200730exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000732
Gilles Peskine449bd832023-01-11 14:50:10 +0100733 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000734}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100735#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100736
737#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100738static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
739 unsigned int keybits,
740 const unsigned char **key1,
741 unsigned int *key1bits,
742 const unsigned char **key2,
743 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100744{
745 const unsigned int half_keybits = keybits / 2;
746 const unsigned int half_keybytes = half_keybits / 8;
747
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100749 case 256: break;
750 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100751 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100752 }
753
754 *key1bits = half_keybits;
755 *key2bits = half_keybits;
756 *key1 = &key[0];
757 *key2 = &key[half_keybytes];
758
759 return 0;
760}
761
Gilles Peskine449bd832023-01-11 14:50:10 +0100762int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
763 const unsigned char *key,
764 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100765{
Janos Follath24eed8d2019-11-22 13:21:35 +0000766 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100767 const unsigned char *key1, *key2;
768 unsigned int key1bits, key2bits;
769
Gilles Peskine449bd832023-01-11 14:50:10 +0100770 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
771 &key2, &key2bits);
772 if (ret != 0) {
773 return ret;
774 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100775
776 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100777 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
778 if (ret != 0) {
779 return ret;
780 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100781
782 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100783 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100784}
785
Gilles Peskine449bd832023-01-11 14:50:10 +0100786int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
787 const unsigned char *key,
788 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100789{
Janos Follath24eed8d2019-11-22 13:21:35 +0000790 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100791 const unsigned char *key1, *key2;
792 unsigned int key1bits, key2bits;
793
Gilles Peskine449bd832023-01-11 14:50:10 +0100794 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
795 &key2, &key2bits);
796 if (ret != 0) {
797 return ret;
798 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100799
800 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100801 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
802 if (ret != 0) {
803 return ret;
804 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100805
806 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100807 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100808}
809#endif /* MBEDTLS_CIPHER_MODE_XTS */
810
Gilles Peskine449bd832023-01-11 14:50:10 +0100811#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100812 do \
813 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
815 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
816 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
817 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100818 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100819 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
820 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
821 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
822 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100823 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100824 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
825 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
826 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
827 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100828 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100829 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
830 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
831 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
832 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
833 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000834
Gilles Peskine449bd832023-01-11 14:50:10 +0100835#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100836 do \
837 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100838 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
839 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
840 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
841 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100842 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
844 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
845 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
846 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100847 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100848 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
849 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
850 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
851 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100852 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100853 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
854 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
855 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
856 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
857 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000858
859/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200860 * AES-ECB block encryption
861 */
862#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100863int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
864 const unsigned char input[16],
865 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200866{
867 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100868 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100869 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200870 uint32_t X[4];
871 uint32_t Y[4];
872 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200873
Gilles Peskine449bd832023-01-11 14:50:10 +0100874 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
875 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
876 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
877 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200878
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
880 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]);
881 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 +0200882 }
883
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 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 +0200885
Gilles Peskine5197c662020-08-26 17:03:24 +0200886 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
888 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
889 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
890 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200891
Gilles Peskine5197c662020-08-26 17:03:24 +0200892 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100893 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
894 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
896 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200897
Gilles Peskine5197c662020-08-26 17:03:24 +0200898 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
900 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
901 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
902 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200903
Gilles Peskine5197c662020-08-26 17:03:24 +0200904 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
906 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
907 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
908 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200909
Gilles Peskine449bd832023-01-11 14:50:10 +0100910 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
911 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
912 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
913 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000914
Gilles Peskine449bd832023-01-11 14:50:10 +0100915 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500916
Gilles Peskine449bd832023-01-11 14:50:10 +0100917 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200918}
919#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
920
921/*
922 * AES-ECB block decryption
923 */
924#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100925int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
926 const unsigned char input[16],
927 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200928{
929 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100930 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200932 uint32_t X[4];
933 uint32_t Y[4];
934 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200935
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
937 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
938 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
939 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200940
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
942 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]);
943 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 +0200944 }
945
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 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 +0200947
Gilles Peskine5197c662020-08-26 17:03:24 +0200948 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
950 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
951 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
952 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200953
Gilles Peskine5197c662020-08-26 17:03:24 +0200954 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
956 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
957 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
958 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200959
Gilles Peskine5197c662020-08-26 17:03:24 +0200960 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
962 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
963 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
964 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200965
Gilles Peskine5197c662020-08-26 17:03:24 +0200966 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100967 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
968 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
969 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
970 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200971
Gilles Peskine449bd832023-01-11 14:50:10 +0100972 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
973 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
974 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
975 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000976
Gilles Peskine449bd832023-01-11 14:50:10 +0100977 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200980}
981#endif /* !MBEDTLS_AES_DECRYPT_ALT */
982
Gilles Peskine0de8f852023-03-16 17:14:59 +0100983#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100984/* VIA Padlock and our intrinsics-based implementation of AESNI require
985 * the round keys to be aligned on a 16-byte boundary. We take care of this
986 * before creating them, but the AES context may have moved (this can happen
987 * if the library is called from a language with managed memory), and in later
988 * calls it might have a different alignment with respect to 16-byte memory.
989 * So we may need to realign.
990 */
991static void aes_maybe_realign(mbedtls_aes_context *ctx)
992{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100993 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
994 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100995 memmove(ctx->buf + new_offset, // new address
996 ctx->buf + ctx->rk_offset, // current address
997 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
998 ctx->rk_offset = new_offset;
999 }
1000}
1001#endif
1002
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001003/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001004 * AES-ECB block encryption/decryption
1005 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001006int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1007 int mode,
1008 const unsigned char input[16],
1009 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001010{
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001012 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001013 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001014
Gilles Peskine0de8f852023-03-16 17:14:59 +01001015#if defined(MAY_NEED_TO_ALIGN)
1016 aes_maybe_realign(ctx);
1017#endif
1018
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001019#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001020 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1021 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1022 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001023#endif
1024
Jerry Yu2bb3d812023-01-10 17:38:26 +08001025#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1026 if (mbedtls_aesce_has_support()) {
1027 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1028 }
1029#endif
1030
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001033 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001034 }
1035#endif
1036
Gilles Peskine449bd832023-01-11 14:50:10 +01001037 if (mode == MBEDTLS_AES_ENCRYPT) {
1038 return mbedtls_internal_aes_encrypt(ctx, input, output);
1039 } else {
1040 return mbedtls_internal_aes_decrypt(ctx, input, output);
1041 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001042}
1043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001045
1046#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001047/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1048 * the result for the next block in CBC, and the cost of transferring that data from
1049 * NEON registers, it is faster to use the following on aarch64.
1050 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001051#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001052 mbedtls_put_unaligned_uint64(r, \
1053 mbedtls_get_unaligned_uint64(a) ^ \
1054 mbedtls_get_unaligned_uint64(b)); \
1055 mbedtls_put_unaligned_uint64(r + 8, \
1056 mbedtls_get_unaligned_uint64(a + 8) ^ \
1057 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001058} while (0)
1059#else
1060#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1061#endif
1062
Paul Bakker5121ce52009-01-03 21:22:43 +00001063/*
1064 * AES-CBC buffer encryption/decryption
1065 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001066int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1067 int mode,
1068 size_t length,
1069 unsigned char iv[16],
1070 const unsigned char *input,
1071 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001072{
Gilles Peskine7820a572021-07-07 21:08:28 +02001073 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001074 unsigned char temp[16];
1075
Gilles Peskine449bd832023-01-11 14:50:10 +01001076 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001077 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001079
Gilles Peskine449bd832023-01-11 14:50:10 +01001080 if (length % 16) {
1081 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1082 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 if (aes_padlock_ace > 0) {
1086 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1087 return 0;
1088 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001089
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001090 // If padlock data misaligned, we just fall back to
1091 // unaccelerated mode
1092 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001093 }
1094#endif
1095
Dave Rodgman906c63c2023-06-14 17:53:51 +01001096 const unsigned char *ivp = iv;
1097
Gilles Peskine449bd832023-01-11 14:50:10 +01001098 if (mode == MBEDTLS_AES_DECRYPT) {
1099 while (length > 0) {
1100 memcpy(temp, input, 16);
1101 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1102 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001103 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001104 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001105 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001106
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001108
1109 input += 16;
1110 output += 16;
1111 length -= 16;
1112 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001113 } else {
1114 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001115 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001116
Gilles Peskine449bd832023-01-11 14:50:10 +01001117 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1118 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001119 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001121 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001122
1123 input += 16;
1124 output += 16;
1125 length -= 16;
1126 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001127 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001128 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001129 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001130
Gilles Peskine7820a572021-07-07 21:08:28 +02001131exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001133}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001134#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001135
Aorimn5f778012016-06-09 23:22:58 +02001136#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001137
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001138typedef unsigned char mbedtls_be128[16];
1139
1140/*
1141 * GF(2^128) multiplication function
1142 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001143 * This function multiplies a field element by x in the polynomial field
1144 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001145 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001146 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001147 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001148static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1149 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001150{
1151 uint64_t a, b, ra, rb;
1152
Gilles Peskine449bd832023-01-11 14:50:10 +01001153 a = MBEDTLS_GET_UINT64_LE(x, 0);
1154 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001155
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1157 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001158
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1160 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001161}
1162
Aorimn5f778012016-06-09 23:22:58 +02001163/*
1164 * AES-XTS buffer encryption/decryption
1165 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001166int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1167 int mode,
1168 size_t length,
1169 const unsigned char data_unit[16],
1170 const unsigned char *input,
1171 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001172{
Janos Follath24eed8d2019-11-22 13:21:35 +00001173 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001174 size_t blocks = length / 16;
1175 size_t leftover = length % 16;
1176 unsigned char tweak[16];
1177 unsigned char prev_tweak[16];
1178 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001179
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001181 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001182 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001183
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001184 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001186 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 }
Aorimn5f778012016-06-09 23:22:58 +02001188
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001189 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001191 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 }
Aorimn5f778012016-06-09 23:22:58 +02001193
Jaeden Amerod82cd862018-04-28 15:02:45 +01001194 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1196 data_unit, tweak);
1197 if (ret != 0) {
1198 return ret;
1199 }
Aorimn5f778012016-06-09 23:22:58 +02001200
Gilles Peskine449bd832023-01-11 14:50:10 +01001201 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001202 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001203 /* We are on the last block in a decrypt operation that has
1204 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001205 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206 * the leftovers and then update the current tweak for use on this,
1207 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 memcpy(prev_tweak, tweak, sizeof(tweak));
1209 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210 }
1211
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213
Gilles Peskine449bd832023-01-11 14:50:10 +01001214 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1215 if (ret != 0) {
1216 return ret;
1217 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001220
1221 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001223
1224 output += 16;
1225 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001226 }
1227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001229 /* If we are on the leftover bytes in a decrypt operation, we need to
1230 * use the previous tweak for these bytes (as saved in prev_tweak). */
1231 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001232
Jaeden Amerod82cd862018-04-28 15:02:45 +01001233 /* We are now on the final part of the data unit, which doesn't divide
1234 * evenly by 16. It's time for ciphertext stealing. */
1235 size_t i;
1236 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001237
Jaeden Amerod82cd862018-04-28 15:02:45 +01001238 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001239 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001240 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001241 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001242 }
Aorimn5f778012016-06-09 23:22:58 +02001243
Dave Rodgman069e7f42022-11-24 19:37:26 +00001244 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001246
Jaeden Amerod82cd862018-04-28 15:02:45 +01001247 /* Copy ciphertext bytes from the previous block for input in this
1248 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001250
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1252 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001253 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 }
Aorimn5f778012016-06-09 23:22:58 +02001255
Jaeden Amerod82cd862018-04-28 15:02:45 +01001256 /* Write the result back to the previous block, overriding the previous
1257 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001259 }
1260
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001262}
1263#endif /* MBEDTLS_CIPHER_MODE_XTS */
1264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001265#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001266/*
1267 * AES-CFB128 buffer encryption/decryption
1268 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001269int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1270 int mode,
1271 size_t length,
1272 size_t *iv_off,
1273 unsigned char iv[16],
1274 const unsigned char *input,
1275 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001276{
Paul Bakker27fdf462011-06-09 13:55:13 +00001277 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001278 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001279 size_t n;
1280
Gilles Peskine449bd832023-01-11 14:50:10 +01001281 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001282 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001283 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001284
1285 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001286
Gilles Peskine449bd832023-01-11 14:50:10 +01001287 if (n > 15) {
1288 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1289 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001290
Gilles Peskine449bd832023-01-11 14:50:10 +01001291 if (mode == MBEDTLS_AES_DECRYPT) {
1292 while (length--) {
1293 if (n == 0) {
1294 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1295 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001296 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001297 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001298 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001299
1300 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001301 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001302 iv[n] = (unsigned char) c;
1303
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001305 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001306 } else {
1307 while (length--) {
1308 if (n == 0) {
1309 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1310 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001311 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001312 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001313 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001316
Gilles Peskine449bd832023-01-11 14:50:10 +01001317 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001318 }
1319 }
1320
1321 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001322 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001323
Gilles Peskine7820a572021-07-07 21:08:28 +02001324exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001325 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001326}
Paul Bakker556efba2014-01-24 15:38:12 +01001327
1328/*
1329 * AES-CFB8 buffer encryption/decryption
1330 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001331int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1332 int mode,
1333 size_t length,
1334 unsigned char iv[16],
1335 const unsigned char *input,
1336 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001337{
Gilles Peskine7820a572021-07-07 21:08:28 +02001338 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001339 unsigned char c;
1340 unsigned char ov[17];
1341
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001343 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 }
1345 while (length--) {
1346 memcpy(ov, iv, 16);
1347 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1348 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001349 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 }
Paul Bakker556efba2014-01-24 15:38:12 +01001351
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001353 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 }
Paul Bakker556efba2014-01-24 15:38:12 +01001355
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001357
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001359 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001360 }
Paul Bakker556efba2014-01-24 15:38:12 +01001361
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001363 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001364 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001365
Gilles Peskine7820a572021-07-07 21:08:28 +02001366exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001367 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001368}
Simon Butcher76a5b222018-04-22 22:57:27 +01001369#endif /* MBEDTLS_CIPHER_MODE_CFB */
1370
1371#if defined(MBEDTLS_CIPHER_MODE_OFB)
1372/*
1373 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1374 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001375int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1376 size_t length,
1377 size_t *iv_off,
1378 unsigned char iv[16],
1379 const unsigned char *input,
1380 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001381{
Simon Butcherad4e4932018-04-29 00:43:47 +01001382 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001383 size_t n;
1384
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001385 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 if (n > 15) {
1388 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1389 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001390
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 while (length--) {
1392 if (n == 0) {
1393 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1394 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001395 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001397 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001398 *output++ = *input++ ^ iv[n];
1399
Gilles Peskine449bd832023-01-11 14:50:10 +01001400 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001401 }
1402
1403 *iv_off = n;
1404
Simon Butcherad4e4932018-04-29 00:43:47 +01001405exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001407}
1408#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001410#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001411/*
1412 * AES-CTR buffer encryption/decryption
1413 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001414int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1415 size_t length,
1416 size_t *nc_off,
1417 unsigned char nonce_counter[16],
1418 unsigned char stream_block[16],
1419 const unsigned char *input,
1420 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001421{
Paul Bakker369e14b2012-04-18 14:16:09 +00001422 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001423 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001424 size_t n;
1425
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001426 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001427
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 if (n > 0x0F) {
1429 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1430 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001431
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 while (length--) {
1433 if (n == 0) {
1434 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1435 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001436 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001438
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 for (i = 16; i > 0; i--) {
1440 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001441 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001442 }
1443 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001444 }
1445 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001447
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001449 }
1450
1451 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001452 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001453
Gilles Peskine7820a572021-07-07 21:08:28 +02001454exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001455 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001456}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001459#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001461#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001462/*
1463 * AES test vectors from:
1464 *
1465 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1466 */
Yanray Wang62c99912023-05-11 11:06:53 +08001467static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001468{
1469 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1470 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001471#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001472 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1473 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1474 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1475 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001476#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001477};
1478
Yanray Wang62c99912023-05-11 11:06:53 +08001479static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001480{
1481 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1482 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001483#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001484 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1485 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1486 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1487 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001488#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001489};
1490
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001491#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001492static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001493{
1494 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1495 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001496#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001497 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1498 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1499 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1500 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001501#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001502};
1503
Yanray Wang62c99912023-05-11 11:06:53 +08001504static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001505{
1506 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1507 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001508#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001509 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1510 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1511 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1512 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001513#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001514};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001515#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001516
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001517#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001518/*
1519 * AES-CFB128 test vectors from:
1520 *
1521 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1522 */
Yanray Wang62c99912023-05-11 11:06:53 +08001523static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001524{
1525 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1526 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001527#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001528 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1529 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1530 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1531 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1532 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1533 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1534 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001535#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001536};
1537
1538static const unsigned char aes_test_cfb128_iv[16] =
1539{
1540 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1541 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1542};
1543
1544static const unsigned char aes_test_cfb128_pt[64] =
1545{
1546 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1547 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1548 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1549 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1550 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1551 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1552 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1553 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1554};
1555
Yanray Wang62c99912023-05-11 11:06:53 +08001556static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001557{
1558 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1559 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1560 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1561 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1562 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1563 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1564 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1565 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001566#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001567 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1568 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1569 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1570 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1571 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1572 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1573 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1574 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1575 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1576 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1577 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1578 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1579 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1580 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1581 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1582 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001583#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001584};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001586
Simon Butcherad4e4932018-04-29 00:43:47 +01001587#if defined(MBEDTLS_CIPHER_MODE_OFB)
1588/*
1589 * AES-OFB test vectors from:
1590 *
Simon Butcher5db13622018-06-04 22:11:25 +01001591 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001592 */
Yanray Wang62c99912023-05-11 11:06:53 +08001593static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001594{
1595 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1596 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001597#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001598 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1599 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1600 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1601 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1602 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1603 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1604 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001605#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001606};
1607
1608static const unsigned char aes_test_ofb_iv[16] =
1609{
1610 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1611 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1612};
1613
1614static const unsigned char aes_test_ofb_pt[64] =
1615{
1616 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1617 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1618 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1619 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1620 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1621 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1622 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1623 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1624};
1625
Yanray Wang62c99912023-05-11 11:06:53 +08001626static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001627{
1628 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1629 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1630 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1631 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1632 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1633 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1634 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1635 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001636#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001637 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1638 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1639 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1640 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1641 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1642 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1643 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1644 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1645 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1646 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1647 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1648 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1649 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1650 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1651 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1652 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001653#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001654};
1655#endif /* MBEDTLS_CIPHER_MODE_OFB */
1656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001657#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001658/*
1659 * AES-CTR test vectors from:
1660 *
1661 * http://www.faqs.org/rfcs/rfc3686.html
1662 */
1663
Yanray Wang62c99912023-05-11 11:06:53 +08001664static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001665{
1666 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1667 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1668 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1669 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1670 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1671 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1672};
1673
Yanray Wang62c99912023-05-11 11:06:53 +08001674static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001675{
1676 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1678 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1679 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1680 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1681 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1682};
1683
Yanray Wang62c99912023-05-11 11:06:53 +08001684static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001685{
1686 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1687 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001688 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1689 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1690 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1691 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1692
1693 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1694 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1695 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1696 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1697 0x20, 0x21, 0x22, 0x23 }
1698};
1699
Yanray Wang62c99912023-05-11 11:06:53 +08001700static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001701{
1702 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1703 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1704 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1705 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1706 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1707 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1708 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1709 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1710 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1711 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1712 0x25, 0xB2, 0x07, 0x2F }
1713};
1714
1715static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001716{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001718
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001719#if defined(MBEDTLS_CIPHER_MODE_XTS)
1720/*
1721 * AES-XTS test vectors from:
1722 *
1723 * IEEE P1619/D16 Annex B
1724 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1725 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1726 */
1727static const unsigned char aes_test_xts_key[][32] =
1728{
1729 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1733 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1734 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1735 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1736 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1737 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1738 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1739 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1740 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1741};
1742
1743static const unsigned char aes_test_xts_pt32[][32] =
1744{
1745 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1749 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1750 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1751 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
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};
1758
1759static const unsigned char aes_test_xts_ct32[][32] =
1760{
1761 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1762 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1763 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1764 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1765 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1766 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1767 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1768 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1769 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1770 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1771 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1772 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1773};
1774
1775static const unsigned char aes_test_xts_data_unit[][16] =
1776{
Gilles Peskine449bd832023-01-11 14:50:10 +01001777 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1779 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1781 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001783};
1784
1785#endif /* MBEDTLS_CIPHER_MODE_XTS */
1786
Paul Bakker5121ce52009-01-03 21:22:43 +00001787/*
1788 * Checkup routine
1789 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001790int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001791{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001792 int ret = 0, i, j, u, mode;
1793 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001794 unsigned char key[32];
1795 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001796 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001797#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1798 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001799 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001800#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001802 unsigned char prv[16];
1803#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001804#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1805 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001806 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001807#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001808#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001809 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001810#endif
1811#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001812 unsigned char nonce_counter[16];
1813 unsigned char stream_block[16];
1814#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001815 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001816
Gilles Peskine449bd832023-01-11 14:50:10 +01001817 memset(key, 0, 32);
1818 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001820 if (verbose != 0) {
1821#if defined(MBEDTLS_AES_ALT)
1822 mbedtls_printf(" AES note: alternative implementation.\n");
1823#else /* MBEDTLS_AES_ALT */
1824#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1825 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1826 mbedtls_printf(" AES note: using VIA Padlock.\n");
1827 } else
1828#endif
1829#if defined(MBEDTLS_AESNI_HAVE_CODE)
1830 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1831 mbedtls_printf(" AES note: using AESNI.\n");
1832 } else
1833#endif
1834#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1835 if (mbedtls_aesce_has_support()) {
1836 mbedtls_printf(" AES note: using AESCE.\n");
1837 } else
1838#endif
1839 mbedtls_printf(" AES note: built-in implementation.\n");
1840#endif /* MBEDTLS_AES_ALT */
1841 }
1842
Paul Bakker5121ce52009-01-03 21:22:43 +00001843 /*
1844 * ECB mode
1845 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001846 {
1847 static const int num_tests =
1848 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001849
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001850 for (i = 0; i < num_tests << 1; i++) {
1851 u = i >> 1;
1852 keybits = 128 + u * 64;
1853 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001854
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001855 if (verbose != 0) {
1856 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1857 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1858 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001859
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001860 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001861
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001862 if (mode == MBEDTLS_AES_DECRYPT) {
1863 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1864 aes_tests = aes_test_ecb_dec[u];
1865 } else {
1866 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1867 aes_tests = aes_test_ecb_enc[u];
1868 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001869
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001870 /*
1871 * AES-192 is an optional feature that may be unavailable when
1872 * there is an alternative underlying implementation i.e. when
1873 * MBEDTLS_AES_ALT is defined.
1874 */
1875 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1876 mbedtls_printf("skipped\n");
1877 continue;
1878 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001879 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001880 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001881
1882 for (j = 0; j < 10000; j++) {
1883 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1884 if (ret != 0) {
1885 goto exit;
1886 }
1887 }
1888
1889 if (memcmp(buf, aes_tests, 16) != 0) {
1890 ret = 1;
1891 goto exit;
1892 }
1893
1894 if (verbose != 0) {
1895 mbedtls_printf("passed\n");
1896 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001897 }
1898
Gilles Peskine449bd832023-01-11 14:50:10 +01001899 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001900 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001902 }
1903
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001904#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001905 /*
1906 * CBC mode
1907 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001908 {
1909 static const int num_tests =
1910 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001911
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001912 for (i = 0; i < num_tests << 1; i++) {
1913 u = i >> 1;
1914 keybits = 128 + u * 64;
1915 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001916
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001917 if (verbose != 0) {
1918 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1919 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001920 }
1921
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001922 memset(iv, 0, 16);
1923 memset(prv, 0, 16);
1924 memset(buf, 0, 16);
1925
1926 if (mode == MBEDTLS_AES_DECRYPT) {
1927 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1928 aes_tests = aes_test_cbc_dec[u];
1929 } else {
1930 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1931 aes_tests = aes_test_cbc_enc[u];
1932 }
1933
1934 /*
1935 * AES-192 is an optional feature that may be unavailable when
1936 * there is an alternative underlying implementation i.e. when
1937 * MBEDTLS_AES_ALT is defined.
1938 */
1939 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1940 mbedtls_printf("skipped\n");
1941 continue;
1942 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001943 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001944 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001945
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001946 for (j = 0; j < 10000; j++) {
1947 if (mode == MBEDTLS_AES_ENCRYPT) {
1948 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001949
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001950 memcpy(tmp, prv, 16);
1951 memcpy(prv, buf, 16);
1952 memcpy(buf, tmp, 16);
1953 }
1954
1955 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1956 if (ret != 0) {
1957 goto exit;
1958 }
1959
1960 }
1961
1962 if (memcmp(buf, aes_tests, 16) != 0) {
1963 ret = 1;
1964 goto exit;
1965 }
1966
1967 if (verbose != 0) {
1968 mbedtls_printf("passed\n");
1969 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001970 }
1971
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001973 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001974 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001975 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001978#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001979 /*
1980 * CFB128 mode
1981 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001982 {
1983 static const int num_tests =
1984 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001985
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001986 for (i = 0; i < num_tests << 1; i++) {
1987 u = i >> 1;
1988 keybits = 128 + u * 64;
1989 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001990
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001991 if (verbose != 0) {
1992 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1993 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1994 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001995
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001996 memcpy(iv, aes_test_cfb128_iv, 16);
1997 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001998
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001999 offset = 0;
2000 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2001 /*
2002 * AES-192 is an optional feature that may be unavailable when
2003 * there is an alternative underlying implementation i.e. when
2004 * MBEDTLS_AES_ALT is defined.
2005 */
2006 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2007 mbedtls_printf("skipped\n");
2008 continue;
2009 } else if (ret != 0) {
2010 goto exit;
2011 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002012
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002013 if (mode == MBEDTLS_AES_DECRYPT) {
2014 memcpy(buf, aes_test_cfb128_ct[u], 64);
2015 aes_tests = aes_test_cfb128_pt;
2016 } else {
2017 memcpy(buf, aes_test_cfb128_pt, 64);
2018 aes_tests = aes_test_cfb128_ct[u];
2019 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002020
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002021 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2022 if (ret != 0) {
2023 goto exit;
2024 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002025
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002026 if (memcmp(buf, aes_tests, 64) != 0) {
2027 ret = 1;
2028 goto exit;
2029 }
2030
2031 if (verbose != 0) {
2032 mbedtls_printf("passed\n");
2033 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002034 }
2035
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002037 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002039 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002040#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002041
Simon Butcherad4e4932018-04-29 00:43:47 +01002042#if defined(MBEDTLS_CIPHER_MODE_OFB)
2043 /*
2044 * OFB mode
2045 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002046 {
2047 static const int num_tests =
2048 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002049
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002050 for (i = 0; i < num_tests << 1; i++) {
2051 u = i >> 1;
2052 keybits = 128 + u * 64;
2053 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002054
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002055 if (verbose != 0) {
2056 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2057 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2058 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002059
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002060 memcpy(iv, aes_test_ofb_iv, 16);
2061 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002062
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002063 offset = 0;
2064 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2065 /*
2066 * AES-192 is an optional feature that may be unavailable when
2067 * there is an alternative underlying implementation i.e. when
2068 * MBEDTLS_AES_ALT is defined.
2069 */
2070 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2071 mbedtls_printf("skipped\n");
2072 continue;
2073 } else if (ret != 0) {
2074 goto exit;
2075 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002076
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002077 if (mode == MBEDTLS_AES_DECRYPT) {
2078 memcpy(buf, aes_test_ofb_ct[u], 64);
2079 aes_tests = aes_test_ofb_pt;
2080 } else {
2081 memcpy(buf, aes_test_ofb_pt, 64);
2082 aes_tests = aes_test_ofb_ct[u];
2083 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002084
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002085 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2086 if (ret != 0) {
2087 goto exit;
2088 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002089
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002090 if (memcmp(buf, aes_tests, 64) != 0) {
2091 ret = 1;
2092 goto exit;
2093 }
2094
2095 if (verbose != 0) {
2096 mbedtls_printf("passed\n");
2097 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002098 }
2099
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002101 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002103 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002104#endif /* MBEDTLS_CIPHER_MODE_OFB */
2105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002106#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002107 /*
2108 * CTR mode
2109 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002110 {
2111 static const int num_tests =
2112 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002113
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002114 for (i = 0; i < num_tests << 1; i++) {
2115 u = i >> 1;
2116 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002117
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002118 if (verbose != 0) {
2119 mbedtls_printf(" AES-CTR-128 (%s): ",
2120 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2121 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002122
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002123 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2124 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002125
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002126 offset = 0;
2127 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2128 goto exit;
2129 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002130
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002131 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002132
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002133 if (mode == MBEDTLS_AES_DECRYPT) {
2134 memcpy(buf, aes_test_ctr_ct[u], len);
2135 aes_tests = aes_test_ctr_pt[u];
2136 } else {
2137 memcpy(buf, aes_test_ctr_pt[u], len);
2138 aes_tests = aes_test_ctr_ct[u];
2139 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002140
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002141 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2142 stream_block, buf, buf);
2143 if (ret != 0) {
2144 goto exit;
2145 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002146
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002147 if (memcmp(buf, aes_tests, len) != 0) {
2148 ret = 1;
2149 goto exit;
2150 }
2151
2152 if (verbose != 0) {
2153 mbedtls_printf("passed\n");
2154 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002155 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002156 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002157
Gilles Peskine449bd832023-01-11 14:50:10 +01002158 if (verbose != 0) {
2159 mbedtls_printf("\n");
2160 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002161#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002162
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002163#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002164 /*
2165 * XTS mode
2166 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002167 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002168 static const int num_tests =
2169 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2170 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002171
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002173
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 for (i = 0; i < num_tests << 1; i++) {
2175 const unsigned char *data_unit;
2176 u = i >> 1;
2177 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002178
Gilles Peskine449bd832023-01-11 14:50:10 +01002179 if (verbose != 0) {
2180 mbedtls_printf(" AES-XTS-128 (%s): ",
2181 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2182 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002183
Gilles Peskine449bd832023-01-11 14:50:10 +01002184 memset(key, 0, sizeof(key));
2185 memcpy(key, aes_test_xts_key[u], 32);
2186 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002189
Gilles Peskine449bd832023-01-11 14:50:10 +01002190 if (mode == MBEDTLS_AES_DECRYPT) {
2191 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2192 if (ret != 0) {
2193 goto exit;
2194 }
2195 memcpy(buf, aes_test_xts_ct32[u], len);
2196 aes_tests = aes_test_xts_pt32[u];
2197 } else {
2198 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2199 if (ret != 0) {
2200 goto exit;
2201 }
2202 memcpy(buf, aes_test_xts_pt32[u], len);
2203 aes_tests = aes_test_xts_ct32[u];
2204 }
2205
2206
2207 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2208 buf, buf);
2209 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002210 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002211 }
2212
2213 if (memcmp(buf, aes_tests, len) != 0) {
2214 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002215 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002216 }
2217
2218 if (verbose != 0) {
2219 mbedtls_printf("passed\n");
2220 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002221 }
2222
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 if (verbose != 0) {
2224 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002225 }
2226
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002228 }
2229#endif /* MBEDTLS_CIPHER_MODE_XTS */
2230
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002231 ret = 0;
2232
2233exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002234 if (ret != 0 && verbose != 0) {
2235 mbedtls_printf("failed\n");
2236 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002237
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002239
Gilles Peskine449bd832023-01-11 14:50:10 +01002240 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002241}
2242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002243#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245#endif /* MBEDTLS_AES_C */