blob: 240702f82203e7ad5e2a1da2a278e8013b7bd666 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
21 *
22 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
23 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
31
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030033#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_PADLOCK_C)
Chris Jones16dbaeb2021-03-09 17:47:55 +000037#include "padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000040#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080042#if defined(MBEDTLS_AESCE_C)
43#include "aesce.h"
44#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020049
Gilles Peskine0f454e42023-03-16 14:58:46 +010050#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +000051static int aes_padlock_ace = -1;
52#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * Forward S-box
57 */
58static const unsigned char FSb[256] =
59{
60 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
61 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
62 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
63 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
64 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
65 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
66 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
67 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
68 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
69 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
70 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
71 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
72 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
73 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
74 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
75 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
76 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
77 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
78 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
79 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
80 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
81 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
82 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
83 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
84 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
85 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
86 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
87 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
88 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
89 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
90 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
91 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
92};
93
94/*
95 * Forward tables
96 */
97#define FT \
98\
Gilles Peskine449bd832023-01-11 14:50:10 +010099 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
100 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
101 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
102 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
103 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
104 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
105 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
106 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
107 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
108 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
109 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
110 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
111 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
112 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
113 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
114 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
115 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
116 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
117 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
118 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
119 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
120 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
121 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
122 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
123 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
124 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
125 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
126 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
127 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
128 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
129 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
130 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
131 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
132 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
133 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
134 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
135 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
136 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
137 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
138 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
139 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
140 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
141 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
142 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
143 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
144 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
145 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
146 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
147 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
148 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
149 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
150 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
151 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
152 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
153 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
154 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
155 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
156 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
157 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
158 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
159 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
160 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
161 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
162 V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000165static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000166#undef V
167
Hanno Beckerad049a92017-06-19 16:31:54 +0100168#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000171static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000172#undef V
173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000175static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000176#undef V
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000179static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000180#undef V
181
Hanno Becker177d3cf2017-06-07 15:52:48 +0100182#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200183
Paul Bakker5121ce52009-01-03 21:22:43 +0000184#undef FT
185
186/*
187 * Reverse S-box
188 */
189static const unsigned char RSb[256] =
190{
191 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
192 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
193 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
194 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
195 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
196 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
197 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
198 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
199 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
200 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
201 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
202 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
203 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
204 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
205 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
206 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
207 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
208 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
209 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
210 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
211 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
212 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
213 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
214 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
215 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
216 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
217 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
218 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
219 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
220 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
221 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
222 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
223};
224
225/*
226 * Reverse tables
227 */
228#define RT \
229\
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
231 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
232 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
233 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
234 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
235 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
236 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
237 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
238 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
239 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
240 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
241 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
242 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
243 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
244 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
245 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
246 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
247 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
248 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
249 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
250 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
251 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
252 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
253 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
254 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
255 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
256 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
257 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
258 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
259 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
260 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
261 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
262 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
263 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
264 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
265 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
266 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
267 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
268 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
269 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
270 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
271 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
272 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
273 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
274 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
275 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
276 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
277 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
278 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
279 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
280 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
281 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
282 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
283 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
284 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
285 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
286 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
287 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
288 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
289 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
290 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
291 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
292 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
293 V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000294
Gilles Peskine449bd832023-01-11 14:50:10 +0100295#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000296static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000297#undef V
298
Hanno Beckerad049a92017-06-19 16:31:54 +0100299#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000302static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000303#undef V
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000307#undef V
308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000311#undef V
312
Hanno Becker177d3cf2017-06-07 15:52:48 +0100313#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200314
Paul Bakker5121ce52009-01-03 21:22:43 +0000315#undef RT
316
317/*
318 * Round constants
319 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000321{
322 0x00000001, 0x00000002, 0x00000004, 0x00000008,
323 0x00000010, 0x00000020, 0x00000040, 0x00000080,
324 0x0000001B, 0x00000036
325};
326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
329/*
330 * Forward S-box & tables
331 */
332static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200333static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100334#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200335static uint32_t FT1[256];
336static uint32_t FT2[256];
337static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100338#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Reverse S-box & tables
342 */
343static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000344static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100345#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346static uint32_t RT1[256];
347static uint32_t RT2[256];
348static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100349#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
351/*
352 * Round constants
353 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
356/*
357 * Tables generation code
358 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
360#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
361#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363static int aes_init_done = 0;
364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000366{
Yanray Wangfe944ce2023-06-26 18:16:01 +0800367 int i;
368 uint8_t x, y, z;
Yanray Wang5c86b172023-06-26 16:54:52 +0800369 uint8_t pow[256];
370 uint8_t log[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
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++) {
Yanray Wangfe944ce2023-06-26 18:16:01 +0800376 pow[i] = x;
Yanray Wang5c86b172023-06-26 16:54:52 +0800377 log[x] = (uint8_t) i;
Yanray Wangfe944ce2023-06-26 18:16:01 +0800378 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++) {
Yanray Wangfe944ce2023-06-26 18:16:01 +0800385 RCON[i] = x;
386 x = 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
Yanray Wangfe944ce2023-06-26 18:16:01 +0800398 y = x; y = (y << 1) | (y >> 7);
399 x ^= y; y = (y << 1) | (y >> 7);
400 x ^= y; y = (y << 1) | (y >> 7);
401 x ^= y; y = (y << 1) | (y >> 7);
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 x ^= y ^ 0x63;
403
Yanray Wangfe944ce2023-06-26 18:16:01 +0800404 FSb[i] = x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000405 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];
Yanray Wangfe944ce2023-06-26 18:16:01 +0800413 y = XTIME(x);
414 z = 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
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200442#undef ROTL8
443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000445
Hanno Beckerad049a92017-06-19 16:31:54 +0100446#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
449#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
450#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200451
452#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100453#define AES_RT1(idx) ROTL8(RT0[idx])
454#define AES_RT2(idx) ROTL16(RT0[idx])
455#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200456
457#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100458#define AES_FT1(idx) ROTL8(FT0[idx])
459#define AES_FT2(idx) ROTL16(FT0[idx])
460#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200461
Hanno Becker177d3cf2017-06-07 15:52:48 +0100462#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200463
464#define AES_RT0(idx) RT0[idx]
465#define AES_RT1(idx) RT1[idx]
466#define AES_RT2(idx) RT2[idx]
467#define AES_RT3(idx) RT3[idx]
468
469#define AES_FT0(idx) FT0[idx]
470#define AES_FT1(idx) FT1[idx]
471#define AES_FT2(idx) FT2[idx]
472#define AES_FT3(idx) FT3[idx]
473
Hanno Becker177d3cf2017-06-07 15:52:48 +0100474#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200475
Gilles Peskine449bd832023-01-11 14:50:10 +0100476void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200477{
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200479}
480
Gilles Peskine449bd832023-01-11 14:50:10 +0100481void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200482{
Gilles Peskine449bd832023-01-11 14:50:10 +0100483 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200484 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200488}
489
Jaeden Amero9366feb2018-05-29 18:55:17 +0100490#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100491void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100492{
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 mbedtls_aes_init(&ctx->crypt);
494 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100495}
496
Gilles Peskine449bd832023-01-11 14:50:10 +0100497void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100498{
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100500 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 }
Simon Butcher5201e412018-12-06 17:40:14 +0000502
Gilles Peskine449bd832023-01-11 14:50:10 +0100503 mbedtls_aes_free(&ctx->crypt);
504 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100505}
506#endif /* MBEDTLS_CIPHER_MODE_XTS */
507
Gilles Peskine0de8f852023-03-16 17:14:59 +0100508/* Some implementations need the round keys to be aligned.
509 * Return an offset to be added to buf, such that (buf + offset) is
510 * correctly aligned.
511 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
512 * i.e. an offset of 1 means 4 bytes and so on.
513 */
514#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100515 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100516#define MAY_NEED_TO_ALIGN
517#endif
518static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
519{
520#if defined(MAY_NEED_TO_ALIGN)
521 int align_16_bytes = 0;
522
523#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
524 if (aes_padlock_ace == -1) {
525 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
526 }
527 if (aes_padlock_ace) {
528 align_16_bytes = 1;
529 }
530#endif
531
Gilles Peskine9c682e72023-03-16 17:21:33 +0100532#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100533 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
534 align_16_bytes = 1;
535 }
536#endif
537
538 if (align_16_bytes) {
539 /* These implementations needs 16-byte alignment
540 * for the round key array. */
541 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
542 if (delta == 0) {
543 return 0;
544 } else {
545 return 4 - delta; // 16 bytes = 4 uint32_t
546 }
547 }
548#else /* MAY_NEED_TO_ALIGN */
549 (void) buf;
550#endif /* MAY_NEED_TO_ALIGN */
551
552 return 0;
553}
554
Paul Bakker5121ce52009-01-03 21:22:43 +0000555/*
556 * AES key schedule (encryption)
557 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200558#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100559int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
560 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000561{
Paul Bakker23986e52011-04-24 08:57:21 +0000562 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000563 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000566 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800567#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000568 case 192: ctx->nr = 12; break;
569 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800570#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100571 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000572 }
573
Simon Butcher5201e412018-12-06 17:40:14 +0000574#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100575 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000576 aes_gen_tables();
577 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000578 }
579#endif
580
Gilles Peskine0de8f852023-03-16 17:14:59 +0100581 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100582 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000583
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100584#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
586 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
587 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100588#endif
589
Jerry Yu3f2fb712023-01-10 17:05:42 +0800590#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
591 if (mbedtls_aesce_has_support()) {
592 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
593 }
594#endif
595
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 for (i = 0; i < (keybits >> 5); i++) {
597 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000598 }
599
Gilles Peskine449bd832023-01-11 14:50:10 +0100600 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000601 case 10:
602
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000604 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
606 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
607 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
608 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000609
610 RK[5] = RK[1] ^ RK[4];
611 RK[6] = RK[2] ^ RK[5];
612 RK[7] = RK[3] ^ RK[6];
613 }
614 break;
615
Arto Kinnunen732ca322023-04-14 14:26:10 +0800616#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000617 case 12:
618
Gilles Peskine449bd832023-01-11 14:50:10 +0100619 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000620 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100621 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
622 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
623 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
624 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000625
626 RK[7] = RK[1] ^ RK[6];
627 RK[8] = RK[2] ^ RK[7];
628 RK[9] = RK[3] ^ RK[8];
629 RK[10] = RK[4] ^ RK[9];
630 RK[11] = RK[5] ^ RK[10];
631 }
632 break;
633
634 case 14:
635
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000637 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100638 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
639 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
640 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
641 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000642
643 RK[9] = RK[1] ^ RK[8];
644 RK[10] = RK[2] ^ RK[9];
645 RK[11] = RK[3] ^ RK[10];
646
647 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
651 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000652
653 RK[13] = RK[5] ^ RK[12];
654 RK[14] = RK[6] ^ RK[13];
655 RK[15] = RK[7] ^ RK[14];
656 }
657 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800658#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000659 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000660
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000662}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200663#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
665/*
666 * AES key schedule (decryption)
667 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200668#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100669int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
670 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000671{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200672 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000674 uint32_t *RK;
675 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200676
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000678
Gilles Peskine0de8f852023-03-16 17:14:59 +0100679 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100680 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000681
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200682 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100683 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200684 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000686
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200687 ctx->nr = cty.nr;
688
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100689#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
691 mbedtls_aesni_inverse_key((unsigned char *) RK,
692 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200693 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100694 }
695#endif
696
Jerry Yue096da12023-01-10 17:07:01 +0800697#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
698 if (mbedtls_aesce_has_support()) {
699 mbedtls_aesce_inverse_key(
700 (unsigned char *) RK,
701 (const unsigned char *) (cty.buf + cty.rk_offset),
702 ctx->nr);
703 goto exit;
704 }
705#endif
706
Werner Lewisdd76ef32022-05-30 12:00:21 +0100707 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000708
709 *RK++ = *SK++;
710 *RK++ = *SK++;
711 *RK++ = *SK++;
712 *RK++ = *SK++;
713
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
715 for (j = 0; j < 4; j++, SK++) {
716 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
717 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
718 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
719 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000720 }
721 }
722
723 *RK++ = *SK++;
724 *RK++ = *SK++;
725 *RK++ = *SK++;
726 *RK++ = *SK++;
727
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200728exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000730
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000732}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100733#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100734
735#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100736static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
737 unsigned int keybits,
738 const unsigned char **key1,
739 unsigned int *key1bits,
740 const unsigned char **key2,
741 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100742{
743 const unsigned int half_keybits = keybits / 2;
744 const unsigned int half_keybytes = half_keybits / 8;
745
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100747 case 256: break;
748 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100749 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100750 }
751
752 *key1bits = half_keybits;
753 *key2bits = half_keybits;
754 *key1 = &key[0];
755 *key2 = &key[half_keybytes];
756
757 return 0;
758}
759
Gilles Peskine449bd832023-01-11 14:50:10 +0100760int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
761 const unsigned char *key,
762 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100763{
Janos Follath24eed8d2019-11-22 13:21:35 +0000764 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100765 const unsigned char *key1, *key2;
766 unsigned int key1bits, key2bits;
767
Gilles Peskine449bd832023-01-11 14:50:10 +0100768 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
769 &key2, &key2bits);
770 if (ret != 0) {
771 return ret;
772 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100773
774 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
776 if (ret != 0) {
777 return ret;
778 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100779
780 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100782}
783
Gilles Peskine449bd832023-01-11 14:50:10 +0100784int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
785 const unsigned char *key,
786 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100787{
Janos Follath24eed8d2019-11-22 13:21:35 +0000788 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100789 const unsigned char *key1, *key2;
790 unsigned int key1bits, key2bits;
791
Gilles Peskine449bd832023-01-11 14:50:10 +0100792 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
793 &key2, &key2bits);
794 if (ret != 0) {
795 return ret;
796 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100797
798 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100799 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
800 if (ret != 0) {
801 return ret;
802 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100803
804 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100805 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100806}
807#endif /* MBEDTLS_CIPHER_MODE_XTS */
808
Gilles Peskine449bd832023-01-11 14:50:10 +0100809#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100810 do \
811 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
813 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
814 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
815 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100816 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100817 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
818 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
819 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
820 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100821 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
823 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
824 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
825 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100826 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
828 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
829 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
830 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
831 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000832
Gilles Peskine449bd832023-01-11 14:50:10 +0100833#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100834 do \
835 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
837 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
838 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
839 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100840 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100841 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
842 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
843 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
844 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100845 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100846 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
847 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
848 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
849 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100850 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100851 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
852 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
853 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
854 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
855 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000856
857/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200858 * AES-ECB block encryption
859 */
860#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100861int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
862 const unsigned char input[16],
863 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200864{
865 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100866 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100867 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200868 uint32_t X[4];
869 uint32_t Y[4];
870 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200871
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
873 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
874 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
875 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200876
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
878 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]);
879 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 +0200880 }
881
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 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 +0200883
Gilles Peskine5197c662020-08-26 17:03:24 +0200884 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100885 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
886 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
887 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
888 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200889
Gilles Peskine5197c662020-08-26 17:03:24 +0200890 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
892 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
894 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200895
Gilles Peskine5197c662020-08-26 17:03:24 +0200896 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
900 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200901
Gilles Peskine5197c662020-08-26 17:03:24 +0200902 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
906 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200907
Gilles Peskine449bd832023-01-11 14:50:10 +0100908 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
909 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
910 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
911 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500914
Gilles Peskine449bd832023-01-11 14:50:10 +0100915 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200916}
917#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
918
919/*
920 * AES-ECB block decryption
921 */
922#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100923int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
924 const unsigned char input[16],
925 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200926{
927 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100928 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200930 uint32_t X[4];
931 uint32_t Y[4];
932 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200933
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
935 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
936 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
937 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
940 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]);
941 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 +0200942 }
943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 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 +0200945
Gilles Peskine5197c662020-08-26 17:03:24 +0200946 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100947 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
948 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
949 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
950 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200951
Gilles Peskine5197c662020-08-26 17:03:24 +0200952 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
956 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200957
Gilles Peskine5197c662020-08-26 17:03:24 +0200958 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
962 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200963
Gilles Peskine5197c662020-08-26 17:03:24 +0200964 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
968 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200969
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
971 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
972 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
973 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000974
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500976
Gilles Peskine449bd832023-01-11 14:50:10 +0100977 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200978}
979#endif /* !MBEDTLS_AES_DECRYPT_ALT */
980
Gilles Peskine0de8f852023-03-16 17:14:59 +0100981#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100982/* VIA Padlock and our intrinsics-based implementation of AESNI require
983 * the round keys to be aligned on a 16-byte boundary. We take care of this
984 * before creating them, but the AES context may have moved (this can happen
985 * if the library is called from a language with managed memory), and in later
986 * calls it might have a different alignment with respect to 16-byte memory.
987 * So we may need to realign.
988 */
989static void aes_maybe_realign(mbedtls_aes_context *ctx)
990{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100991 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
992 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100993 memmove(ctx->buf + new_offset, // new address
994 ctx->buf + ctx->rk_offset, // current address
995 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
996 ctx->rk_offset = new_offset;
997 }
998}
999#endif
1000
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001001/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001002 * AES-ECB block encryption/decryption
1003 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001004int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1005 int mode,
1006 const unsigned char input[16],
1007 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001008{
Gilles Peskine449bd832023-01-11 14:50:10 +01001009 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001010 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001012
Gilles Peskine0de8f852023-03-16 17:14:59 +01001013#if defined(MAY_NEED_TO_ALIGN)
1014 aes_maybe_realign(ctx);
1015#endif
1016
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001017#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001018 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1019 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1020 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001021#endif
1022
Jerry Yu2bb3d812023-01-10 17:38:26 +08001023#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1024 if (mbedtls_aesce_has_support()) {
1025 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1026 }
1027#endif
1028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001030 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001031 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001032 }
1033#endif
1034
Gilles Peskine449bd832023-01-11 14:50:10 +01001035 if (mode == MBEDTLS_AES_ENCRYPT) {
1036 return mbedtls_internal_aes_encrypt(ctx, input, output);
1037 } else {
1038 return mbedtls_internal_aes_decrypt(ctx, input, output);
1039 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001040}
1041
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001043
1044#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001045/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1046 * the result for the next block in CBC, and the cost of transferring that data from
1047 * NEON registers, it is faster to use the following on aarch64.
1048 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001049#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001050 mbedtls_put_unaligned_uint64(r, \
1051 mbedtls_get_unaligned_uint64(a) ^ \
1052 mbedtls_get_unaligned_uint64(b)); \
1053 mbedtls_put_unaligned_uint64(r + 8, \
1054 mbedtls_get_unaligned_uint64(a + 8) ^ \
1055 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001056} while (0)
1057#else
1058#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1059#endif
1060
Paul Bakker5121ce52009-01-03 21:22:43 +00001061/*
1062 * AES-CBC buffer encryption/decryption
1063 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001064int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1065 int mode,
1066 size_t length,
1067 unsigned char iv[16],
1068 const unsigned char *input,
1069 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001070{
Gilles Peskine7820a572021-07-07 21:08:28 +02001071 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 unsigned char temp[16];
1073
Gilles Peskine449bd832023-01-11 14:50:10 +01001074 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001075 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001076 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001077
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 if (length % 16) {
1079 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1080 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 if (aes_padlock_ace > 0) {
1084 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1085 return 0;
1086 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001087
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001088 // If padlock data misaligned, we just fall back to
1089 // unaccelerated mode
1090 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001091 }
1092#endif
1093
Dave Rodgman906c63c2023-06-14 17:53:51 +01001094 const unsigned char *ivp = iv;
1095
Gilles Peskine449bd832023-01-11 14:50:10 +01001096 if (mode == MBEDTLS_AES_DECRYPT) {
1097 while (length > 0) {
1098 memcpy(temp, input, 16);
1099 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1100 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001101 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001102 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001103 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001104
Gilles Peskine449bd832023-01-11 14:50:10 +01001105 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001106
1107 input += 16;
1108 output += 16;
1109 length -= 16;
1110 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 } else {
1112 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001113 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001114
Gilles Peskine449bd832023-01-11 14:50:10 +01001115 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1116 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001117 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001118 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001119 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001120
1121 input += 16;
1122 output += 16;
1123 length -= 16;
1124 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001125 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001126 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001127 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001128
Gilles Peskine7820a572021-07-07 21:08:28 +02001129exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001131}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001132#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001133
Aorimn5f778012016-06-09 23:22:58 +02001134#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001135
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001136typedef unsigned char mbedtls_be128[16];
1137
1138/*
1139 * GF(2^128) multiplication function
1140 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001141 * This function multiplies a field element by x in the polynomial field
1142 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001143 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001144 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001145 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001146static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1147 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001148{
1149 uint64_t a, b, ra, rb;
1150
Gilles Peskine449bd832023-01-11 14:50:10 +01001151 a = MBEDTLS_GET_UINT64_LE(x, 0);
1152 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001153
Gilles Peskine449bd832023-01-11 14:50:10 +01001154 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1155 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1158 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001159}
1160
Aorimn5f778012016-06-09 23:22:58 +02001161/*
1162 * AES-XTS buffer encryption/decryption
1163 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001164int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1165 int mode,
1166 size_t length,
1167 const unsigned char data_unit[16],
1168 const unsigned char *input,
1169 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001170{
Janos Follath24eed8d2019-11-22 13:21:35 +00001171 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001172 size_t blocks = length / 16;
1173 size_t leftover = length % 16;
1174 unsigned char tweak[16];
1175 unsigned char prev_tweak[16];
1176 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001177
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001179 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001181
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001182 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001183 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001184 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 }
Aorimn5f778012016-06-09 23:22:58 +02001186
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001187 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001189 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 }
Aorimn5f778012016-06-09 23:22:58 +02001191
Jaeden Amerod82cd862018-04-28 15:02:45 +01001192 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1194 data_unit, tweak);
1195 if (ret != 0) {
1196 return ret;
1197 }
Aorimn5f778012016-06-09 23:22:58 +02001198
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001200 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001201 /* We are on the last block in a decrypt operation that has
1202 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001203 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001204 * the leftovers and then update the current tweak for use on this,
1205 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001206 memcpy(prev_tweak, tweak, sizeof(tweak));
1207 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001208 }
1209
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001211
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1213 if (ret != 0) {
1214 return ret;
1215 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001216
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218
1219 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001221
1222 output += 16;
1223 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001224 }
1225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001227 /* If we are on the leftover bytes in a decrypt operation, we need to
1228 * use the previous tweak for these bytes (as saved in prev_tweak). */
1229 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001230
Jaeden Amerod82cd862018-04-28 15:02:45 +01001231 /* We are now on the final part of the data unit, which doesn't divide
1232 * evenly by 16. It's time for ciphertext stealing. */
1233 size_t i;
1234 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001235
Jaeden Amerod82cd862018-04-28 15:02:45 +01001236 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001237 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001239 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001240 }
Aorimn5f778012016-06-09 23:22:58 +02001241
Dave Rodgman069e7f42022-11-24 19:37:26 +00001242 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001243 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001244
Jaeden Amerod82cd862018-04-28 15:02:45 +01001245 /* Copy ciphertext bytes from the previous block for input in this
1246 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001247 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001248
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1250 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001251 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 }
Aorimn5f778012016-06-09 23:22:58 +02001253
Jaeden Amerod82cd862018-04-28 15:02:45 +01001254 /* Write the result back to the previous block, overriding the previous
1255 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001257 }
1258
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001260}
1261#endif /* MBEDTLS_CIPHER_MODE_XTS */
1262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001264/*
1265 * AES-CFB128 buffer encryption/decryption
1266 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001267int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1268 int mode,
1269 size_t length,
1270 size_t *iv_off,
1271 unsigned char iv[16],
1272 const unsigned char *input,
1273 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001274{
Paul Bakker27fdf462011-06-09 13:55:13 +00001275 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001276 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001277 size_t n;
1278
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001280 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001281 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001282
1283 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001284
Gilles Peskine449bd832023-01-11 14:50:10 +01001285 if (n > 15) {
1286 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1287 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001288
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 if (mode == MBEDTLS_AES_DECRYPT) {
1290 while (length--) {
1291 if (n == 0) {
1292 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1293 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001294 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001296 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001297
1298 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001300 iv[n] = (unsigned char) c;
1301
Gilles Peskine449bd832023-01-11 14:50:10 +01001302 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001303 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 } else {
1305 while (length--) {
1306 if (n == 0) {
1307 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1308 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001309 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001311 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001312
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001316 }
1317 }
1318
1319 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001320 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001321
Gilles Peskine7820a572021-07-07 21:08:28 +02001322exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001324}
Paul Bakker556efba2014-01-24 15:38:12 +01001325
1326/*
1327 * AES-CFB8 buffer encryption/decryption
1328 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001329int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1330 int mode,
1331 size_t length,
1332 unsigned char iv[16],
1333 const unsigned char *input,
1334 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001335{
Gilles Peskine7820a572021-07-07 21:08:28 +02001336 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001337 unsigned char c;
1338 unsigned char ov[17];
1339
Gilles Peskine449bd832023-01-11 14:50:10 +01001340 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001341 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001342 }
1343 while (length--) {
1344 memcpy(ov, iv, 16);
1345 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1346 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001347 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 }
Paul Bakker556efba2014-01-24 15:38:12 +01001349
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001351 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 }
Paul Bakker556efba2014-01-24 15:38:12 +01001353
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001355
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001357 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 }
Paul Bakker556efba2014-01-24 15:38:12 +01001359
Gilles Peskine449bd832023-01-11 14:50:10 +01001360 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001361 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001362 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001363
Gilles Peskine7820a572021-07-07 21:08:28 +02001364exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001366}
Simon Butcher76a5b222018-04-22 22:57:27 +01001367#endif /* MBEDTLS_CIPHER_MODE_CFB */
1368
1369#if defined(MBEDTLS_CIPHER_MODE_OFB)
1370/*
1371 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1372 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001373int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1374 size_t length,
1375 size_t *iv_off,
1376 unsigned char iv[16],
1377 const unsigned char *input,
1378 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001379{
Simon Butcherad4e4932018-04-29 00:43:47 +01001380 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001381 size_t n;
1382
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001383 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001384
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 if (n > 15) {
1386 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1387 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001388
Gilles Peskine449bd832023-01-11 14:50:10 +01001389 while (length--) {
1390 if (n == 0) {
1391 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1392 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001393 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001395 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001396 *output++ = *input++ ^ iv[n];
1397
Gilles Peskine449bd832023-01-11 14:50:10 +01001398 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001399 }
1400
1401 *iv_off = n;
1402
Simon Butcherad4e4932018-04-29 00:43:47 +01001403exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001405}
1406#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001407
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001408#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001409/*
1410 * AES-CTR buffer encryption/decryption
1411 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001412int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1413 size_t length,
1414 size_t *nc_off,
1415 unsigned char nonce_counter[16],
1416 unsigned char stream_block[16],
1417 const unsigned char *input,
1418 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001419{
Paul Bakker369e14b2012-04-18 14:16:09 +00001420 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001421 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001422 size_t n;
1423
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001424 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 if (n > 0x0F) {
1427 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1428 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001429
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 while (length--) {
1431 if (n == 0) {
1432 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1433 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001434 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 for (i = 16; i > 0; i--) {
1438 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001439 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 }
1441 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001442 }
1443 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001444 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001445
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001447 }
1448
1449 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001450 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001451
Gilles Peskine7820a572021-07-07 21:08:28 +02001452exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001453 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001454}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001459#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001460/*
1461 * AES test vectors from:
1462 *
1463 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1464 */
Yanray Wang62c99912023-05-11 11:06:53 +08001465static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001466{
1467 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1468 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001469#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001470 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1471 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1472 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1473 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001474#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001475};
1476
Yanray Wang62c99912023-05-11 11:06:53 +08001477static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001478{
1479 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1480 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001481#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001482 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1483 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1484 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1485 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001486#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001487};
1488
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001489#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001490static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001491{
1492 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1493 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001494#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001495 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1496 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1497 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1498 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001499#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001500};
1501
Yanray Wang62c99912023-05-11 11:06:53 +08001502static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001503{
1504 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1505 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001506#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001507 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1508 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1509 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1510 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001511#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001512};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001513#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001515#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001516/*
1517 * AES-CFB128 test vectors from:
1518 *
1519 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1520 */
Yanray Wang62c99912023-05-11 11:06:53 +08001521static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001522{
1523 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1524 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001525#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001526 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1527 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1528 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1529 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1530 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1531 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1532 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001533#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001534};
1535
1536static const unsigned char aes_test_cfb128_iv[16] =
1537{
1538 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1539 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1540};
1541
1542static const unsigned char aes_test_cfb128_pt[64] =
1543{
1544 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1545 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1546 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1547 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1548 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1549 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1550 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1551 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1552};
1553
Yanray Wang62c99912023-05-11 11:06:53 +08001554static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001555{
1556 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1557 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1558 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1559 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1560 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1561 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1562 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1563 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001564#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001565 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1566 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1567 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1568 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1569 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1570 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1571 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1572 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1573 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1574 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1575 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1576 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1577 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1578 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1579 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1580 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001581#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001582};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001584
Simon Butcherad4e4932018-04-29 00:43:47 +01001585#if defined(MBEDTLS_CIPHER_MODE_OFB)
1586/*
1587 * AES-OFB test vectors from:
1588 *
Simon Butcher5db13622018-06-04 22:11:25 +01001589 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001590 */
Yanray Wang62c99912023-05-11 11:06:53 +08001591static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001592{
1593 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1594 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001595#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001596 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1597 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1598 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1599 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1600 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1601 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1602 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001603#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001604};
1605
1606static const unsigned char aes_test_ofb_iv[16] =
1607{
1608 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1609 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1610};
1611
1612static const unsigned char aes_test_ofb_pt[64] =
1613{
1614 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1615 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1616 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1617 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1618 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1619 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1620 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1621 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1622};
1623
Yanray Wang62c99912023-05-11 11:06:53 +08001624static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001625{
1626 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1627 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1628 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1629 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1630 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1631 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1632 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1633 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001634#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001635 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1636 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1637 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1638 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1639 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1640 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1641 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1642 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1643 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1644 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1645 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1646 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1647 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1648 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1649 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1650 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001651#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001652};
1653#endif /* MBEDTLS_CIPHER_MODE_OFB */
1654
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001655#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001656/*
1657 * AES-CTR test vectors from:
1658 *
1659 * http://www.faqs.org/rfcs/rfc3686.html
1660 */
1661
Yanray Wang62c99912023-05-11 11:06:53 +08001662static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001663{
1664 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1665 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1666 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1667 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1668 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1669 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1670};
1671
Yanray Wang62c99912023-05-11 11:06:53 +08001672static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001673{
1674 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1675 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1676 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1677 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1678 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1679 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1680};
1681
Yanray Wang62c99912023-05-11 11:06:53 +08001682static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001683{
1684 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1685 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001686 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1687 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1688 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1689 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1690
1691 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1692 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1693 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1694 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1695 0x20, 0x21, 0x22, 0x23 }
1696};
1697
Yanray Wang62c99912023-05-11 11:06:53 +08001698static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001699{
1700 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1701 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1702 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1703 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1704 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1705 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1706 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1707 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1708 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1709 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1710 0x25, 0xB2, 0x07, 0x2F }
1711};
1712
1713static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001714{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001715#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001716
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001717#if defined(MBEDTLS_CIPHER_MODE_XTS)
1718/*
1719 * AES-XTS test vectors from:
1720 *
1721 * IEEE P1619/D16 Annex B
1722 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1723 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1724 */
1725static const unsigned char aes_test_xts_key[][32] =
1726{
1727 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1731 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1732 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1733 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1734 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1735 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1736 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1737 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1738 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1739};
1740
1741static const unsigned char aes_test_xts_pt32[][32] =
1742{
1743 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1747 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1748 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
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};
1756
1757static const unsigned char aes_test_xts_ct32[][32] =
1758{
1759 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1760 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1761 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1762 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1763 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1764 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1765 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1766 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1767 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1768 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1769 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1770 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1771};
1772
1773static const unsigned char aes_test_xts_data_unit[][16] =
1774{
Gilles Peskine449bd832023-01-11 14:50:10 +01001775 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1777 { 0x33, 0x33, 0x33, 0x33, 0x33, 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 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001781};
1782
1783#endif /* MBEDTLS_CIPHER_MODE_XTS */
1784
Paul Bakker5121ce52009-01-03 21:22:43 +00001785/*
1786 * Checkup routine
1787 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001788int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001789{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001790 int ret = 0, i, j, u, mode;
1791 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 unsigned char key[32];
1793 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001794 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001795#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1796 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001797 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001798#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001799#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001800 unsigned char prv[16];
1801#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001802#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1803 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001804 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001805#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001806#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001807 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001808#endif
1809#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001810 unsigned char nonce_counter[16];
1811 unsigned char stream_block[16];
1812#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001813 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001814
Gilles Peskine449bd832023-01-11 14:50:10 +01001815 memset(key, 0, 32);
1816 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001817
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001818 if (verbose != 0) {
1819#if defined(MBEDTLS_AES_ALT)
1820 mbedtls_printf(" AES note: alternative implementation.\n");
1821#else /* MBEDTLS_AES_ALT */
1822#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1823 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1824 mbedtls_printf(" AES note: using VIA Padlock.\n");
1825 } else
1826#endif
1827#if defined(MBEDTLS_AESNI_HAVE_CODE)
1828 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1829 mbedtls_printf(" AES note: using AESNI.\n");
1830 } else
1831#endif
1832#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1833 if (mbedtls_aesce_has_support()) {
1834 mbedtls_printf(" AES note: using AESCE.\n");
1835 } else
1836#endif
1837 mbedtls_printf(" AES note: built-in implementation.\n");
1838#endif /* MBEDTLS_AES_ALT */
1839 }
1840
Paul Bakker5121ce52009-01-03 21:22:43 +00001841 /*
1842 * ECB mode
1843 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001844 {
1845 static const int num_tests =
1846 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001847
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001848 for (i = 0; i < num_tests << 1; i++) {
1849 u = i >> 1;
1850 keybits = 128 + u * 64;
1851 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001852
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001853 if (verbose != 0) {
1854 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1855 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1856 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001857
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001858 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001859
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001860 if (mode == MBEDTLS_AES_DECRYPT) {
1861 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1862 aes_tests = aes_test_ecb_dec[u];
1863 } else {
1864 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1865 aes_tests = aes_test_ecb_enc[u];
1866 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001867
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001868 /*
1869 * AES-192 is an optional feature that may be unavailable when
1870 * there is an alternative underlying implementation i.e. when
1871 * MBEDTLS_AES_ALT is defined.
1872 */
1873 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1874 mbedtls_printf("skipped\n");
1875 continue;
1876 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001877 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001878 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001879
1880 for (j = 0; j < 10000; j++) {
1881 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1882 if (ret != 0) {
1883 goto exit;
1884 }
1885 }
1886
1887 if (memcmp(buf, aes_tests, 16) != 0) {
1888 ret = 1;
1889 goto exit;
1890 }
1891
1892 if (verbose != 0) {
1893 mbedtls_printf("passed\n");
1894 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001895 }
1896
Gilles Peskine449bd832023-01-11 14:50:10 +01001897 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001898 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001899 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001900 }
1901
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001902#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001903 /*
1904 * CBC mode
1905 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001906 {
1907 static const int num_tests =
1908 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001909
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001910 for (i = 0; i < num_tests << 1; i++) {
1911 u = i >> 1;
1912 keybits = 128 + u * 64;
1913 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001914
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001915 if (verbose != 0) {
1916 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1917 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001918 }
1919
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001920 memset(iv, 0, 16);
1921 memset(prv, 0, 16);
1922 memset(buf, 0, 16);
1923
1924 if (mode == MBEDTLS_AES_DECRYPT) {
1925 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1926 aes_tests = aes_test_cbc_dec[u];
1927 } else {
1928 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1929 aes_tests = aes_test_cbc_enc[u];
1930 }
1931
1932 /*
1933 * AES-192 is an optional feature that may be unavailable when
1934 * there is an alternative underlying implementation i.e. when
1935 * MBEDTLS_AES_ALT is defined.
1936 */
1937 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1938 mbedtls_printf("skipped\n");
1939 continue;
1940 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001941 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001942 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001943
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001944 for (j = 0; j < 10000; j++) {
1945 if (mode == MBEDTLS_AES_ENCRYPT) {
1946 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001947
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001948 memcpy(tmp, prv, 16);
1949 memcpy(prv, buf, 16);
1950 memcpy(buf, tmp, 16);
1951 }
1952
1953 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1954 if (ret != 0) {
1955 goto exit;
1956 }
1957
1958 }
1959
1960 if (memcmp(buf, aes_tests, 16) != 0) {
1961 ret = 1;
1962 goto exit;
1963 }
1964
1965 if (verbose != 0) {
1966 mbedtls_printf("passed\n");
1967 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001968 }
1969
Gilles Peskine449bd832023-01-11 14:50:10 +01001970 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001971 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001972 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001973 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001974#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001977 /*
1978 * CFB128 mode
1979 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001980 {
1981 static const int num_tests =
1982 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001983
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001984 for (i = 0; i < num_tests << 1; i++) {
1985 u = i >> 1;
1986 keybits = 128 + u * 64;
1987 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001988
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001989 if (verbose != 0) {
1990 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1991 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1992 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001993
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001994 memcpy(iv, aes_test_cfb128_iv, 16);
1995 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001996
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001997 offset = 0;
1998 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1999 /*
2000 * AES-192 is an optional feature that may be unavailable when
2001 * there is an alternative underlying implementation i.e. when
2002 * MBEDTLS_AES_ALT is defined.
2003 */
2004 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2005 mbedtls_printf("skipped\n");
2006 continue;
2007 } else if (ret != 0) {
2008 goto exit;
2009 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002010
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002011 if (mode == MBEDTLS_AES_DECRYPT) {
2012 memcpy(buf, aes_test_cfb128_ct[u], 64);
2013 aes_tests = aes_test_cfb128_pt;
2014 } else {
2015 memcpy(buf, aes_test_cfb128_pt, 64);
2016 aes_tests = aes_test_cfb128_ct[u];
2017 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002018
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002019 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2020 if (ret != 0) {
2021 goto exit;
2022 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002023
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002024 if (memcmp(buf, aes_tests, 64) != 0) {
2025 ret = 1;
2026 goto exit;
2027 }
2028
2029 if (verbose != 0) {
2030 mbedtls_printf("passed\n");
2031 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002032 }
2033
Gilles Peskine449bd832023-01-11 14:50:10 +01002034 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002035 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002037 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002038#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002039
Simon Butcherad4e4932018-04-29 00:43:47 +01002040#if defined(MBEDTLS_CIPHER_MODE_OFB)
2041 /*
2042 * OFB mode
2043 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002044 {
2045 static const int num_tests =
2046 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002047
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002048 for (i = 0; i < num_tests << 1; i++) {
2049 u = i >> 1;
2050 keybits = 128 + u * 64;
2051 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002052
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002053 if (verbose != 0) {
2054 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2055 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2056 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002057
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002058 memcpy(iv, aes_test_ofb_iv, 16);
2059 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002060
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002061 offset = 0;
2062 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2063 /*
2064 * AES-192 is an optional feature that may be unavailable when
2065 * there is an alternative underlying implementation i.e. when
2066 * MBEDTLS_AES_ALT is defined.
2067 */
2068 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2069 mbedtls_printf("skipped\n");
2070 continue;
2071 } else if (ret != 0) {
2072 goto exit;
2073 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002074
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002075 if (mode == MBEDTLS_AES_DECRYPT) {
2076 memcpy(buf, aes_test_ofb_ct[u], 64);
2077 aes_tests = aes_test_ofb_pt;
2078 } else {
2079 memcpy(buf, aes_test_ofb_pt, 64);
2080 aes_tests = aes_test_ofb_ct[u];
2081 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002082
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002083 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2084 if (ret != 0) {
2085 goto exit;
2086 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002087
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002088 if (memcmp(buf, aes_tests, 64) != 0) {
2089 ret = 1;
2090 goto exit;
2091 }
2092
2093 if (verbose != 0) {
2094 mbedtls_printf("passed\n");
2095 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002096 }
2097
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002099 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002101 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002102#endif /* MBEDTLS_CIPHER_MODE_OFB */
2103
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105 /*
2106 * CTR mode
2107 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002108 {
2109 static const int num_tests =
2110 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002111
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002112 for (i = 0; i < num_tests << 1; i++) {
2113 u = i >> 1;
2114 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002115
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002116 if (verbose != 0) {
2117 mbedtls_printf(" AES-CTR-128 (%s): ",
2118 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2119 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002120
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002121 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2122 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002123
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002124 offset = 0;
2125 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2126 goto exit;
2127 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002128
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002129 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002130
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002131 if (mode == MBEDTLS_AES_DECRYPT) {
2132 memcpy(buf, aes_test_ctr_ct[u], len);
2133 aes_tests = aes_test_ctr_pt[u];
2134 } else {
2135 memcpy(buf, aes_test_ctr_pt[u], len);
2136 aes_tests = aes_test_ctr_ct[u];
2137 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002138
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002139 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2140 stream_block, buf, buf);
2141 if (ret != 0) {
2142 goto exit;
2143 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002144
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002145 if (memcmp(buf, aes_tests, len) != 0) {
2146 ret = 1;
2147 goto exit;
2148 }
2149
2150 if (verbose != 0) {
2151 mbedtls_printf("passed\n");
2152 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002154 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002155
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 if (verbose != 0) {
2157 mbedtls_printf("\n");
2158 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002159#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002160
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002161#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002162 /*
2163 * XTS mode
2164 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002165 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002166 static const int num_tests =
2167 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2168 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002169
Gilles Peskine449bd832023-01-11 14:50:10 +01002170 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002171
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 for (i = 0; i < num_tests << 1; i++) {
2173 const unsigned char *data_unit;
2174 u = i >> 1;
2175 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 if (verbose != 0) {
2178 mbedtls_printf(" AES-XTS-128 (%s): ",
2179 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2180 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 memset(key, 0, sizeof(key));
2183 memcpy(key, aes_test_xts_key[u], 32);
2184 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 if (mode == MBEDTLS_AES_DECRYPT) {
2189 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2190 if (ret != 0) {
2191 goto exit;
2192 }
2193 memcpy(buf, aes_test_xts_ct32[u], len);
2194 aes_tests = aes_test_xts_pt32[u];
2195 } else {
2196 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2197 if (ret != 0) {
2198 goto exit;
2199 }
2200 memcpy(buf, aes_test_xts_pt32[u], len);
2201 aes_tests = aes_test_xts_ct32[u];
2202 }
2203
2204
2205 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2206 buf, buf);
2207 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002208 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 }
2210
2211 if (memcmp(buf, aes_tests, len) != 0) {
2212 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002213 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 }
2215
2216 if (verbose != 0) {
2217 mbedtls_printf("passed\n");
2218 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002219 }
2220
Gilles Peskine449bd832023-01-11 14:50:10 +01002221 if (verbose != 0) {
2222 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002223 }
2224
Gilles Peskine449bd832023-01-11 14:50:10 +01002225 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002226 }
2227#endif /* MBEDTLS_CIPHER_MODE_XTS */
2228
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002229 ret = 0;
2230
2231exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002232 if (ret != 0 && verbose != 0) {
2233 mbedtls_printf("failed\n");
2234 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002235
Gilles Peskine449bd832023-01-11 14:50:10 +01002236 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002237
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002239}
2240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002243#endif /* MBEDTLS_AES_C */