blob: 08e3caadd051052b4216d0296765671f9fc3a0e6 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
21 *
22 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
23 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
31
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030033#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_PADLOCK_C)
Chris Jones16dbaeb2021-03-09 17:47:55 +000037#include "padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000040#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080042#if defined(MBEDTLS_AESCE_C)
43#include "aesce.h"
44#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020049
Gilles Peskine0f454e42023-03-16 14:58:46 +010050#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +000051static int aes_padlock_ace = -1;
52#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * Forward S-box
57 */
58static const unsigned char FSb[256] =
59{
60 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
61 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
62 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
63 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
64 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
65 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
66 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
67 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
68 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
69 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
70 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
71 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
72 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
73 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
74 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
75 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
76 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
77 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
78 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
79 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
80 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
81 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
82 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
83 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
84 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
85 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
86 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
87 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
88 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
89 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
90 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
91 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
92};
93
94/*
95 * Forward tables
96 */
97#define FT \
98\
Gilles Peskine449bd832023-01-11 14:50:10 +010099 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
100 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
101 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
102 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
103 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
104 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
105 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
106 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
107 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
108 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
109 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
110 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
111 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
112 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
113 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
114 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
115 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
116 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
117 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
118 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
119 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
120 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
121 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
122 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
123 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
124 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
125 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
126 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
127 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
128 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
129 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
130 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
131 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
132 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
133 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
134 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
135 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
136 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
137 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
138 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
139 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
140 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
141 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
142 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
143 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
144 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
145 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
146 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
147 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
148 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
149 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
150 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
151 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
152 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
153 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
154 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
155 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
156 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
157 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
158 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
159 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
160 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
161 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
162 V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000165static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000166#undef V
167
Hanno Beckerad049a92017-06-19 16:31:54 +0100168#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000171static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000172#undef V
173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000175static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000176#undef V
177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000179static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000180#undef V
181
Hanno Becker177d3cf2017-06-07 15:52:48 +0100182#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200183
Paul Bakker5121ce52009-01-03 21:22:43 +0000184#undef FT
185
186/*
187 * Reverse S-box
188 */
189static const unsigned char RSb[256] =
190{
191 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
192 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
193 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
194 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
195 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
196 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
197 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
198 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
199 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
200 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
201 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
202 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
203 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
204 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
205 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
206 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
207 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
208 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
209 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
210 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
211 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
212 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
213 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
214 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
215 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
216 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
217 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
218 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
219 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
220 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
221 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
222 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
223};
224
225/*
226 * Reverse tables
227 */
228#define RT \
229\
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
231 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
232 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
233 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
234 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
235 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
236 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
237 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
238 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
239 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
240 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
241 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
242 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
243 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
244 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
245 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
246 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
247 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
248 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
249 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
250 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
251 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
252 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
253 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
254 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
255 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
256 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
257 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
258 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
259 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
260 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
261 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
262 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
263 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
264 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
265 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
266 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
267 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
268 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
269 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
270 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
271 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
272 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
273 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
274 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
275 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
276 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
277 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
278 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
279 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
280 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
281 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
282 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
283 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
284 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
285 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
286 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
287 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
288 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
289 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
290 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
291 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
292 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
293 V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000294
Gilles Peskine449bd832023-01-11 14:50:10 +0100295#define V(a, b, c, d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000296static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000297#undef V
298
Hanno Beckerad049a92017-06-19 16:31:54 +0100299#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301#define V(a, b, c, d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000302static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000303#undef V
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305#define V(a, b, c, d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000307#undef V
308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309#define V(a, b, c, d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000311#undef V
312
Hanno Becker177d3cf2017-06-07 15:52:48 +0100313#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200314
Paul Bakker5121ce52009-01-03 21:22:43 +0000315#undef RT
316
317/*
318 * Round constants
319 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000321{
322 0x00000001, 0x00000002, 0x00000004, 0x00000008,
323 0x00000010, 0x00000020, 0x00000040, 0x00000080,
324 0x0000001B, 0x00000036
325};
326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
329/*
330 * Forward S-box & tables
331 */
332static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200333static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100334#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200335static uint32_t FT1[256];
336static uint32_t FT2[256];
337static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100338#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Reverse S-box & tables
342 */
343static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000344static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100345#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346static uint32_t RT1[256];
347static uint32_t RT2[256];
348static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100349#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
351/*
352 * Round constants
353 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
356/*
357 * Tables generation code
358 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
360#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
361#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363static int aes_init_done = 0;
364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000366{
367 int i, x, y, z;
368 int pow[256];
369 int log[256];
370
371 /*
372 * compute pow and log tables over GF(2^8)
373 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 for (i = 0, x = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 pow[i] = x;
376 log[x] = i;
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 x = MBEDTLS_BYTE_0(x ^ XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000378 }
379
380 /*
381 * calculate the round constants
382 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 for (i = 0, x = 1; i < 10; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000384 RCON[i] = (uint32_t) x;
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 x = MBEDTLS_BYTE_0(XTIME(x));
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 }
387
388 /*
389 * generate the forward and reverse S-boxes
390 */
391 FSb[0x00] = 0x63;
392 RSb[0x63] = 0x00;
393
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 for (i = 1; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000395 x = pow[255 - log[i]];
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
398 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
399 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
400 x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7));
Paul Bakker5121ce52009-01-03 21:22:43 +0000401 x ^= y ^ 0x63;
402
403 FSb[i] = (unsigned char) x;
404 RSb[x] = (unsigned char) i;
405 }
406
407 /*
408 * generate the forward and reverse tables
409 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 for (i = 0; i < 256; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000411 x = FSb[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 y = MBEDTLS_BYTE_0(XTIME(x));
413 z = MBEDTLS_BYTE_0(y ^ x);
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 FT0[i] = ((uint32_t) y) ^
416 ((uint32_t) x << 8) ^
417 ((uint32_t) x << 16) ^
418 ((uint32_t) z << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Hanno Beckerad049a92017-06-19 16:31:54 +0100420#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 FT1[i] = ROTL8(FT0[i]);
422 FT2[i] = ROTL8(FT1[i]);
423 FT3[i] = ROTL8(FT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100424#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000425
426 x = RSb[i];
427
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
429 ((uint32_t) MUL(0x09, x) << 8) ^
430 ((uint32_t) MUL(0x0D, x) << 16) ^
431 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
Hanno Beckerad049a92017-06-19 16:31:54 +0100433#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 RT1[i] = ROTL8(RT0[i]);
435 RT2[i] = ROTL8(RT1[i]);
436 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100437#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000438 }
439}
440
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200441#undef ROTL8
442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Hanno Beckerad049a92017-06-19 16:31:54 +0100445#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
448#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
449#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200450
451#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100452#define AES_RT1(idx) ROTL8(RT0[idx])
453#define AES_RT2(idx) ROTL16(RT0[idx])
454#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200455
456#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100457#define AES_FT1(idx) ROTL8(FT0[idx])
458#define AES_FT2(idx) ROTL16(FT0[idx])
459#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200460
Hanno Becker177d3cf2017-06-07 15:52:48 +0100461#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200462
463#define AES_RT0(idx) RT0[idx]
464#define AES_RT1(idx) RT1[idx]
465#define AES_RT2(idx) RT2[idx]
466#define AES_RT3(idx) RT3[idx]
467
468#define AES_FT0(idx) FT0[idx]
469#define AES_FT1(idx) FT1[idx]
470#define AES_FT2(idx) FT2[idx]
471#define AES_FT3(idx) FT3[idx]
472
Hanno Becker177d3cf2017-06-07 15:52:48 +0100473#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200474
Gilles Peskine449bd832023-01-11 14:50:10 +0100475void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200476{
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200478}
479
Gilles Peskine449bd832023-01-11 14:50:10 +0100480void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200481{
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487}
488
Jaeden Amero9366feb2018-05-29 18:55:17 +0100489#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100490void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100491{
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 mbedtls_aes_init(&ctx->crypt);
493 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100494}
495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100497{
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100499 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 }
Simon Butcher5201e412018-12-06 17:40:14 +0000501
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 mbedtls_aes_free(&ctx->crypt);
503 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100504}
505#endif /* MBEDTLS_CIPHER_MODE_XTS */
506
Gilles Peskine0de8f852023-03-16 17:14:59 +0100507/* Some implementations need the round keys to be aligned.
508 * Return an offset to be added to buf, such that (buf + offset) is
509 * correctly aligned.
510 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
511 * i.e. an offset of 1 means 4 bytes and so on.
512 */
513#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100514 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100515#define MAY_NEED_TO_ALIGN
516#endif
517static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
518{
519#if defined(MAY_NEED_TO_ALIGN)
520 int align_16_bytes = 0;
521
522#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
523 if (aes_padlock_ace == -1) {
524 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
525 }
526 if (aes_padlock_ace) {
527 align_16_bytes = 1;
528 }
529#endif
530
Gilles Peskine9c682e72023-03-16 17:21:33 +0100531#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100532 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
533 align_16_bytes = 1;
534 }
535#endif
536
537 if (align_16_bytes) {
538 /* These implementations needs 16-byte alignment
539 * for the round key array. */
540 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
541 if (delta == 0) {
542 return 0;
543 } else {
544 return 4 - delta; // 16 bytes = 4 uint32_t
545 }
546 }
547#else /* MAY_NEED_TO_ALIGN */
548 (void) buf;
549#endif /* MAY_NEED_TO_ALIGN */
550
551 return 0;
552}
553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554/*
555 * AES key schedule (encryption)
556 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200557#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100558int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
559 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000560{
Paul Bakker23986e52011-04-24 08:57:21 +0000561 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000562 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
Gilles Peskine449bd832023-01-11 14:50:10 +0100564 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000565 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800566#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000567 case 192: ctx->nr = 12; break;
568 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800569#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 }
572
Simon Butcher5201e412018-12-06 17:40:14 +0000573#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000575 aes_gen_tables();
576 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000577 }
578#endif
579
Gilles Peskine0de8f852023-03-16 17:14:59 +0100580 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100581 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100583#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
585 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
586 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100587#endif
588
Jerry Yu3f2fb712023-01-10 17:05:42 +0800589#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
590 if (mbedtls_aesce_has_support()) {
591 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
592 }
593#endif
594
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 for (i = 0; i < (keybits >> 5); i++) {
596 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 }
598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000600 case 10:
601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 for (i = 0; i < 10; i++, RK += 4) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000603 RK[4] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
605 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
606 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
607 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000608
609 RK[5] = RK[1] ^ RK[4];
610 RK[6] = RK[2] ^ RK[5];
611 RK[7] = RK[3] ^ RK[6];
612 }
613 break;
614
Arto Kinnunen732ca322023-04-14 14:26:10 +0800615#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 case 12:
617
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 for (i = 0; i < 8; i++, RK += 6) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000619 RK[6] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
621 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
622 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
623 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625 RK[7] = RK[1] ^ RK[6];
626 RK[8] = RK[2] ^ RK[7];
627 RK[9] = RK[3] ^ RK[8];
628 RK[10] = RK[4] ^ RK[9];
629 RK[11] = RK[5] ^ RK[10];
630 }
631 break;
632
633 case 14:
634
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 for (i = 0; i < 7; i++, RK += 8) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 RK[8] = RK[0] ^ RCON[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
638 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
639 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
640 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[9] = RK[1] ^ RK[8];
643 RK[10] = RK[2] ^ RK[9];
644 RK[11] = RK[3] ^ RK[10];
645
646 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
648 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
649 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
650 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[13] = RK[5] ^ RK[12];
653 RK[14] = RK[6] ^ RK[13];
654 RK[15] = RK[7] ^ RK[14];
655 }
656 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800657#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000658 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000659
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000661}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200662#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
664/*
665 * AES key schedule (decryption)
666 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200667#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100668int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
669 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000670{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200671 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000673 uint32_t *RK;
674 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200675
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000677
Gilles Peskine0de8f852023-03-16 17:14:59 +0100678 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100679 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000680
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200681 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200683 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100684 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000685
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200686 ctx->nr = cty.nr;
687
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100688#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100689 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
690 mbedtls_aesni_inverse_key((unsigned char *) RK,
691 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200692 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100693 }
694#endif
695
Jerry Yue096da12023-01-10 17:07:01 +0800696#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
697 if (mbedtls_aesce_has_support()) {
698 mbedtls_aesce_inverse_key(
699 (unsigned char *) RK,
700 (const unsigned char *) (cty.buf + cty.rk_offset),
701 ctx->nr);
702 goto exit;
703 }
704#endif
705
Werner Lewisdd76ef32022-05-30 12:00:21 +0100706 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
708 *RK++ = *SK++;
709 *RK++ = *SK++;
710 *RK++ = *SK++;
711 *RK++ = *SK++;
712
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) {
714 for (j = 0; j < 4; j++, SK++) {
715 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
716 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
717 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
718 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000719 }
720 }
721
722 *RK++ = *SK++;
723 *RK++ = *SK++;
724 *RK++ = *SK++;
725 *RK++ = *SK++;
726
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200727exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000729
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000731}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100732#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100733
734#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100735static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
736 unsigned int keybits,
737 const unsigned char **key1,
738 unsigned int *key1bits,
739 const unsigned char **key2,
740 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100741{
742 const unsigned int half_keybits = keybits / 2;
743 const unsigned int half_keybytes = half_keybits / 8;
744
Gilles Peskine449bd832023-01-11 14:50:10 +0100745 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100746 case 256: break;
747 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100749 }
750
751 *key1bits = half_keybits;
752 *key2bits = half_keybits;
753 *key1 = &key[0];
754 *key2 = &key[half_keybytes];
755
756 return 0;
757}
758
Gilles Peskine449bd832023-01-11 14:50:10 +0100759int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
760 const unsigned char *key,
761 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100762{
Janos Follath24eed8d2019-11-22 13:21:35 +0000763 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100764 const unsigned char *key1, *key2;
765 unsigned int key1bits, key2bits;
766
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
768 &key2, &key2bits);
769 if (ret != 0) {
770 return ret;
771 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772
773 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
775 if (ret != 0) {
776 return ret;
777 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100778
779 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100781}
782
Gilles Peskine449bd832023-01-11 14:50:10 +0100783int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
784 const unsigned char *key,
785 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100786{
Janos Follath24eed8d2019-11-22 13:21:35 +0000787 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788 const unsigned char *key1, *key2;
789 unsigned int key1bits, key2bits;
790
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
792 &key2, &key2bits);
793 if (ret != 0) {
794 return ret;
795 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100796
797 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
799 if (ret != 0) {
800 return ret;
801 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100802
803 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100804 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100805}
806#endif /* MBEDTLS_CIPHER_MODE_XTS */
807
Gilles Peskine449bd832023-01-11 14:50:10 +0100808#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100809 do \
810 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100811 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
812 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
813 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
814 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100815 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100816 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
817 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
818 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
819 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100820 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
822 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
823 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
824 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100825 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
827 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
828 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
829 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
830 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100833 do \
834 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100835 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
836 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
837 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
838 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100839 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
841 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
842 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
843 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100844 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
846 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
847 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
848 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100849 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
851 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
852 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
853 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
854 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000855
856/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200857 * AES-ECB block encryption
858 */
859#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100860int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
861 const unsigned char input[16],
862 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200863{
864 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100865 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200867 uint32_t X[4];
868 uint32_t Y[4];
869 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200870
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
872 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
873 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
874 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200875
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
877 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
878 AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200879 }
880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200882
Gilles Peskine5197c662020-08-26 17:03:24 +0200883 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
885 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
886 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
887 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200888
Gilles Peskine5197c662020-08-26 17:03:24 +0200889 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
891 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
892 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
893 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
898 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
899 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
904 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
905 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
908 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
909 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
910 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000911
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200915}
916#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
917
918/*
919 * AES-ECB block decryption
920 */
921#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100922int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
923 const unsigned char input[16],
924 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925{
926 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100927 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200929 uint32_t X[4];
930 uint32_t Y[4];
931 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200932
Gilles Peskine449bd832023-01-11 14:50:10 +0100933 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
934 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
935 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
936 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
939 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
940 AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200941 }
942
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200944
Gilles Peskine5197c662020-08-26 17:03:24 +0200945 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
947 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
948 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
949 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200950
Gilles Peskine5197c662020-08-26 17:03:24 +0200951 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
953 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
954 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
955 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200956
Gilles Peskine5197c662020-08-26 17:03:24 +0200957 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
960 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
961 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200962
Gilles Peskine5197c662020-08-26 17:03:24 +0200963 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
966 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
967 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200968
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
970 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
971 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
972 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000973
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500975
Gilles Peskine449bd832023-01-11 14:50:10 +0100976 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200977}
978#endif /* !MBEDTLS_AES_DECRYPT_ALT */
979
Gilles Peskine0de8f852023-03-16 17:14:59 +0100980#if defined(MAY_NEED_TO_ALIGN)
Gilles Peskine148cad12023-03-16 13:08:42 +0100981/* VIA Padlock and our intrinsics-based implementation of AESNI require
982 * the round keys to be aligned on a 16-byte boundary. We take care of this
983 * before creating them, but the AES context may have moved (this can happen
984 * if the library is called from a language with managed memory), and in later
985 * calls it might have a different alignment with respect to 16-byte memory.
986 * So we may need to realign.
987 */
988static void aes_maybe_realign(mbedtls_aes_context *ctx)
989{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100990 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
991 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +0100992 memmove(ctx->buf + new_offset, // new address
993 ctx->buf + ctx->rk_offset, // current address
994 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
995 ctx->rk_offset = new_offset;
996 }
997}
998#endif
999
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001000/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001001 * AES-ECB block encryption/decryption
1002 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001003int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1004 int mode,
1005 const unsigned char input[16],
1006 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001007{
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001009 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001010 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001011
Gilles Peskine0de8f852023-03-16 17:14:59 +01001012#if defined(MAY_NEED_TO_ALIGN)
1013 aes_maybe_realign(ctx);
1014#endif
1015
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001016#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001017 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1018 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1019 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001020#endif
1021
Jerry Yu2bb3d812023-01-10 17:38:26 +08001022#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1023 if (mbedtls_aesce_has_support()) {
1024 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1025 }
1026#endif
1027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001030 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001031 }
1032#endif
1033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 if (mode == MBEDTLS_AES_ENCRYPT) {
1035 return mbedtls_internal_aes_encrypt(ctx, input, output);
1036 } else {
1037 return mbedtls_internal_aes_decrypt(ctx, input, output);
1038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001039}
1040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001042
1043#if defined(__ARM_NEON) && defined(__aarch64__)
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001044/* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
1045 * the result for the next block in CBC, and the cost of transferring that data from
1046 * NEON registers, it is faster to use the following on aarch64.
1047 * For 32-bit arm, NEON should be faster. */
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001048#define CBC_XOR_16(r, a, b) do { \
Dave Rodgman28a97ac2023-06-14 20:15:15 +01001049 mbedtls_put_unaligned_uint64(r, \
1050 mbedtls_get_unaligned_uint64(a) ^ \
1051 mbedtls_get_unaligned_uint64(b)); \
1052 mbedtls_put_unaligned_uint64(r + 8, \
1053 mbedtls_get_unaligned_uint64(a + 8) ^ \
1054 mbedtls_get_unaligned_uint64(b + 8)); \
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001055} while (0)
1056#else
1057#define CBC_XOR_16(r, a, b) mbedtls_xor(r, a, b, 16)
1058#endif
1059
Paul Bakker5121ce52009-01-03 21:22:43 +00001060/*
1061 * AES-CBC buffer encryption/decryption
1062 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001063int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1064 int mode,
1065 size_t length,
1066 unsigned char iv[16],
1067 const unsigned char *input,
1068 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001069{
Gilles Peskine7820a572021-07-07 21:08:28 +02001070 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001071 unsigned char temp[16];
1072
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001074 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001076
Gilles Peskine449bd832023-01-11 14:50:10 +01001077 if (length % 16) {
1078 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1079 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001082 if (aes_padlock_ace > 0) {
1083 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1084 return 0;
1085 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001086
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001087 // If padlock data misaligned, we just fall back to
1088 // unaccelerated mode
1089 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001090 }
1091#endif
1092
Dave Rodgman906c63c2023-06-14 17:53:51 +01001093 const unsigned char *ivp = iv;
1094
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 if (mode == MBEDTLS_AES_DECRYPT) {
1096 while (length > 0) {
1097 memcpy(temp, input, 16);
1098 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1099 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001100 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 }
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001102 CBC_XOR_16(output, output, iv);
Paul Bakker5121ce52009-01-03 21:22:43 +00001103
Gilles Peskine449bd832023-01-11 14:50:10 +01001104 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001105
1106 input += 16;
1107 output += 16;
1108 length -= 16;
1109 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 } else {
1111 while (length > 0) {
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001112 CBC_XOR_16(output, input, ivp);
Paul Bakker5121ce52009-01-03 21:22:43 +00001113
Gilles Peskine449bd832023-01-11 14:50:10 +01001114 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1115 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001116 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001117 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001118 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001119
1120 input += 16;
1121 output += 16;
1122 length -= 16;
1123 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001124 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001125 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001126 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001127
Gilles Peskine7820a572021-07-07 21:08:28 +02001128exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001129 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001130}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001132
Aorimn5f778012016-06-09 23:22:58 +02001133#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001134
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001135typedef unsigned char mbedtls_be128[16];
1136
1137/*
1138 * GF(2^128) multiplication function
1139 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001140 * This function multiplies a field element by x in the polynomial field
1141 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001142 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001143 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001144 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001145static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1146 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001147{
1148 uint64_t a, b, ra, rb;
1149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 a = MBEDTLS_GET_UINT64_LE(x, 0);
1151 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001152
Gilles Peskine449bd832023-01-11 14:50:10 +01001153 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1154 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001155
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1157 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001158}
1159
Aorimn5f778012016-06-09 23:22:58 +02001160/*
1161 * AES-XTS buffer encryption/decryption
1162 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001163int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1164 int mode,
1165 size_t length,
1166 const unsigned char data_unit[16],
1167 const unsigned char *input,
1168 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001169{
Janos Follath24eed8d2019-11-22 13:21:35 +00001170 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001171 size_t blocks = length / 16;
1172 size_t leftover = length % 16;
1173 unsigned char tweak[16];
1174 unsigned char prev_tweak[16];
1175 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001178 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001179 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001180
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001181 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001182 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001183 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 }
Aorimn5f778012016-06-09 23:22:58 +02001185
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001186 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001188 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 }
Aorimn5f778012016-06-09 23:22:58 +02001190
Jaeden Amerod82cd862018-04-28 15:02:45 +01001191 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1193 data_unit, tweak);
1194 if (ret != 0) {
1195 return ret;
1196 }
Aorimn5f778012016-06-09 23:22:58 +02001197
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001199 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001200 /* We are on the last block in a decrypt operation that has
1201 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001202 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001203 * the leftovers and then update the current tweak for use on this,
1204 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001205 memcpy(prev_tweak, tweak, sizeof(tweak));
1206 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001207 }
1208
Gilles Peskine449bd832023-01-11 14:50:10 +01001209 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1212 if (ret != 0) {
1213 return ret;
1214 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001217
1218 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001220
1221 output += 16;
1222 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001223 }
1224
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001226 /* If we are on the leftover bytes in a decrypt operation, we need to
1227 * use the previous tweak for these bytes (as saved in prev_tweak). */
1228 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001229
Jaeden Amerod82cd862018-04-28 15:02:45 +01001230 /* We are now on the final part of the data unit, which doesn't divide
1231 * evenly by 16. It's time for ciphertext stealing. */
1232 size_t i;
1233 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001234
Jaeden Amerod82cd862018-04-28 15:02:45 +01001235 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001236 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001238 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001239 }
Aorimn5f778012016-06-09 23:22:58 +02001240
Dave Rodgman069e7f42022-11-24 19:37:26 +00001241 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001243
Jaeden Amerod82cd862018-04-28 15:02:45 +01001244 /* Copy ciphertext bytes from the previous block for input in this
1245 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001246 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001247
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1249 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001250 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 }
Aorimn5f778012016-06-09 23:22:58 +02001252
Jaeden Amerod82cd862018-04-28 15:02:45 +01001253 /* Write the result back to the previous block, overriding the previous
1254 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001256 }
1257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001259}
1260#endif /* MBEDTLS_CIPHER_MODE_XTS */
1261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001263/*
1264 * AES-CFB128 buffer encryption/decryption
1265 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001266int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1267 int mode,
1268 size_t length,
1269 size_t *iv_off,
1270 unsigned char iv[16],
1271 const unsigned char *input,
1272 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001273{
Paul Bakker27fdf462011-06-09 13:55:13 +00001274 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001275 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001276 size_t n;
1277
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001279 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001280 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001281
1282 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001283
Gilles Peskine449bd832023-01-11 14:50:10 +01001284 if (n > 15) {
1285 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1286 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001287
Gilles Peskine449bd832023-01-11 14:50:10 +01001288 if (mode == MBEDTLS_AES_DECRYPT) {
1289 while (length--) {
1290 if (n == 0) {
1291 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1292 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001293 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001295 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001296
1297 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001299 iv[n] = (unsigned char) c;
1300
Gilles Peskine449bd832023-01-11 14:50:10 +01001301 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001302 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 } else {
1304 while (length--) {
1305 if (n == 0) {
1306 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1307 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001308 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001309 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001310 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001311
Gilles Peskine449bd832023-01-11 14:50:10 +01001312 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001313
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001315 }
1316 }
1317
1318 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001319 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001320
Gilles Peskine7820a572021-07-07 21:08:28 +02001321exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001322 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001323}
Paul Bakker556efba2014-01-24 15:38:12 +01001324
1325/*
1326 * AES-CFB8 buffer encryption/decryption
1327 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001328int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1329 int mode,
1330 size_t length,
1331 unsigned char iv[16],
1332 const unsigned char *input,
1333 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001334{
Gilles Peskine7820a572021-07-07 21:08:28 +02001335 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001336 unsigned char c;
1337 unsigned char ov[17];
1338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001340 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 }
1342 while (length--) {
1343 memcpy(ov, iv, 16);
1344 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1345 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001346 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 }
Paul Bakker556efba2014-01-24 15:38:12 +01001348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001350 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001351 }
Paul Bakker556efba2014-01-24 15:38:12 +01001352
Gilles Peskine449bd832023-01-11 14:50:10 +01001353 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001354
Gilles Peskine449bd832023-01-11 14:50:10 +01001355 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001356 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001357 }
Paul Bakker556efba2014-01-24 15:38:12 +01001358
Gilles Peskine449bd832023-01-11 14:50:10 +01001359 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001360 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001361 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001362
Gilles Peskine7820a572021-07-07 21:08:28 +02001363exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001365}
Simon Butcher76a5b222018-04-22 22:57:27 +01001366#endif /* MBEDTLS_CIPHER_MODE_CFB */
1367
1368#if defined(MBEDTLS_CIPHER_MODE_OFB)
1369/*
1370 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1371 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001372int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1373 size_t length,
1374 size_t *iv_off,
1375 unsigned char iv[16],
1376 const unsigned char *input,
1377 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001378{
Simon Butcherad4e4932018-04-29 00:43:47 +01001379 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001380 size_t n;
1381
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001382 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001383
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 if (n > 15) {
1385 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1386 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001387
Gilles Peskine449bd832023-01-11 14:50:10 +01001388 while (length--) {
1389 if (n == 0) {
1390 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1391 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001392 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001394 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001395 *output++ = *input++ ^ iv[n];
1396
Gilles Peskine449bd832023-01-11 14:50:10 +01001397 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001398 }
1399
1400 *iv_off = n;
1401
Simon Butcherad4e4932018-04-29 00:43:47 +01001402exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001404}
1405#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001407#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001408/*
1409 * AES-CTR buffer encryption/decryption
1410 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001411int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1412 size_t length,
1413 size_t *nc_off,
1414 unsigned char nonce_counter[16],
1415 unsigned char stream_block[16],
1416 const unsigned char *input,
1417 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001418{
Paul Bakker369e14b2012-04-18 14:16:09 +00001419 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001420 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001421 size_t n;
1422
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001423 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 if (n > 0x0F) {
1426 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1427 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001428
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 while (length--) {
1430 if (n == 0) {
1431 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1432 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001433 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001434 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001435
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 for (i = 16; i > 0; i--) {
1437 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001438 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 }
1440 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001441 }
1442 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001444
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001446 }
1447
1448 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001449 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001450
Gilles Peskine7820a572021-07-07 21:08:28 +02001451exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001452 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001453}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001455
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001456#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001458#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001459/*
1460 * AES test vectors from:
1461 *
1462 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1463 */
Yanray Wang62c99912023-05-11 11:06:53 +08001464static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001465{
1466 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1467 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001468#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001469 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1470 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1471 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1472 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001473#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001474};
1475
Yanray Wang62c99912023-05-11 11:06:53 +08001476static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001477{
1478 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1479 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001480#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001481 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1482 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1483 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1484 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001485#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001486};
1487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001488#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001489static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001490{
1491 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1492 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001493#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001494 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1495 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1496 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1497 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001498#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001499};
1500
Yanray Wang62c99912023-05-11 11:06:53 +08001501static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001502{
1503 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1504 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001505#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001506 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1507 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1508 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1509 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001510#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001511};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001512#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001514#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001515/*
1516 * AES-CFB128 test vectors from:
1517 *
1518 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1519 */
Yanray Wang62c99912023-05-11 11:06:53 +08001520static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001521{
1522 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1523 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001524#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001525 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1526 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1527 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1528 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1529 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1530 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1531 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001532#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001533};
1534
1535static const unsigned char aes_test_cfb128_iv[16] =
1536{
1537 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1538 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1539};
1540
1541static const unsigned char aes_test_cfb128_pt[64] =
1542{
1543 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1544 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1545 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1546 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1547 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1548 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1549 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1550 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1551};
1552
Yanray Wang62c99912023-05-11 11:06:53 +08001553static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001554{
1555 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1556 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1557 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1558 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1559 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1560 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1561 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1562 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001563#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001564 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1565 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1566 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1567 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1568 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1569 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1570 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1571 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1572 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1573 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1574 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1575 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1576 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1577 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1578 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1579 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001580#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001581};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001582#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001583
Simon Butcherad4e4932018-04-29 00:43:47 +01001584#if defined(MBEDTLS_CIPHER_MODE_OFB)
1585/*
1586 * AES-OFB test vectors from:
1587 *
Simon Butcher5db13622018-06-04 22:11:25 +01001588 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001589 */
Yanray Wang62c99912023-05-11 11:06:53 +08001590static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001591{
1592 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1593 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001594#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001595 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1596 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1597 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1598 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1599 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1600 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1601 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001602#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001603};
1604
1605static const unsigned char aes_test_ofb_iv[16] =
1606{
1607 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1608 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1609};
1610
1611static const unsigned char aes_test_ofb_pt[64] =
1612{
1613 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1614 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1615 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1616 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1617 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1618 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1619 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1620 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1621};
1622
Yanray Wang62c99912023-05-11 11:06:53 +08001623static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001624{
1625 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1626 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1627 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1628 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1629 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1630 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1631 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1632 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001633#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001634 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1635 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1636 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1637 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1638 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1639 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1640 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1641 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1642 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1643 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1644 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1645 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1646 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1647 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1648 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1649 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001650#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001651};
1652#endif /* MBEDTLS_CIPHER_MODE_OFB */
1653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001655/*
1656 * AES-CTR test vectors from:
1657 *
1658 * http://www.faqs.org/rfcs/rfc3686.html
1659 */
1660
Yanray Wang62c99912023-05-11 11:06:53 +08001661static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001662{
1663 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1664 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1665 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1666 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1667 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1668 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1669};
1670
Yanray Wang62c99912023-05-11 11:06:53 +08001671static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001672{
1673 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1674 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1675 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1676 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1677 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1678 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1679};
1680
Yanray Wang62c99912023-05-11 11:06:53 +08001681static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001682{
1683 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1684 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001685 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1686 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1687 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1688 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1689
1690 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1691 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1692 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1693 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1694 0x20, 0x21, 0x22, 0x23 }
1695};
1696
Yanray Wang62c99912023-05-11 11:06:53 +08001697static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001698{
1699 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1700 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1701 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1702 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1703 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1704 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1705 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1706 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1707 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1708 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1709 0x25, 0xB2, 0x07, 0x2F }
1710};
1711
1712static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001713{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001715
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001716#if defined(MBEDTLS_CIPHER_MODE_XTS)
1717/*
1718 * AES-XTS test vectors from:
1719 *
1720 * IEEE P1619/D16 Annex B
1721 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1722 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1723 */
1724static const unsigned char aes_test_xts_key[][32] =
1725{
1726 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1730 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1731 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1732 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1733 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1734 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1735 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1736 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1737 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1738};
1739
1740static const unsigned char aes_test_xts_pt32[][32] =
1741{
1742 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1743 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1746 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1747 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1748 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1749 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1750 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1751 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1752 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1753 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1754};
1755
1756static const unsigned char aes_test_xts_ct32[][32] =
1757{
1758 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1759 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1760 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1761 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1762 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1763 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1764 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1765 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1766 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1767 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1768 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1769 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1770};
1771
1772static const unsigned char aes_test_xts_data_unit[][16] =
1773{
Gilles Peskine449bd832023-01-11 14:50:10 +01001774 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1776 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1778 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001780};
1781
1782#endif /* MBEDTLS_CIPHER_MODE_XTS */
1783
Paul Bakker5121ce52009-01-03 21:22:43 +00001784/*
1785 * Checkup routine
1786 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001787int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001788{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001789 int ret = 0, i, j, u, mode;
1790 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001791 unsigned char key[32];
1792 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001793 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001794#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1795 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001796 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001797#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001798#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001799 unsigned char prv[16];
1800#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001801#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1802 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001803 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001804#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001805#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001806 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001807#endif
1808#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001809 unsigned char nonce_counter[16];
1810 unsigned char stream_block[16];
1811#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001812 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001813
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 memset(key, 0, 32);
1815 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001816
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001817 if (verbose != 0) {
1818#if defined(MBEDTLS_AES_ALT)
1819 mbedtls_printf(" AES note: alternative implementation.\n");
1820#else /* MBEDTLS_AES_ALT */
1821#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1822 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1823 mbedtls_printf(" AES note: using VIA Padlock.\n");
1824 } else
1825#endif
1826#if defined(MBEDTLS_AESNI_HAVE_CODE)
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001827#if MBEDTLS_AESNI_HAVE_CODE == 1
1828 mbedtls_printf(" AES note: AESNI code present (assembly implementation).\n");
1829#elif MBEDTLS_AESNI_HAVE_CODE == 2
1830 mbedtls_printf(" AES note: AESNI code present (intrinsics implementation).\n");
1831#else
1832#error Unrecognised value for MBEDTLS_AESNI_HAVE_CODE
1833#endif
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001834 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1835 mbedtls_printf(" AES note: using AESNI.\n");
1836 } else
1837#endif
1838#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1839 if (mbedtls_aesce_has_support()) {
1840 mbedtls_printf(" AES note: using AESCE.\n");
1841 } else
1842#endif
1843 mbedtls_printf(" AES note: built-in implementation.\n");
1844#endif /* MBEDTLS_AES_ALT */
1845 }
1846
Paul Bakker5121ce52009-01-03 21:22:43 +00001847 /*
1848 * ECB mode
1849 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001850 {
1851 static const int num_tests =
1852 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001853
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001854 for (i = 0; i < num_tests << 1; i++) {
1855 u = i >> 1;
1856 keybits = 128 + u * 64;
1857 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001858
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001859 if (verbose != 0) {
1860 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1861 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1862 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001863
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001864 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001865
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001866 if (mode == MBEDTLS_AES_DECRYPT) {
1867 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1868 aes_tests = aes_test_ecb_dec[u];
1869 } else {
1870 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1871 aes_tests = aes_test_ecb_enc[u];
1872 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001873
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001874 /*
1875 * AES-192 is an optional feature that may be unavailable when
1876 * there is an alternative underlying implementation i.e. when
1877 * MBEDTLS_AES_ALT is defined.
1878 */
1879 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1880 mbedtls_printf("skipped\n");
1881 continue;
1882 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001883 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001884 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001885
1886 for (j = 0; j < 10000; j++) {
1887 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1888 if (ret != 0) {
1889 goto exit;
1890 }
1891 }
1892
1893 if (memcmp(buf, aes_tests, 16) != 0) {
1894 ret = 1;
1895 goto exit;
1896 }
1897
1898 if (verbose != 0) {
1899 mbedtls_printf("passed\n");
1900 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001901 }
1902
Gilles Peskine449bd832023-01-11 14:50:10 +01001903 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001904 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001905 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001906 }
1907
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001908#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 /*
1910 * CBC mode
1911 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001912 {
1913 static const int num_tests =
1914 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001915
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001916 for (i = 0; i < num_tests << 1; i++) {
1917 u = i >> 1;
1918 keybits = 128 + u * 64;
1919 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001920
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001921 if (verbose != 0) {
1922 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1923 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001924 }
1925
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001926 memset(iv, 0, 16);
1927 memset(prv, 0, 16);
1928 memset(buf, 0, 16);
1929
1930 if (mode == MBEDTLS_AES_DECRYPT) {
1931 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1932 aes_tests = aes_test_cbc_dec[u];
1933 } else {
1934 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1935 aes_tests = aes_test_cbc_enc[u];
1936 }
1937
1938 /*
1939 * AES-192 is an optional feature that may be unavailable when
1940 * there is an alternative underlying implementation i.e. when
1941 * MBEDTLS_AES_ALT is defined.
1942 */
1943 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1944 mbedtls_printf("skipped\n");
1945 continue;
1946 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001947 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001948 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001949
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001950 for (j = 0; j < 10000; j++) {
1951 if (mode == MBEDTLS_AES_ENCRYPT) {
1952 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001953
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001954 memcpy(tmp, prv, 16);
1955 memcpy(prv, buf, 16);
1956 memcpy(buf, tmp, 16);
1957 }
1958
1959 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1960 if (ret != 0) {
1961 goto exit;
1962 }
1963
1964 }
1965
1966 if (memcmp(buf, aes_tests, 16) != 0) {
1967 ret = 1;
1968 goto exit;
1969 }
1970
1971 if (verbose != 0) {
1972 mbedtls_printf("passed\n");
1973 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001974 }
1975
Gilles Peskine449bd832023-01-11 14:50:10 +01001976 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001977 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001979 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001980#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001981
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001982#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001983 /*
1984 * CFB128 mode
1985 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001986 {
1987 static const int num_tests =
1988 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00001989
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001990 for (i = 0; i < num_tests << 1; i++) {
1991 u = i >> 1;
1992 keybits = 128 + u * 64;
1993 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001994
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001995 if (verbose != 0) {
1996 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1997 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1998 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001999
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002000 memcpy(iv, aes_test_cfb128_iv, 16);
2001 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002002
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002003 offset = 0;
2004 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2005 /*
2006 * AES-192 is an optional feature that may be unavailable when
2007 * there is an alternative underlying implementation i.e. when
2008 * MBEDTLS_AES_ALT is defined.
2009 */
2010 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2011 mbedtls_printf("skipped\n");
2012 continue;
2013 } else if (ret != 0) {
2014 goto exit;
2015 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002016
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002017 if (mode == MBEDTLS_AES_DECRYPT) {
2018 memcpy(buf, aes_test_cfb128_ct[u], 64);
2019 aes_tests = aes_test_cfb128_pt;
2020 } else {
2021 memcpy(buf, aes_test_cfb128_pt, 64);
2022 aes_tests = aes_test_cfb128_ct[u];
2023 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002024
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002025 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2026 if (ret != 0) {
2027 goto exit;
2028 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002029
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002030 if (memcmp(buf, aes_tests, 64) != 0) {
2031 ret = 1;
2032 goto exit;
2033 }
2034
2035 if (verbose != 0) {
2036 mbedtls_printf("passed\n");
2037 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002038 }
2039
Gilles Peskine449bd832023-01-11 14:50:10 +01002040 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002041 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002042 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002043 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002044#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002045
Simon Butcherad4e4932018-04-29 00:43:47 +01002046#if defined(MBEDTLS_CIPHER_MODE_OFB)
2047 /*
2048 * OFB mode
2049 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002050 {
2051 static const int num_tests =
2052 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002053
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002054 for (i = 0; i < num_tests << 1; i++) {
2055 u = i >> 1;
2056 keybits = 128 + u * 64;
2057 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002058
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002059 if (verbose != 0) {
2060 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2061 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2062 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002063
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002064 memcpy(iv, aes_test_ofb_iv, 16);
2065 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002066
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002067 offset = 0;
2068 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2069 /*
2070 * AES-192 is an optional feature that may be unavailable when
2071 * there is an alternative underlying implementation i.e. when
2072 * MBEDTLS_AES_ALT is defined.
2073 */
2074 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2075 mbedtls_printf("skipped\n");
2076 continue;
2077 } else if (ret != 0) {
2078 goto exit;
2079 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002080
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002081 if (mode == MBEDTLS_AES_DECRYPT) {
2082 memcpy(buf, aes_test_ofb_ct[u], 64);
2083 aes_tests = aes_test_ofb_pt;
2084 } else {
2085 memcpy(buf, aes_test_ofb_pt, 64);
2086 aes_tests = aes_test_ofb_ct[u];
2087 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002088
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002089 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2090 if (ret != 0) {
2091 goto exit;
2092 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002093
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002094 if (memcmp(buf, aes_tests, 64) != 0) {
2095 ret = 1;
2096 goto exit;
2097 }
2098
2099 if (verbose != 0) {
2100 mbedtls_printf("passed\n");
2101 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002102 }
2103
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002105 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002107 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002108#endif /* MBEDTLS_CIPHER_MODE_OFB */
2109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002110#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002111 /*
2112 * CTR mode
2113 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002114 {
2115 static const int num_tests =
2116 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002117
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002118 for (i = 0; i < num_tests << 1; i++) {
2119 u = i >> 1;
2120 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002121
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002122 if (verbose != 0) {
2123 mbedtls_printf(" AES-CTR-128 (%s): ",
2124 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2125 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002126
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002127 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2128 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002129
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002130 offset = 0;
2131 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2132 goto exit;
2133 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002134
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002135 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002136
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002137 if (mode == MBEDTLS_AES_DECRYPT) {
2138 memcpy(buf, aes_test_ctr_ct[u], len);
2139 aes_tests = aes_test_ctr_pt[u];
2140 } else {
2141 memcpy(buf, aes_test_ctr_pt[u], len);
2142 aes_tests = aes_test_ctr_ct[u];
2143 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002144
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002145 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2146 stream_block, buf, buf);
2147 if (ret != 0) {
2148 goto exit;
2149 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002150
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002151 if (memcmp(buf, aes_tests, len) != 0) {
2152 ret = 1;
2153 goto exit;
2154 }
2155
2156 if (verbose != 0) {
2157 mbedtls_printf("passed\n");
2158 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002159 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002160 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002161
Gilles Peskine449bd832023-01-11 14:50:10 +01002162 if (verbose != 0) {
2163 mbedtls_printf("\n");
2164 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002165#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002166
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002167#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002168 /*
2169 * XTS mode
2170 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002171 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002172 static const int num_tests =
2173 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2174 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002175
Gilles Peskine449bd832023-01-11 14:50:10 +01002176 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002177
Gilles Peskine449bd832023-01-11 14:50:10 +01002178 for (i = 0; i < num_tests << 1; i++) {
2179 const unsigned char *data_unit;
2180 u = i >> 1;
2181 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002182
Gilles Peskine449bd832023-01-11 14:50:10 +01002183 if (verbose != 0) {
2184 mbedtls_printf(" AES-XTS-128 (%s): ",
2185 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2186 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002187
Gilles Peskine449bd832023-01-11 14:50:10 +01002188 memset(key, 0, sizeof(key));
2189 memcpy(key, aes_test_xts_key[u], 32);
2190 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002191
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 if (mode == MBEDTLS_AES_DECRYPT) {
2195 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2196 if (ret != 0) {
2197 goto exit;
2198 }
2199 memcpy(buf, aes_test_xts_ct32[u], len);
2200 aes_tests = aes_test_xts_pt32[u];
2201 } else {
2202 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2203 if (ret != 0) {
2204 goto exit;
2205 }
2206 memcpy(buf, aes_test_xts_pt32[u], len);
2207 aes_tests = aes_test_xts_ct32[u];
2208 }
2209
2210
2211 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2212 buf, buf);
2213 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002214 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 }
2216
2217 if (memcmp(buf, aes_tests, len) != 0) {
2218 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002219 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 }
2221
2222 if (verbose != 0) {
2223 mbedtls_printf("passed\n");
2224 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002225 }
2226
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 if (verbose != 0) {
2228 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002229 }
2230
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002232 }
2233#endif /* MBEDTLS_CIPHER_MODE_XTS */
2234
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002235 ret = 0;
2236
2237exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002238 if (ret != 0 && verbose != 0) {
2239 mbedtls_printf("failed\n");
2240 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002241
Gilles Peskine449bd832023-01-11 14:50:10 +01002242 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002243
Gilles Peskine449bd832023-01-11 14:50:10 +01002244 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002245}
2246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002247#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002249#endif /* MBEDTLS_AES_C */