blob: 9f75f203df60c799e20154ade3a45e80956c744f [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
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100186#if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT))
Paul Bakker5121ce52009-01-03 21:22:43 +0000187/*
188 * Reverse S-box
189 */
190static const unsigned char RSb[256] =
191{
192 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
193 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
194 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
195 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
196 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
197 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
198 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
199 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
200 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
201 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
202 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
203 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
204 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
205 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
206 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
207 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
208 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
209 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
210 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
211 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
212 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
213 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
214 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
215 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
216 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
217 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
218 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
219 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
220 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
221 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
222 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
223 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
224};
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100225#endif /* !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT)) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000226
227/*
228 * Reverse tables
229 */
230#define RT \
231\
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
233 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
234 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
235 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
236 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
237 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
238 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
239 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
240 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
241 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
242 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
243 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
244 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
245 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
246 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
247 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
248 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
249 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
250 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
251 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
252 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
253 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
254 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
255 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
256 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
257 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
258 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
259 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
260 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
261 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
262 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
263 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
264 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
265 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
266 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
267 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
268 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
269 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
270 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
271 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
272 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
273 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
274 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
275 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
276 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
277 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
278 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
279 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
280 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
281 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
282 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
283 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
284 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
285 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
286 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
287 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
288 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
289 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
290 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
291 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
292 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
293 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
294 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
295 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 +0000296
Gilles Peskine449bd832023-01-11 14:50:10 +0100297#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000298static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000299#undef V
300
Hanno Beckerad049a92017-06-19 16:31:54 +0100301#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200302
Gilles Peskine449bd832023-01-11 14:50:10 +0100303#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000304static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000305#undef V
306
Gilles Peskine449bd832023-01-11 14:50:10 +0100307#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000308static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000309#undef V
310
Gilles Peskine449bd832023-01-11 14:50:10 +0100311#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000312static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000313#undef V
314
Hanno Becker177d3cf2017-06-07 15:52:48 +0100315#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200316
Paul Bakker5121ce52009-01-03 21:22:43 +0000317#undef RT
318
319/*
320 * Round constants
321 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000322static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000323{
324 0x00000001, 0x00000002, 0x00000004, 0x00000008,
325 0x00000010, 0x00000020, 0x00000040, 0x00000080,
326 0x0000001B, 0x00000036
327};
328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000330
331/*
332 * Forward S-box & tables
333 */
334static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200335static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100336#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200337static uint32_t FT1[256];
338static uint32_t FT2[256];
339static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100340#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000341
342/*
343 * Reverse S-box & tables
344 */
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100345#if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT))
Paul Bakker5121ce52009-01-03 21:22:43 +0000346static unsigned char RSb[256];
Dave Rodgman15cd28a2023-06-27 18:27:31 +0100347#endif
Paul Bakker5c2364c2012-10-01 14:41:15 +0000348static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100349#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000350static uint32_t RT1[256];
351static uint32_t RT2[256];
352static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100353#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
Dave Rodgman8c753f92023-06-27 18:16:13 +0100355#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000356/*
357 * Round constants
358 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000359static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
361/*
362 * Tables generation code
363 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100364#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
365#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
366#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000367
368static int aes_init_done = 0;
369
Gilles Peskine449bd832023-01-11 14:50:10 +0100370static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000371{
372 int i, x, y, z;
373 int pow[256];
374 int log[256];
375
376 /*
377 * compute pow and log tables over GF(2^8)
378 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000380 pow[i] = x;
381 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100382 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 }
384
385 /*
386 * calculate the round constants
387 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000389 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000391 }
392
393 /*
394 * generate the forward and reverse S-boxes
395 */
396 FSb[0x00] = 0x63;
397 RSb[0x63] = 0x00;
398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000400 x = pow[255 - log[i]];
401
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
403 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
404 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
405 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000406 x ^= y ^ 0x63;
407
408 FSb[i] = (unsigned char) x;
409 RSb[x] = (unsigned char) i;
410 }
411
412 /*
413 * generate the forward and reverse tables
414 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000416 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100417 y = MBEDTLS_BYTE_0(XTIME(x));
418 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Gilles Peskine449bd832023-01-11 14:50:10 +0100420 FT0[i] = ((uint32_t) y) ^
421 ((uint32_t) x << 8) ^
422 ((uint32_t) x << 16) ^
423 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000424
Hanno Beckerad049a92017-06-19 16:31:54 +0100425#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 FT1[i] = ROTL8(FT0[i]);
427 FT2[i] = ROTL8(FT1[i]);
428 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100429#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000430
431 x = RSb[i];
432
Gilles Peskine449bd832023-01-11 14:50:10 +0100433 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
434 ((uint32_t) MUL(0x09, x) << 8) ^
435 ((uint32_t) MUL(0x0D, x) << 16) ^
436 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000437
Hanno Beckerad049a92017-06-19 16:31:54 +0100438#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 RT1[i] = ROTL8(RT0[i]);
440 RT2[i] = ROTL8(RT1[i]);
441 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100442#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000443 }
444}
445
Dave Rodgman8c753f92023-06-27 18:16:13 +0100446#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
447
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200448#undef ROTL8
449
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Hanno Beckerad049a92017-06-19 16:31:54 +0100452#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200453
Gilles Peskine449bd832023-01-11 14:50:10 +0100454#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
455#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
456#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200457
458#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100459#define AES_RT1(idx) ROTL8(RT0[idx])
460#define AES_RT2(idx) ROTL16(RT0[idx])
461#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200462
463#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100464#define AES_FT1(idx) ROTL8(FT0[idx])
465#define AES_FT2(idx) ROTL16(FT0[idx])
466#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200467
Hanno Becker177d3cf2017-06-07 15:52:48 +0100468#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200469
470#define AES_RT0(idx) RT0[idx]
471#define AES_RT1(idx) RT1[idx]
472#define AES_RT2(idx) RT2[idx]
473#define AES_RT3(idx) RT3[idx]
474
475#define AES_FT0(idx) FT0[idx]
476#define AES_FT1(idx) FT1[idx]
477#define AES_FT2(idx) FT2[idx]
478#define AES_FT3(idx) FT3[idx]
479
Hanno Becker177d3cf2017-06-07 15:52:48 +0100480#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200481
Gilles Peskine449bd832023-01-11 14:50:10 +0100482void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483{
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485}
486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200488{
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100491 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200492
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200494}
495
Jaeden Amero9366feb2018-05-29 18:55:17 +0100496#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100497void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100498{
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 mbedtls_aes_init(&ctx->crypt);
500 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100501}
502
Gilles Peskine449bd832023-01-11 14:50:10 +0100503void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100504{
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100506 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 }
Simon Butcher5201e412018-12-06 17:40:14 +0000508
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 mbedtls_aes_free(&ctx->crypt);
510 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100511}
512#endif /* MBEDTLS_CIPHER_MODE_XTS */
513
Gilles Peskine0de8f852023-03-16 17:14:59 +0100514/* Some implementations need the round keys to be aligned.
515 * Return an offset to be added to buf, such that (buf + offset) is
516 * correctly aligned.
517 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
518 * i.e. an offset of 1 means 4 bytes and so on.
519 */
520#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100521 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100522#define MAY_NEED_TO_ALIGN
523#endif
Dave Rodgman28a539a2023-06-27 18:22:34 +0100524
525#if defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100526static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
527{
528#if defined(MAY_NEED_TO_ALIGN)
529 int align_16_bytes = 0;
530
531#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
532 if (aes_padlock_ace == -1) {
533 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
534 }
535 if (aes_padlock_ace) {
536 align_16_bytes = 1;
537 }
538#endif
539
Gilles Peskine9c682e72023-03-16 17:21:33 +0100540#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100541 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
542 align_16_bytes = 1;
543 }
544#endif
545
546 if (align_16_bytes) {
547 /* These implementations needs 16-byte alignment
548 * for the round key array. */
549 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
550 if (delta == 0) {
551 return 0;
552 } else {
553 return 4 - delta; // 16 bytes = 4 uint32_t
554 }
555 }
556#else /* MAY_NEED_TO_ALIGN */
557 (void) buf;
558#endif /* MAY_NEED_TO_ALIGN */
559
560 return 0;
561}
Dave Rodgman28a539a2023-06-27 18:22:34 +0100562#endif /* defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */
Gilles Peskine0de8f852023-03-16 17:14:59 +0100563
Paul Bakker5121ce52009-01-03 21:22:43 +0000564/*
565 * AES key schedule (encryption)
566 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200567#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100568int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
569 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000570{
Paul Bakker23986e52011-04-24 08:57:21 +0000571 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000572 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800576#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000577 case 192: ctx->nr = 12; break;
578 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800579#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000581 }
582
Simon Butcher5201e412018-12-06 17:40:14 +0000583#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000585 aes_gen_tables();
586 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000587 }
588#endif
589
Gilles Peskine0de8f852023-03-16 17:14:59 +0100590 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100591 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000592
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100593#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
595 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
596 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100597#endif
598
Jerry Yu3f2fb712023-01-10 17:05:42 +0800599#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
600 if (mbedtls_aesce_has_support()) {
601 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
602 }
603#endif
604
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 for (i = 0; i < (keybits >> 5); i++) {
606 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000607 }
608
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000610 case 10:
611
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000613 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
615 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
616 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
617 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000618
619 RK[5] = RK[1] ^ RK[4];
620 RK[6] = RK[2] ^ RK[5];
621 RK[7] = RK[3] ^ RK[6];
622 }
623 break;
624
Arto Kinnunen732ca322023-04-14 14:26:10 +0800625#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000626 case 12:
627
Gilles Peskine449bd832023-01-11 14:50:10 +0100628 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000629 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
631 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
632 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
633 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000634
635 RK[7] = RK[1] ^ RK[6];
636 RK[8] = RK[2] ^ RK[7];
637 RK[9] = RK[3] ^ RK[8];
638 RK[10] = RK[4] ^ RK[9];
639 RK[11] = RK[5] ^ RK[10];
640 }
641 break;
642
643 case 14:
644
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000646 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
648 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[9] = RK[1] ^ RK[8];
653 RK[10] = RK[2] ^ RK[9];
654 RK[11] = RK[3] ^ RK[10];
655
656 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100657 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
658 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
659 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
660 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000661
662 RK[13] = RK[5] ^ RK[12];
663 RK[14] = RK[6] ^ RK[13];
664 RK[15] = RK[7] ^ RK[14];
665 }
666 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800667#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000668 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000669
Gilles Peskine449bd832023-01-11 14:50:10 +0100670 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000671}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200672#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000673
674/*
675 * AES key schedule (decryption)
676 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200677#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100678int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
679 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000680{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200681 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000683 uint32_t *RK;
684 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200685
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000687
Gilles Peskine0de8f852023-03-16 17:14:59 +0100688 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100689 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200691 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100692 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200693 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100694 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000695
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200696 ctx->nr = cty.nr;
697
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100698#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100699 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
700 mbedtls_aesni_inverse_key((unsigned char *) RK,
701 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200702 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100703 }
704#endif
705
Jerry Yue096da12023-01-10 17:07:01 +0800706#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
707 if (mbedtls_aesce_has_support()) {
708 mbedtls_aesce_inverse_key(
709 (unsigned char *) RK,
710 (const unsigned char *) (cty.buf + cty.rk_offset),
711 ctx->nr);
712 goto exit;
713 }
714#endif
715
Werner Lewisdd76ef32022-05-30 12:00:21 +0100716 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
718 *RK++ = *SK++;
719 *RK++ = *SK++;
720 *RK++ = *SK++;
721 *RK++ = *SK++;
722
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
724 for (j = 0; j < 4; j++, SK++) {
725 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
726 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
727 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
728 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000729 }
730 }
731
732 *RK++ = *SK++;
733 *RK++ = *SK++;
734 *RK++ = *SK++;
735 *RK++ = *SK++;
736
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200737exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000739
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000741}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100742#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100743
744#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100745static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
746 unsigned int keybits,
747 const unsigned char **key1,
748 unsigned int *key1bits,
749 const unsigned char **key2,
750 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100751{
752 const unsigned int half_keybits = keybits / 2;
753 const unsigned int half_keybytes = half_keybits / 8;
754
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100756 case 256: break;
757 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100759 }
760
761 *key1bits = half_keybits;
762 *key2bits = half_keybits;
763 *key1 = &key[0];
764 *key2 = &key[half_keybytes];
765
766 return 0;
767}
768
Gilles Peskine449bd832023-01-11 14:50:10 +0100769int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
770 const unsigned char *key,
771 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772{
Janos Follath24eed8d2019-11-22 13:21:35 +0000773 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100774 const unsigned char *key1, *key2;
775 unsigned int key1bits, key2bits;
776
Gilles Peskine449bd832023-01-11 14:50:10 +0100777 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
778 &key2, &key2bits);
779 if (ret != 0) {
780 return ret;
781 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100782
783 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100784 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
785 if (ret != 0) {
786 return ret;
787 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788
789 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100791}
792
Gilles Peskine449bd832023-01-11 14:50:10 +0100793int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
794 const unsigned char *key,
795 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100796{
Janos Follath24eed8d2019-11-22 13:21:35 +0000797 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100798 const unsigned char *key1, *key2;
799 unsigned int key1bits, key2bits;
800
Gilles Peskine449bd832023-01-11 14:50:10 +0100801 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
802 &key2, &key2bits);
803 if (ret != 0) {
804 return ret;
805 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100806
807 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
809 if (ret != 0) {
810 return ret;
811 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100812
813 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100815}
816#endif /* MBEDTLS_CIPHER_MODE_XTS */
817
Gilles Peskine449bd832023-01-11 14:50:10 +0100818#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100819 do \
820 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
822 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
823 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
824 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100825 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
827 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
828 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
829 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100830 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
832 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
833 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
834 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100835 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
837 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
838 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
839 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
840 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
Gilles Peskine449bd832023-01-11 14:50:10 +0100842#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100843 do \
844 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
846 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
847 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
848 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100849 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
851 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
852 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
853 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100854 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100855 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
856 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
857 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
858 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100859 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
861 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
862 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
863 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
864 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000865
866/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200867 * AES-ECB block encryption
868 */
869#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100870int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
871 const unsigned char input[16],
872 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200873{
874 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100875 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200877 uint32_t X[4];
878 uint32_t Y[4];
879 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
882 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
883 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
884 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200885
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
887 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]);
888 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 +0200889 }
890
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 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 +0200892
Gilles Peskine5197c662020-08-26 17:03:24 +0200893 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
896 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200898
Gilles Peskine5197c662020-08-26 17:03:24 +0200899 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100900 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
901 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
902 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200904
Gilles Peskine5197c662020-08-26 17:03:24 +0200905 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100906 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
907 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
908 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
909 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200910
Gilles Peskine5197c662020-08-26 17:03:24 +0200911 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
913 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
914 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
915 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200916
Gilles Peskine449bd832023-01-11 14:50:10 +0100917 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
918 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
919 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
920 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925}
926#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
927
928/*
929 * AES-ECB block decryption
930 */
931#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100932int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
933 const unsigned char input[16],
934 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200935{
936 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100937 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200939 uint32_t X[4];
940 uint32_t Y[4];
941 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200942
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
944 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
945 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
946 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
949 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]);
950 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 +0200951 }
952
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 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 +0200954
Gilles Peskine5197c662020-08-26 17:03:24 +0200955 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
957 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
958 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200960
Gilles Peskine5197c662020-08-26 17:03:24 +0200961 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
963 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
964 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200966
Gilles Peskine5197c662020-08-26 17:03:24 +0200967 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
969 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
970 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
971 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200972
Gilles Peskine5197c662020-08-26 17:03:24 +0200973 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
975 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
976 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
977 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
980 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
981 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
982 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000983
Gilles Peskine449bd832023-01-11 14:50:10 +0100984 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500985
Gilles Peskine449bd832023-01-11 14:50:10 +0100986 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200987}
988#endif /* !MBEDTLS_AES_DECRYPT_ALT */
989
Gilles Peskine0de8f852023-03-16 17:14:59 +0100990#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100991/* VIA Padlock and our intrinsics-based implementation of AESNI require
992 * the round keys to be aligned on a 16-byte boundary. We take care of this
993 * before creating them, but the AES context may have moved (this can happen
994 * if the library is called from a language with managed memory), and in later
995 * calls it might have a different alignment with respect to 16-byte memory.
996 * So we may need to realign.
997 */
998static void aes_maybe_realign(mbedtls_aes_context *ctx)
999{
Gilles Peskine0de8f852023-03-16 17:14:59 +01001000 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
1001 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001002 memmove(ctx->buf + new_offset, // new address
1003 ctx->buf + ctx->rk_offset, // current address
1004 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1005 ctx->rk_offset = new_offset;
1006 }
1007}
1008#endif
1009
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001010/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001011 * AES-ECB block encryption/decryption
1012 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001013int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1014 int mode,
1015 const unsigned char input[16],
1016 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001017{
Gilles Peskine449bd832023-01-11 14:50:10 +01001018 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001019 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001020 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001021
Gilles Peskine0de8f852023-03-16 17:14:59 +01001022#if defined(MAY_NEED_TO_ALIGN)
1023 aes_maybe_realign(ctx);
1024#endif
1025
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001026#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001027 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1028 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1029 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001030#endif
1031
Jerry Yu2bb3d812023-01-10 17:38:26 +08001032#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1033 if (mbedtls_aesce_has_support()) {
1034 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1035 }
1036#endif
1037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001040 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001041 }
1042#endif
1043
Gilles Peskine449bd832023-01-11 14:50:10 +01001044 if (mode == MBEDTLS_AES_ENCRYPT) {
1045 return mbedtls_internal_aes_encrypt(ctx, input, output);
1046 } else {
1047 return mbedtls_internal_aes_decrypt(ctx, input, output);
1048 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001049}
1050
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001051#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001052
1053#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001054/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1055 * the result for the next block in CBC, and the cost of transferring that data from
1056 * NEON registers, it is faster to use the following on aarch64.
1057 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001058#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001059 mbedtls_put_unaligned_uint64(r, \
1060 mbedtls_get_unaligned_uint64(a) ^ \
1061 mbedtls_get_unaligned_uint64(b)); \
1062 mbedtls_put_unaligned_uint64(r + 8, \
1063 mbedtls_get_unaligned_uint64(a + 8) ^ \
1064 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001065} while (0)
1066#else
1067#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1068#endif
1069
Paul Bakker5121ce52009-01-03 21:22:43 +00001070/*
1071 * AES-CBC buffer encryption/decryption
1072 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001073int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1074 int mode,
1075 size_t length,
1076 unsigned char iv[16],
1077 const unsigned char *input,
1078 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001079{
Gilles Peskine7820a572021-07-07 21:08:28 +02001080 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001081 unsigned char temp[16];
1082
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001084 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001086
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 if (length % 16) {
1088 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1089 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 if (aes_padlock_ace > 0) {
1093 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1094 return 0;
1095 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001096
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001097 // If padlock data misaligned, we just fall back to
1098 // unaccelerated mode
1099 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001100 }
1101#endif
1102
Dave Rodgman906c63c2023-06-14 17:53:51 +01001103 const unsigned char *ivp = iv;
1104
Gilles Peskine449bd832023-01-11 14:50:10 +01001105 if (mode == MBEDTLS_AES_DECRYPT) {
1106 while (length > 0) {
1107 memcpy(temp, input, 16);
1108 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1109 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001110 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001112 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001113
Gilles Peskine449bd832023-01-11 14:50:10 +01001114 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001115
1116 input += 16;
1117 output += 16;
1118 length -= 16;
1119 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 } else {
1121 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001122 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001123
Gilles Peskine449bd832023-01-11 14:50:10 +01001124 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1125 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001126 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001127 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001128 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001129
1130 input += 16;
1131 output += 16;
1132 length -= 16;
1133 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001134 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001135 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001136 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001137
Gilles Peskine7820a572021-07-07 21:08:28 +02001138exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001139 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001140}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001142
Aorimn5f778012016-06-09 23:22:58 +02001143#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001144
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001145typedef unsigned char mbedtls_be128[16];
1146
1147/*
1148 * GF(2^128) multiplication function
1149 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001150 * This function multiplies a field element by x in the polynomial field
1151 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001152 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001153 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001154 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001155static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1156 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001157{
1158 uint64_t a, b, ra, rb;
1159
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 a = MBEDTLS_GET_UINT64_LE(x, 0);
1161 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001162
Gilles Peskine449bd832023-01-11 14:50:10 +01001163 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1164 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001165
Gilles Peskine449bd832023-01-11 14:50:10 +01001166 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1167 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001168}
1169
Aorimn5f778012016-06-09 23:22:58 +02001170/*
1171 * AES-XTS buffer encryption/decryption
1172 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001173int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1174 int mode,
1175 size_t length,
1176 const unsigned char data_unit[16],
1177 const unsigned char *input,
1178 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001179{
Janos Follath24eed8d2019-11-22 13:21:35 +00001180 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001181 size_t blocks = length / 16;
1182 size_t leftover = length % 16;
1183 unsigned char tweak[16];
1184 unsigned char prev_tweak[16];
1185 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001186
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001188 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001190
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001191 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001193 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 }
Aorimn5f778012016-06-09 23:22:58 +02001195
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001196 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001197 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001198 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 }
Aorimn5f778012016-06-09 23:22:58 +02001200
Jaeden Amerod82cd862018-04-28 15:02:45 +01001201 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001202 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1203 data_unit, tweak);
1204 if (ret != 0) {
1205 return ret;
1206 }
Aorimn5f778012016-06-09 23:22:58 +02001207
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001209 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210 /* We are on the last block in a decrypt operation that has
1211 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001212 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213 * the leftovers and then update the current tweak for use on this,
1214 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 memcpy(prev_tweak, tweak, sizeof(tweak));
1216 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001217 }
1218
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001220
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1222 if (ret != 0) {
1223 return ret;
1224 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001227
1228 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001230
1231 output += 16;
1232 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001233 }
1234
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001236 /* If we are on the leftover bytes in a decrypt operation, we need to
1237 * use the previous tweak for these bytes (as saved in prev_tweak). */
1238 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001239
Jaeden Amerod82cd862018-04-28 15:02:45 +01001240 /* We are now on the final part of the data unit, which doesn't divide
1241 * evenly by 16. It's time for ciphertext stealing. */
1242 size_t i;
1243 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001244
Jaeden Amerod82cd862018-04-28 15:02:45 +01001245 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001246 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001247 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001248 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001249 }
Aorimn5f778012016-06-09 23:22:58 +02001250
Dave Rodgman069e7f42022-11-24 19:37:26 +00001251 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001253
Jaeden Amerod82cd862018-04-28 15:02:45 +01001254 /* Copy ciphertext bytes from the previous block for input in this
1255 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1259 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001260 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 }
Aorimn5f778012016-06-09 23:22:58 +02001262
Jaeden Amerod82cd862018-04-28 15:02:45 +01001263 /* Write the result back to the previous block, overriding the previous
1264 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001266 }
1267
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001269}
1270#endif /* MBEDTLS_CIPHER_MODE_XTS */
1271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001272#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001273/*
1274 * AES-CFB128 buffer encryption/decryption
1275 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001276int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1277 int mode,
1278 size_t length,
1279 size_t *iv_off,
1280 unsigned char iv[16],
1281 const unsigned char *input,
1282 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001283{
Paul Bakker27fdf462011-06-09 13:55:13 +00001284 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001285 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001286 size_t n;
1287
Gilles Peskine449bd832023-01-11 14:50:10 +01001288 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001289 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001290 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001291
1292 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 if (n > 15) {
1295 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1296 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001297
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 if (mode == MBEDTLS_AES_DECRYPT) {
1299 while (length--) {
1300 if (n == 0) {
1301 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1302 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001303 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001305 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001306
1307 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001308 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001309 iv[n] = (unsigned char) c;
1310
Gilles Peskine449bd832023-01-11 14:50:10 +01001311 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001312 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001313 } else {
1314 while (length--) {
1315 if (n == 0) {
1316 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1317 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001318 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001320 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001321
Gilles Peskine449bd832023-01-11 14:50:10 +01001322 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001323
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001325 }
1326 }
1327
1328 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001329 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001330
Gilles Peskine7820a572021-07-07 21:08:28 +02001331exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001332 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001333}
Paul Bakker556efba2014-01-24 15:38:12 +01001334
1335/*
1336 * AES-CFB8 buffer encryption/decryption
1337 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001338int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1339 int mode,
1340 size_t length,
1341 unsigned char iv[16],
1342 const unsigned char *input,
1343 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001344{
Gilles Peskine7820a572021-07-07 21:08:28 +02001345 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001346 unsigned char c;
1347 unsigned char ov[17];
1348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001350 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 }
1352 while (length--) {
1353 memcpy(ov, iv, 16);
1354 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1355 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001356 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001357 }
Paul Bakker556efba2014-01-24 15:38:12 +01001358
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001360 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001361 }
Paul Bakker556efba2014-01-24 15:38:12 +01001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001366 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001367 }
Paul Bakker556efba2014-01-24 15:38:12 +01001368
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001370 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001371 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001372
Gilles Peskine7820a572021-07-07 21:08:28 +02001373exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001374 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001375}
Simon Butcher76a5b222018-04-22 22:57:27 +01001376#endif /* MBEDTLS_CIPHER_MODE_CFB */
1377
1378#if defined(MBEDTLS_CIPHER_MODE_OFB)
1379/*
1380 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1381 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001382int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1383 size_t length,
1384 size_t *iv_off,
1385 unsigned char iv[16],
1386 const unsigned char *input,
1387 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001388{
Simon Butcherad4e4932018-04-29 00:43:47 +01001389 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001390 size_t n;
1391
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001392 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001393
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 if (n > 15) {
1395 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1396 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001397
Gilles Peskine449bd832023-01-11 14:50:10 +01001398 while (length--) {
1399 if (n == 0) {
1400 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1401 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001402 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001404 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001405 *output++ = *input++ ^ iv[n];
1406
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001408 }
1409
1410 *iv_off = n;
1411
Simon Butcherad4e4932018-04-29 00:43:47 +01001412exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001414}
1415#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001418/*
1419 * AES-CTR buffer encryption/decryption
1420 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001421int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1422 size_t length,
1423 size_t *nc_off,
1424 unsigned char nonce_counter[16],
1425 unsigned char stream_block[16],
1426 const unsigned char *input,
1427 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001428{
Paul Bakker369e14b2012-04-18 14:16:09 +00001429 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001430 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001431 size_t n;
1432
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001433 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001434
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 if (n > 0x0F) {
1436 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1437 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001438
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 while (length--) {
1440 if (n == 0) {
1441 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1442 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001443 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001444 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001445
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 for (i = 16; i > 0; i--) {
1447 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001448 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001449 }
1450 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001451 }
1452 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001453 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001454
Gilles Peskine449bd832023-01-11 14:50:10 +01001455 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001456 }
1457
1458 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001459 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001460
Gilles Peskine7820a572021-07-07 21:08:28 +02001461exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001462 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001463}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001469/*
1470 * AES test vectors from:
1471 *
1472 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1473 */
Yanray Wang62c99912023-05-11 11:06:53 +08001474static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001475{
1476 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1477 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001478#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001479 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1480 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1481 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1482 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001483#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001484};
1485
Yanray Wang62c99912023-05-11 11:06:53 +08001486static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001487{
1488 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1489 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001490#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001491 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1492 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1493 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1494 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001495#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001496};
1497
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001498#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001499static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001500{
1501 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1502 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001503#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001504 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1505 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1506 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1507 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001508#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001509};
1510
Yanray Wang62c99912023-05-11 11:06:53 +08001511static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001512{
1513 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1514 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001515#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001516 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1517 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1518 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1519 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001520#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001521};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001525/*
1526 * AES-CFB128 test vectors from:
1527 *
1528 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1529 */
Yanray Wang62c99912023-05-11 11:06:53 +08001530static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001531{
1532 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1533 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001534#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001535 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1536 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1537 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1538 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1539 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1540 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1541 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001542#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001543};
1544
1545static const unsigned char aes_test_cfb128_iv[16] =
1546{
1547 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1548 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1549};
1550
1551static const unsigned char aes_test_cfb128_pt[64] =
1552{
1553 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1554 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1555 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1556 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1557 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1558 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1559 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1560 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1561};
1562
Yanray Wang62c99912023-05-11 11:06:53 +08001563static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001564{
1565 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1566 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1567 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1568 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1569 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1570 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1571 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1572 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001573#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001574 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1575 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1576 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1577 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1578 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1579 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1580 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1581 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1582 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1583 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1584 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1585 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1586 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1587 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1588 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1589 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001590#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001591};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001592#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001593
Simon Butcherad4e4932018-04-29 00:43:47 +01001594#if defined(MBEDTLS_CIPHER_MODE_OFB)
1595/*
1596 * AES-OFB test vectors from:
1597 *
Simon Butcher5db13622018-06-04 22:11:25 +01001598 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001599 */
Yanray Wang62c99912023-05-11 11:06:53 +08001600static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001601{
1602 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1603 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001604#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001605 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1606 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1607 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1608 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1609 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1610 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1611 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001612#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001613};
1614
1615static const unsigned char aes_test_ofb_iv[16] =
1616{
1617 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1618 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1619};
1620
1621static const unsigned char aes_test_ofb_pt[64] =
1622{
1623 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1624 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1625 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1626 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1627 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1628 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1629 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1630 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1631};
1632
Yanray Wang62c99912023-05-11 11:06:53 +08001633static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001634{
1635 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1636 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1637 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1638 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1639 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1640 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1641 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1642 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001643#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001644 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1645 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1646 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1647 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1648 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1649 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1650 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1651 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1652 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1653 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1654 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1655 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1656 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1657 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1658 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1659 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001660#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001661};
1662#endif /* MBEDTLS_CIPHER_MODE_OFB */
1663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001664#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001665/*
1666 * AES-CTR test vectors from:
1667 *
1668 * http://www.faqs.org/rfcs/rfc3686.html
1669 */
1670
Yanray Wang62c99912023-05-11 11:06:53 +08001671static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001672{
1673 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1674 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1675 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1676 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1677 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1678 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1679};
1680
Yanray Wang62c99912023-05-11 11:06:53 +08001681static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001682{
1683 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1685 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1686 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1687 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1688 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1689};
1690
Yanray Wang62c99912023-05-11 11:06:53 +08001691static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001692{
1693 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1694 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001695 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1696 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1697 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1698 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1699
1700 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1701 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1702 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1703 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1704 0x20, 0x21, 0x22, 0x23 }
1705};
1706
Yanray Wang62c99912023-05-11 11:06:53 +08001707static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001708{
1709 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1710 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1711 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1712 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1713 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1714 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1715 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1716 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1717 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1718 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1719 0x25, 0xB2, 0x07, 0x2F }
1720};
1721
1722static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001723{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001724#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001725
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001726#if defined(MBEDTLS_CIPHER_MODE_XTS)
1727/*
1728 * AES-XTS test vectors from:
1729 *
1730 * IEEE P1619/D16 Annex B
1731 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1732 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1733 */
1734static const unsigned char aes_test_xts_key[][32] =
1735{
1736 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1738 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1740 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1741 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1742 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1743 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1744 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1745 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1746 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1747 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1748};
1749
1750static const unsigned char aes_test_xts_pt32[][32] =
1751{
1752 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1756 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1757 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1758 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1759 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1760 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1761 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1762 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1763 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1764};
1765
1766static const unsigned char aes_test_xts_ct32[][32] =
1767{
1768 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1769 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1770 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1771 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1772 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1773 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1774 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1775 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1776 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1777 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1778 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1779 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1780};
1781
1782static const unsigned char aes_test_xts_data_unit[][16] =
1783{
Gilles Peskine449bd832023-01-11 14:50:10 +01001784 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1786 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1788 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001790};
1791
1792#endif /* MBEDTLS_CIPHER_MODE_XTS */
1793
Paul Bakker5121ce52009-01-03 21:22:43 +00001794/*
1795 * Checkup routine
1796 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001797int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001798{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001799 int ret = 0, i, j, u, mode;
1800 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001801 unsigned char key[32];
1802 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001803 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001804#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1805 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001806 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001807#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001808#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001809 unsigned char prv[16];
1810#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001811#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1812 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001813 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001814#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001815#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001816 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001817#endif
1818#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001819 unsigned char nonce_counter[16];
1820 unsigned char stream_block[16];
1821#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001822 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001823
Gilles Peskine449bd832023-01-11 14:50:10 +01001824 memset(key, 0, 32);
1825 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001826
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001827 if (verbose != 0) {
1828#if defined(MBEDTLS_AES_ALT)
1829 mbedtls_printf(" AES note: alternative implementation.\n");
1830#else /* MBEDTLS_AES_ALT */
1831#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1832 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1833 mbedtls_printf(" AES note: using VIA Padlock.\n");
1834 } else
1835#endif
1836#if defined(MBEDTLS_AESNI_HAVE_CODE)
1837 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1838 mbedtls_printf(" AES note: using AESNI.\n");
1839 } else
1840#endif
1841#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1842 if (mbedtls_aesce_has_support()) {
1843 mbedtls_printf(" AES note: using AESCE.\n");
1844 } else
1845#endif
1846 mbedtls_printf(" AES note: built-in implementation.\n");
1847#endif /* MBEDTLS_AES_ALT */
1848 }
1849
Paul Bakker5121ce52009-01-03 21:22:43 +00001850 /*
1851 * ECB mode
1852 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001853 {
1854 static const int num_tests =
1855 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001856
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001857 for (i = 0; i < num_tests << 1; i++) {
1858 u = i >> 1;
1859 keybits = 128 + u * 64;
1860 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001861
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001862 if (verbose != 0) {
1863 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1864 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1865 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001866
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001867 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001868
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001869 if (mode == MBEDTLS_AES_DECRYPT) {
1870 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1871 aes_tests = aes_test_ecb_dec[u];
1872 } else {
1873 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1874 aes_tests = aes_test_ecb_enc[u];
1875 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001876
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001877 /*
1878 * AES-192 is an optional feature that may be unavailable when
1879 * there is an alternative underlying implementation i.e. when
1880 * MBEDTLS_AES_ALT is defined.
1881 */
1882 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1883 mbedtls_printf("skipped\n");
1884 continue;
1885 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001886 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001888
1889 for (j = 0; j < 10000; j++) {
1890 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1891 if (ret != 0) {
1892 goto exit;
1893 }
1894 }
1895
1896 if (memcmp(buf, aes_tests, 16) != 0) {
1897 ret = 1;
1898 goto exit;
1899 }
1900
1901 if (verbose != 0) {
1902 mbedtls_printf("passed\n");
1903 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001904 }
1905
Gilles Peskine449bd832023-01-11 14:50:10 +01001906 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001907 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001908 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 }
1910
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001911#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001912 /*
1913 * CBC mode
1914 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001915 {
1916 static const int num_tests =
1917 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001918
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001919 for (i = 0; i < num_tests << 1; i++) {
1920 u = i >> 1;
1921 keybits = 128 + u * 64;
1922 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001923
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001924 if (verbose != 0) {
1925 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1926 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001927 }
1928
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001929 memset(iv, 0, 16);
1930 memset(prv, 0, 16);
1931 memset(buf, 0, 16);
1932
1933 if (mode == MBEDTLS_AES_DECRYPT) {
1934 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1935 aes_tests = aes_test_cbc_dec[u];
1936 } else {
1937 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1938 aes_tests = aes_test_cbc_enc[u];
1939 }
1940
1941 /*
1942 * AES-192 is an optional feature that may be unavailable when
1943 * there is an alternative underlying implementation i.e. when
1944 * MBEDTLS_AES_ALT is defined.
1945 */
1946 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1947 mbedtls_printf("skipped\n");
1948 continue;
1949 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001950 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001951 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001952
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001953 for (j = 0; j < 10000; j++) {
1954 if (mode == MBEDTLS_AES_ENCRYPT) {
1955 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001956
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001957 memcpy(tmp, prv, 16);
1958 memcpy(prv, buf, 16);
1959 memcpy(buf, tmp, 16);
1960 }
1961
1962 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1963 if (ret != 0) {
1964 goto exit;
1965 }
1966
1967 }
1968
1969 if (memcmp(buf, aes_tests, 16) != 0) {
1970 ret = 1;
1971 goto exit;
1972 }
1973
1974 if (verbose != 0) {
1975 mbedtls_printf("passed\n");
1976 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001977 }
1978
Gilles Peskine449bd832023-01-11 14:50:10 +01001979 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001980 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001981 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001982 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001983#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001984
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001985#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001986 /*
1987 * CFB128 mode
1988 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001989 {
1990 static const int num_tests =
1991 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001992
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001993 for (i = 0; i < num_tests << 1; i++) {
1994 u = i >> 1;
1995 keybits = 128 + u * 64;
1996 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001997
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001998 if (verbose != 0) {
1999 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
2000 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2001 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002002
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002003 memcpy(iv, aes_test_cfb128_iv, 16);
2004 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002005
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002006 offset = 0;
2007 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2008 /*
2009 * AES-192 is an optional feature that may be unavailable when
2010 * there is an alternative underlying implementation i.e. when
2011 * MBEDTLS_AES_ALT is defined.
2012 */
2013 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2014 mbedtls_printf("skipped\n");
2015 continue;
2016 } else if (ret != 0) {
2017 goto exit;
2018 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002019
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002020 if (mode == MBEDTLS_AES_DECRYPT) {
2021 memcpy(buf, aes_test_cfb128_ct[u], 64);
2022 aes_tests = aes_test_cfb128_pt;
2023 } else {
2024 memcpy(buf, aes_test_cfb128_pt, 64);
2025 aes_tests = aes_test_cfb128_ct[u];
2026 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002027
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002028 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2029 if (ret != 0) {
2030 goto exit;
2031 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002032
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002033 if (memcmp(buf, aes_tests, 64) != 0) {
2034 ret = 1;
2035 goto exit;
2036 }
2037
2038 if (verbose != 0) {
2039 mbedtls_printf("passed\n");
2040 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002041 }
2042
Gilles Peskine449bd832023-01-11 14:50:10 +01002043 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002044 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002045 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002046 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002047#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002048
Simon Butcherad4e4932018-04-29 00:43:47 +01002049#if defined(MBEDTLS_CIPHER_MODE_OFB)
2050 /*
2051 * OFB mode
2052 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002053 {
2054 static const int num_tests =
2055 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002056
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002057 for (i = 0; i < num_tests << 1; i++) {
2058 u = i >> 1;
2059 keybits = 128 + u * 64;
2060 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002061
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002062 if (verbose != 0) {
2063 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2064 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2065 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002066
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002067 memcpy(iv, aes_test_ofb_iv, 16);
2068 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002069
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002070 offset = 0;
2071 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2072 /*
2073 * AES-192 is an optional feature that may be unavailable when
2074 * there is an alternative underlying implementation i.e. when
2075 * MBEDTLS_AES_ALT is defined.
2076 */
2077 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2078 mbedtls_printf("skipped\n");
2079 continue;
2080 } else if (ret != 0) {
2081 goto exit;
2082 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002083
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002084 if (mode == MBEDTLS_AES_DECRYPT) {
2085 memcpy(buf, aes_test_ofb_ct[u], 64);
2086 aes_tests = aes_test_ofb_pt;
2087 } else {
2088 memcpy(buf, aes_test_ofb_pt, 64);
2089 aes_tests = aes_test_ofb_ct[u];
2090 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002091
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002092 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2093 if (ret != 0) {
2094 goto exit;
2095 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002096
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002097 if (memcmp(buf, aes_tests, 64) != 0) {
2098 ret = 1;
2099 goto exit;
2100 }
2101
2102 if (verbose != 0) {
2103 mbedtls_printf("passed\n");
2104 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002105 }
2106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002108 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002109 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002110 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002111#endif /* MBEDTLS_CIPHER_MODE_OFB */
2112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002113#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002114 /*
2115 * CTR mode
2116 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002117 {
2118 static const int num_tests =
2119 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002120
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002121 for (i = 0; i < num_tests << 1; i++) {
2122 u = i >> 1;
2123 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002124
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002125 if (verbose != 0) {
2126 mbedtls_printf(" AES-CTR-128 (%s): ",
2127 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2128 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002129
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002130 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2131 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002132
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002133 offset = 0;
2134 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2135 goto exit;
2136 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002137
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002138 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002139
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002140 if (mode == MBEDTLS_AES_DECRYPT) {
2141 memcpy(buf, aes_test_ctr_ct[u], len);
2142 aes_tests = aes_test_ctr_pt[u];
2143 } else {
2144 memcpy(buf, aes_test_ctr_pt[u], len);
2145 aes_tests = aes_test_ctr_ct[u];
2146 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002147
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002148 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2149 stream_block, buf, buf);
2150 if (ret != 0) {
2151 goto exit;
2152 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002153
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002154 if (memcmp(buf, aes_tests, len) != 0) {
2155 ret = 1;
2156 goto exit;
2157 }
2158
2159 if (verbose != 0) {
2160 mbedtls_printf("passed\n");
2161 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002162 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002163 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002164
Gilles Peskine449bd832023-01-11 14:50:10 +01002165 if (verbose != 0) {
2166 mbedtls_printf("\n");
2167 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002168#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002169
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002170#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002171 /*
2172 * XTS mode
2173 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002174 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 static const int num_tests =
2176 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2177 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002178
Gilles Peskine449bd832023-01-11 14:50:10 +01002179 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002180
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 for (i = 0; i < num_tests << 1; i++) {
2182 const unsigned char *data_unit;
2183 u = i >> 1;
2184 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 if (verbose != 0) {
2187 mbedtls_printf(" AES-XTS-128 (%s): ",
2188 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2189 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002190
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 memset(key, 0, sizeof(key));
2192 memcpy(key, aes_test_xts_key[u], 32);
2193 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002194
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002196
Gilles Peskine449bd832023-01-11 14:50:10 +01002197 if (mode == MBEDTLS_AES_DECRYPT) {
2198 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2199 if (ret != 0) {
2200 goto exit;
2201 }
2202 memcpy(buf, aes_test_xts_ct32[u], len);
2203 aes_tests = aes_test_xts_pt32[u];
2204 } else {
2205 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2206 if (ret != 0) {
2207 goto exit;
2208 }
2209 memcpy(buf, aes_test_xts_pt32[u], len);
2210 aes_tests = aes_test_xts_ct32[u];
2211 }
2212
2213
2214 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2215 buf, buf);
2216 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002217 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002218 }
2219
2220 if (memcmp(buf, aes_tests, len) != 0) {
2221 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002222 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 }
2224
2225 if (verbose != 0) {
2226 mbedtls_printf("passed\n");
2227 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002228 }
2229
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 if (verbose != 0) {
2231 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002232 }
2233
Gilles Peskine449bd832023-01-11 14:50:10 +01002234 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002235 }
2236#endif /* MBEDTLS_CIPHER_MODE_XTS */
2237
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002238 ret = 0;
2239
2240exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002241 if (ret != 0 && verbose != 0) {
2242 mbedtls_printf("failed\n");
2243 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002244
Gilles Peskine449bd832023-01-11 14:50:10 +01002245 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002246
Gilles Peskine449bd832023-01-11 14:50:10 +01002247 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002248}
2249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002250#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002251
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002252#endif /* MBEDTLS_AES_C */