blob: 9147586889acc39272ecb051754741d76df9ef58 [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)
Paul Bakker5121ce52009-01-03 21:22:43 +00001042/*
1043 * AES-CBC buffer encryption/decryption
1044 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001045int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1046 int mode,
1047 size_t length,
1048 unsigned char iv[16],
1049 const unsigned char *input,
1050 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001051{
Gilles Peskine7820a572021-07-07 21:08:28 +02001052 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001053 unsigned char temp[16];
1054
Gilles Peskine449bd832023-01-11 14:50:10 +01001055 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001056 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001058
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 if (length % 16) {
1060 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1061 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001063#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 if (aes_padlock_ace > 0) {
1065 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1066 return 0;
1067 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001068
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001069 // If padlock data misaligned, we just fall back to
1070 // unaccelerated mode
1071 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 }
1073#endif
1074
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 if (mode == MBEDTLS_AES_DECRYPT) {
1076 while (length > 0) {
1077 memcpy(temp, input, 16);
1078 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1079 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001080 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001082
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 mbedtls_xor(output, output, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001084
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001086
1087 input += 16;
1088 output += 16;
1089 length -= 16;
1090 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 } else {
1092 while (length > 0) {
1093 mbedtls_xor(output, input, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001094
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1096 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001097 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001098 }
1099 memcpy(iv, output, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001100
1101 input += 16;
1102 output += 16;
1103 length -= 16;
1104 }
1105 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001106 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001107
Gilles Peskine7820a572021-07-07 21:08:28 +02001108exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001109 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001110}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001111#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001112
Aorimn5f778012016-06-09 23:22:58 +02001113#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001114
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001115typedef unsigned char mbedtls_be128[16];
1116
1117/*
1118 * GF(2^128) multiplication function
1119 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001120 * This function multiplies a field element by x in the polynomial field
1121 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001122 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001123 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001124 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001125static void mbedtls_gf128mul_x_ble(unsigned char r[16],
1126 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001127{
1128 uint64_t a, b, ra, rb;
1129
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 a = MBEDTLS_GET_UINT64_LE(x, 0);
1131 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001132
Gilles Peskine449bd832023-01-11 14:50:10 +01001133 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1134 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001135
Gilles Peskine449bd832023-01-11 14:50:10 +01001136 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1137 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001138}
1139
Aorimn5f778012016-06-09 23:22:58 +02001140/*
1141 * AES-XTS buffer encryption/decryption
1142 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001143int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1144 int mode,
1145 size_t length,
1146 const unsigned char data_unit[16],
1147 const unsigned char *input,
1148 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001149{
Janos Follath24eed8d2019-11-22 13:21:35 +00001150 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001151 size_t blocks = length / 16;
1152 size_t leftover = length % 16;
1153 unsigned char tweak[16];
1154 unsigned char prev_tweak[16];
1155 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001156
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001158 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001160
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001161 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001163 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001164 }
Aorimn5f778012016-06-09 23:22:58 +02001165
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001166 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001168 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 }
Aorimn5f778012016-06-09 23:22:58 +02001170
Jaeden Amerod82cd862018-04-28 15:02:45 +01001171 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001172 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1173 data_unit, tweak);
1174 if (ret != 0) {
1175 return ret;
1176 }
Aorimn5f778012016-06-09 23:22:58 +02001177
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 while (blocks--) {
1179 if (leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001180 /* We are on the last block in a decrypt operation that has
1181 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001182 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001183 * the leftovers and then update the current tweak for use on this,
1184 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 memcpy(prev_tweak, tweak, sizeof(tweak));
1186 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001187 }
1188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001190
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1192 if (ret != 0) {
1193 return ret;
1194 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001195
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001197
1198 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001200
1201 output += 16;
1202 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001203 }
1204
Gilles Peskine449bd832023-01-11 14:50:10 +01001205 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001206 /* If we are on the leftover bytes in a decrypt operation, we need to
1207 * use the previous tweak for these bytes (as saved in prev_tweak). */
1208 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001209
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210 /* We are now on the final part of the data unit, which doesn't divide
1211 * evenly by 16. It's time for ciphertext stealing. */
1212 size_t i;
1213 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001214
Jaeden Amerod82cd862018-04-28 15:02:45 +01001215 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001216 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001219 }
Aorimn5f778012016-06-09 23:22:58 +02001220
Dave Rodgman069e7f42022-11-24 19:37:26 +00001221 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001223
Jaeden Amerod82cd862018-04-28 15:02:45 +01001224 /* Copy ciphertext bytes from the previous block for input in this
1225 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1229 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001230 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 }
Aorimn5f778012016-06-09 23:22:58 +02001232
Jaeden Amerod82cd862018-04-28 15:02:45 +01001233 /* Write the result back to the previous block, overriding the previous
1234 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001236 }
1237
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001239}
1240#endif /* MBEDTLS_CIPHER_MODE_XTS */
1241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001243/*
1244 * AES-CFB128 buffer encryption/decryption
1245 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001246int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1247 int mode,
1248 size_t length,
1249 size_t *iv_off,
1250 unsigned char iv[16],
1251 const unsigned char *input,
1252 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001253{
Paul Bakker27fdf462011-06-09 13:55:13 +00001254 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001255 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001256 size_t n;
1257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001259 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001261
1262 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001263
Gilles Peskine449bd832023-01-11 14:50:10 +01001264 if (n > 15) {
1265 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1266 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001267
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 if (mode == MBEDTLS_AES_DECRYPT) {
1269 while (length--) {
1270 if (n == 0) {
1271 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1272 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001273 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001275 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001276
1277 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001279 iv[n] = (unsigned char) c;
1280
Gilles Peskine449bd832023-01-11 14:50:10 +01001281 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001282 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001283 } else {
1284 while (length--) {
1285 if (n == 0) {
1286 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1287 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001288 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001290 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001291
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001293
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 }
1296 }
1297
1298 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001299 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001300
Gilles Peskine7820a572021-07-07 21:08:28 +02001301exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001302 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001303}
Paul Bakker556efba2014-01-24 15:38:12 +01001304
1305/*
1306 * AES-CFB8 buffer encryption/decryption
1307 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001308int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1309 int mode,
1310 size_t length,
1311 unsigned char iv[16],
1312 const unsigned char *input,
1313 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001314{
Gilles Peskine7820a572021-07-07 21:08:28 +02001315 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001316 unsigned char c;
1317 unsigned char ov[17];
1318
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001320 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001321 }
1322 while (length--) {
1323 memcpy(ov, iv, 16);
1324 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1325 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001326 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 }
Paul Bakker556efba2014-01-24 15:38:12 +01001328
Gilles Peskine449bd832023-01-11 14:50:10 +01001329 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001330 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 }
Paul Bakker556efba2014-01-24 15:38:12 +01001332
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001334
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001336 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 }
Paul Bakker556efba2014-01-24 15:38:12 +01001338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001340 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001341 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001342
Gilles Peskine7820a572021-07-07 21:08:28 +02001343exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001344 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001345}
Simon Butcher76a5b222018-04-22 22:57:27 +01001346#endif /* MBEDTLS_CIPHER_MODE_CFB */
1347
1348#if defined(MBEDTLS_CIPHER_MODE_OFB)
1349/*
1350 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1351 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001352int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1353 size_t length,
1354 size_t *iv_off,
1355 unsigned char iv[16],
1356 const unsigned char *input,
1357 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001358{
Simon Butcherad4e4932018-04-29 00:43:47 +01001359 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001360 size_t n;
1361
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001362 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001363
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 if (n > 15) {
1365 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1366 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001367
Gilles Peskine449bd832023-01-11 14:50:10 +01001368 while (length--) {
1369 if (n == 0) {
1370 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1371 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001372 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001374 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001375 *output++ = *input++ ^ iv[n];
1376
Gilles Peskine449bd832023-01-11 14:50:10 +01001377 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001378 }
1379
1380 *iv_off = n;
1381
Simon Butcherad4e4932018-04-29 00:43:47 +01001382exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001384}
1385#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001388/*
1389 * AES-CTR buffer encryption/decryption
1390 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001391int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1392 size_t length,
1393 size_t *nc_off,
1394 unsigned char nonce_counter[16],
1395 unsigned char stream_block[16],
1396 const unsigned char *input,
1397 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001398{
Paul Bakker369e14b2012-04-18 14:16:09 +00001399 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001400 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001401 size_t n;
1402
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001403 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001404
Gilles Peskine449bd832023-01-11 14:50:10 +01001405 if (n > 0x0F) {
1406 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1407 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 while (length--) {
1410 if (n == 0) {
1411 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1412 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001413 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001415
Gilles Peskine449bd832023-01-11 14:50:10 +01001416 for (i = 16; i > 0; i--) {
1417 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001418 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 }
1420 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001421 }
1422 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001424
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001426 }
1427
1428 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001429 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001430
Gilles Peskine7820a572021-07-07 21:08:28 +02001431exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001432 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001433}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001434#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001435
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001436#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001439/*
1440 * AES test vectors from:
1441 *
1442 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1443 */
Yanray Wang62c99912023-05-11 11:06:53 +08001444static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001445{
1446 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1447 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001448#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001449 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1450 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1451 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1452 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001453#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001454};
1455
Yanray Wang62c99912023-05-11 11:06:53 +08001456static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001457{
1458 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1459 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001460#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001461 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1462 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1463 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1464 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001465#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001466};
1467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001469static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001470{
1471 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1472 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
Yanray Wang62c99912023-05-11 11:06:53 +08001473#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001474 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1475 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1476 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1477 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001478#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001479};
1480
Yanray Wang62c99912023-05-11 11:06:53 +08001481static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001482{
1483 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1484 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001485#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001486 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1487 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1488 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1489 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001490#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001491};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001493
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001495/*
1496 * AES-CFB128 test vectors from:
1497 *
1498 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1499 */
Yanray Wang62c99912023-05-11 11:06:53 +08001500static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001501{
1502 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1503 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001504#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001505 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1506 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1507 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1508 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1509 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1510 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1511 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001512#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001513};
1514
1515static const unsigned char aes_test_cfb128_iv[16] =
1516{
1517 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1518 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1519};
1520
1521static const unsigned char aes_test_cfb128_pt[64] =
1522{
1523 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1524 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1525 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1526 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1527 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1528 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1529 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1530 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1531};
1532
Yanray Wang62c99912023-05-11 11:06:53 +08001533static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001534{
1535 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1536 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1537 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1538 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1539 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1540 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1541 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1542 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001543#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001544 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1545 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1546 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1547 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1548 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1549 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1550 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1551 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1552 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1553 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1554 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1555 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1556 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1557 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1558 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1559 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001560#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001561};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001562#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001563
Simon Butcherad4e4932018-04-29 00:43:47 +01001564#if defined(MBEDTLS_CIPHER_MODE_OFB)
1565/*
1566 * AES-OFB test vectors from:
1567 *
Simon Butcher5db13622018-06-04 22:11:25 +01001568 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001569 */
Yanray Wang62c99912023-05-11 11:06:53 +08001570static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001571{
1572 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1573 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001574#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001575 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1576 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1577 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1578 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1579 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1580 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1581 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001582#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001583};
1584
1585static const unsigned char aes_test_ofb_iv[16] =
1586{
1587 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1588 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1589};
1590
1591static const unsigned char aes_test_ofb_pt[64] =
1592{
1593 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1594 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1595 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1596 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1597 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1598 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1599 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1600 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1601};
1602
Yanray Wang62c99912023-05-11 11:06:53 +08001603static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001604{
1605 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1606 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1607 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1608 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1609 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1610 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1611 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1612 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001613#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001614 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1615 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1616 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1617 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1618 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1619 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1620 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1621 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1622 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1623 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1624 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1625 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1626 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1627 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1628 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1629 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001630#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001631};
1632#endif /* MBEDTLS_CIPHER_MODE_OFB */
1633
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001635/*
1636 * AES-CTR test vectors from:
1637 *
1638 * http://www.faqs.org/rfcs/rfc3686.html
1639 */
1640
Yanray Wang62c99912023-05-11 11:06:53 +08001641static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001642{
1643 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1644 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1645 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1646 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1647 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1648 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1649};
1650
Yanray Wang62c99912023-05-11 11:06:53 +08001651static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001652{
1653 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1655 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1656 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1657 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1658 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1659};
1660
Yanray Wang62c99912023-05-11 11:06:53 +08001661static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001662{
1663 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1664 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001665 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1666 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1667 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1668 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1669
1670 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1671 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1672 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1673 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1674 0x20, 0x21, 0x22, 0x23 }
1675};
1676
Yanray Wang62c99912023-05-11 11:06:53 +08001677static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001678{
1679 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1680 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1681 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1682 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1683 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1684 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1685 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1686 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1687 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1688 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1689 0x25, 0xB2, 0x07, 0x2F }
1690};
1691
1692static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001693{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001694#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001695
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001696#if defined(MBEDTLS_CIPHER_MODE_XTS)
1697/*
1698 * AES-XTS test vectors from:
1699 *
1700 * IEEE P1619/D16 Annex B
1701 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1702 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1703 */
1704static const unsigned char aes_test_xts_key[][32] =
1705{
1706 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1710 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1711 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1712 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1713 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1714 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1715 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1716 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1717 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1718};
1719
1720static const unsigned char aes_test_xts_pt32[][32] =
1721{
1722 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1723 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1726 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1727 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1728 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1729 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1730 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1731 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1732 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1733 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1734};
1735
1736static const unsigned char aes_test_xts_ct32[][32] =
1737{
1738 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1739 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1740 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1741 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1742 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1743 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1744 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1745 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1746 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1747 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1748 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1749 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1750};
1751
1752static const unsigned char aes_test_xts_data_unit[][16] =
1753{
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1756 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1758 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001760};
1761
1762#endif /* MBEDTLS_CIPHER_MODE_XTS */
1763
Paul Bakker5121ce52009-01-03 21:22:43 +00001764/*
1765 * Checkup routine
1766 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001767int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001768{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001769 int ret = 0, i, j, u, mode;
1770 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001771 unsigned char key[32];
1772 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001773 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001774#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1775 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001776 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001777#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001778#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001779 unsigned char prv[16];
1780#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001781#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1782 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001783 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001784#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001785#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001786 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001787#endif
1788#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001789 unsigned char nonce_counter[16];
1790 unsigned char stream_block[16];
1791#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001792 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001793
Gilles Peskine449bd832023-01-11 14:50:10 +01001794 memset(key, 0, 32);
1795 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001796
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001797 if (verbose != 0) {
1798#if defined(MBEDTLS_AES_ALT)
1799 mbedtls_printf(" AES note: alternative implementation.\n");
1800#else /* MBEDTLS_AES_ALT */
1801#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
1802 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1803 mbedtls_printf(" AES note: using VIA Padlock.\n");
1804 } else
1805#endif
1806#if defined(MBEDTLS_AESNI_HAVE_CODE)
1807 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1808 mbedtls_printf(" AES note: using AESNI.\n");
1809 } else
1810#endif
1811#if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_HAVE_ARM64)
1812 if (mbedtls_aesce_has_support()) {
1813 mbedtls_printf(" AES note: using AESCE.\n");
1814 } else
1815#endif
1816 mbedtls_printf(" AES note: built-in implementation.\n");
1817#endif /* MBEDTLS_AES_ALT */
1818 }
1819
Paul Bakker5121ce52009-01-03 21:22:43 +00001820 /*
1821 * ECB mode
1822 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001823 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001824 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001825 keybits = 128 + u * 64;
1826 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001827
Gilles Peskine449bd832023-01-11 14:50:10 +01001828 if (verbose != 0) {
1829 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1830 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001831 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001832
Arto Kinnunen0f066182023-04-20 10:02:46 +08001833#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1834 if (keybits > 128) {
1835 mbedtls_printf("skipped\n");
1836 continue;
1837 }
1838#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1839
Gilles Peskine449bd832023-01-11 14:50:10 +01001840 memset(buf, 0, 16);
1841
1842 if (mode == MBEDTLS_AES_DECRYPT) {
1843 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1844 aes_tests = aes_test_ecb_dec[u];
1845 } else {
1846 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001847 aes_tests = aes_test_ecb_enc[u];
1848 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001849
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001850 /*
1851 * AES-192 is an optional feature that may be unavailable when
1852 * there is an alternative underlying implementation i.e. when
1853 * MBEDTLS_AES_ALT is defined.
1854 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1856 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001857 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001858 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001859 goto exit;
1860 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001861
Gilles Peskine449bd832023-01-11 14:50:10 +01001862 for (j = 0; j < 10000; j++) {
1863 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1864 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001865 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001866 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001867 }
1868
Gilles Peskine449bd832023-01-11 14:50:10 +01001869 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001870 ret = 1;
1871 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001872 }
1873
Gilles Peskine449bd832023-01-11 14:50:10 +01001874 if (verbose != 0) {
1875 mbedtls_printf("passed\n");
1876 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001877 }
1878
Gilles Peskine449bd832023-01-11 14:50:10 +01001879 if (verbose != 0) {
1880 mbedtls_printf("\n");
1881 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001882
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001883#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001884 /*
1885 * CBC mode
1886 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001888 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001889 keybits = 128 + u * 64;
1890 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001891
Gilles Peskine449bd832023-01-11 14:50:10 +01001892 if (verbose != 0) {
1893 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1894 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001895 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001896
Arto Kinnunen0f066182023-04-20 10:02:46 +08001897#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1898 if (keybits > 128) {
1899 mbedtls_printf("skipped\n");
1900 continue;
1901 }
1902#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1903
Gilles Peskine449bd832023-01-11 14:50:10 +01001904 memset(iv, 0, 16);
1905 memset(prv, 0, 16);
1906 memset(buf, 0, 16);
1907
1908 if (mode == MBEDTLS_AES_DECRYPT) {
1909 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1910 aes_tests = aes_test_cbc_dec[u];
1911 } else {
1912 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001913 aes_tests = aes_test_cbc_enc[u];
1914 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001915
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001916 /*
1917 * AES-192 is an optional feature that may be unavailable when
1918 * there is an alternative underlying implementation i.e. when
1919 * MBEDTLS_AES_ALT is defined.
1920 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001921 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1922 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001923 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001925 goto exit;
1926 }
1927
Gilles Peskine449bd832023-01-11 14:50:10 +01001928 for (j = 0; j < 10000; j++) {
1929 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001930 unsigned char tmp[16];
1931
Gilles Peskine449bd832023-01-11 14:50:10 +01001932 memcpy(tmp, prv, 16);
1933 memcpy(prv, buf, 16);
1934 memcpy(buf, tmp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001935 }
1936
Gilles Peskine449bd832023-01-11 14:50:10 +01001937 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1938 if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001939 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001940 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001941
1942 }
1943
Gilles Peskine449bd832023-01-11 14:50:10 +01001944 if (memcmp(buf, aes_tests, 16) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001945 ret = 1;
1946 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001947 }
1948
Gilles Peskine449bd832023-01-11 14:50:10 +01001949 if (verbose != 0) {
1950 mbedtls_printf("passed\n");
1951 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001952 }
1953
Gilles Peskine449bd832023-01-11 14:50:10 +01001954 if (verbose != 0) {
1955 mbedtls_printf("\n");
1956 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001957#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001958
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001959#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001960 /*
1961 * CFB128 mode
1962 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 for (i = 0; i < 6; i++) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001964 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001965 keybits = 128 + u * 64;
1966 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001967
Gilles Peskine449bd832023-01-11 14:50:10 +01001968 if (verbose != 0) {
1969 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
1970 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1971 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001972
Arto Kinnunen0f066182023-04-20 10:02:46 +08001973#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1974 if (keybits > 128) {
1975 mbedtls_printf("skipped\n");
1976 continue;
1977 }
1978#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1979
Gilles Peskine449bd832023-01-11 14:50:10 +01001980 memcpy(iv, aes_test_cfb128_iv, 16);
1981 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00001982
1983 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001984 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001985 /*
1986 * AES-192 is an optional feature that may be unavailable when
1987 * there is an alternative underlying implementation i.e. when
1988 * MBEDTLS_AES_ALT is defined.
1989 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001990 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1991 mbedtls_printf("skipped\n");
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001992 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 } else if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001994 goto exit;
1995 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001996
Gilles Peskine449bd832023-01-11 14:50:10 +01001997 if (mode == MBEDTLS_AES_DECRYPT) {
1998 memcpy(buf, aes_test_cfb128_ct[u], 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001999 aes_tests = aes_test_cfb128_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01002000 } else {
2001 memcpy(buf, aes_test_cfb128_pt, 64);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002002 aes_tests = aes_test_cfb128_ct[u];
2003 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002004
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2006 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002007 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002009
Gilles Peskine449bd832023-01-11 14:50:10 +01002010 if (memcmp(buf, aes_tests, 64) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002011 ret = 1;
2012 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002013 }
2014
Gilles Peskine449bd832023-01-11 14:50:10 +01002015 if (verbose != 0) {
2016 mbedtls_printf("passed\n");
2017 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002018 }
2019
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 if (verbose != 0) {
2021 mbedtls_printf("\n");
2022 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002023#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002024
Simon Butcherad4e4932018-04-29 00:43:47 +01002025#if defined(MBEDTLS_CIPHER_MODE_OFB)
2026 /*
2027 * OFB mode
2028 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002029 for (i = 0; i < 6; i++) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002030 u = i >> 1;
2031 keybits = 128 + u * 64;
2032 mode = i & 1;
2033
Gilles Peskine449bd832023-01-11 14:50:10 +01002034 if (verbose != 0) {
2035 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2036 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2037 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002038
Arto Kinnunen0f066182023-04-20 10:02:46 +08002039#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2040 if (keybits > 128) {
2041 mbedtls_printf("skipped\n");
2042 continue;
2043 }
2044#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2045
Gilles Peskine449bd832023-01-11 14:50:10 +01002046 memcpy(iv, aes_test_ofb_iv, 16);
2047 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002048
2049 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002050 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
Simon Butcherad4e4932018-04-29 00:43:47 +01002051 /*
2052 * AES-192 is an optional feature that may be unavailable when
2053 * there is an alternative underlying implementation i.e. when
2054 * MBEDTLS_AES_ALT is defined.
2055 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002056 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2057 mbedtls_printf("skipped\n");
Simon Butcherad4e4932018-04-29 00:43:47 +01002058 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 } else if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002060 goto exit;
2061 }
2062
Gilles Peskine449bd832023-01-11 14:50:10 +01002063 if (mode == MBEDTLS_AES_DECRYPT) {
2064 memcpy(buf, aes_test_ofb_ct[u], 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002065 aes_tests = aes_test_ofb_pt;
Gilles Peskine449bd832023-01-11 14:50:10 +01002066 } else {
2067 memcpy(buf, aes_test_ofb_pt, 64);
Simon Butcherad4e4932018-04-29 00:43:47 +01002068 aes_tests = aes_test_ofb_ct[u];
2069 }
2070
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2072 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002073 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002075
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 if (memcmp(buf, aes_tests, 64) != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01002077 ret = 1;
2078 goto exit;
2079 }
2080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 if (verbose != 0) {
2082 mbedtls_printf("passed\n");
2083 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002084 }
2085
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 if (verbose != 0) {
2087 mbedtls_printf("\n");
2088 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002089#endif /* MBEDTLS_CIPHER_MODE_OFB */
2090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002091#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002092 /*
2093 * CTR mode
2094 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002095 for (i = 0; i < 6; i++) {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002096 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002097 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002098
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 if (verbose != 0) {
2100 mbedtls_printf(" AES-CTR-128 (%s): ",
2101 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2102 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002103
Gilles Peskine449bd832023-01-11 14:50:10 +01002104 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2105 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002106
2107 offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002109 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002110 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002111
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002112 len = aes_test_ctr_len[u];
2113
Gilles Peskine449bd832023-01-11 14:50:10 +01002114 if (mode == MBEDTLS_AES_DECRYPT) {
2115 memcpy(buf, aes_test_ctr_ct[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002116 aes_tests = aes_test_ctr_pt[u];
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 } else {
2118 memcpy(buf, aes_test_ctr_pt[u], len);
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002119 aes_tests = aes_test_ctr_ct[u];
2120 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002121
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2123 stream_block, buf, buf);
2124 if (ret != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002125 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002126 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002127
Gilles Peskine449bd832023-01-11 14:50:10 +01002128 if (memcmp(buf, aes_tests, len) != 0) {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002129 ret = 1;
2130 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002131 }
2132
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 if (verbose != 0) {
2134 mbedtls_printf("passed\n");
2135 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002136 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002137
Gilles Peskine449bd832023-01-11 14:50:10 +01002138 if (verbose != 0) {
2139 mbedtls_printf("\n");
2140 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002141#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002142
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002143#if defined(MBEDTLS_CIPHER_MODE_XTS)
2144 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002145 static const int num_tests =
2146 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2147 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002148
Gilles Peskine449bd832023-01-11 14:50:10 +01002149 /*
2150 * XTS mode
2151 */
2152 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002153
Gilles Peskine449bd832023-01-11 14:50:10 +01002154 for (i = 0; i < num_tests << 1; i++) {
2155 const unsigned char *data_unit;
2156 u = i >> 1;
2157 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002158
Gilles Peskine449bd832023-01-11 14:50:10 +01002159 if (verbose != 0) {
2160 mbedtls_printf(" AES-XTS-128 (%s): ",
2161 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2162 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002163
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 memset(key, 0, sizeof(key));
2165 memcpy(key, aes_test_xts_key[u], 32);
2166 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002167
Gilles Peskine449bd832023-01-11 14:50:10 +01002168 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002169
Gilles Peskine449bd832023-01-11 14:50:10 +01002170 if (mode == MBEDTLS_AES_DECRYPT) {
2171 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2172 if (ret != 0) {
2173 goto exit;
2174 }
2175 memcpy(buf, aes_test_xts_ct32[u], len);
2176 aes_tests = aes_test_xts_pt32[u];
2177 } else {
2178 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2179 if (ret != 0) {
2180 goto exit;
2181 }
2182 memcpy(buf, aes_test_xts_pt32[u], len);
2183 aes_tests = aes_test_xts_ct32[u];
2184 }
2185
2186
2187 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2188 buf, buf);
2189 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002190 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 }
2192
2193 if (memcmp(buf, aes_tests, len) != 0) {
2194 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002195 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002196 }
2197
2198 if (verbose != 0) {
2199 mbedtls_printf("passed\n");
2200 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002201 }
2202
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 if (verbose != 0) {
2204 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002205 }
2206
Gilles Peskine449bd832023-01-11 14:50:10 +01002207 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002208 }
2209#endif /* MBEDTLS_CIPHER_MODE_XTS */
2210
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002211 ret = 0;
2212
2213exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 if (ret != 0 && verbose != 0) {
2215 mbedtls_printf("failed\n");
2216 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002217
Gilles Peskine449bd832023-01-11 14:50:10 +01002218 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002219
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002221}
2222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002223#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002225#endif /* MBEDTLS_AES_C */