blob: 05f4c3c23fa01e23b86c3a1bc9ff541055298b30 [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
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
7/*
8 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
9 *
Tom Cosgrovece37c5e2023-08-04 13:53:36 +010010 * https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
12 */
13
Gilles Peskinedb09ef62020-06-03 01:43:33 +020014#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000015
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020016#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000017
Rich Evans00ab4702015-02-06 13:43:58 +000018#include <string.h>
19
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000020#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030021#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050022#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000023#include "mbedtls/error.h"
Jerry Yu02b15192023-04-23 14:43:19 +080024
Dave Rodgman782df0352023-09-29 12:57:52 +010025#if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
26#if !((defined(MBEDTLS_ARCH_IS_ARM64) && defined(MBEDTLS_AESCE_C)) || \
Dave Rodgmana06d45e2023-09-29 18:59:34 +010027 (defined(MBEDTLS_ARCH_IS_X64) && defined(MBEDTLS_AESNI_C)) || \
28 (defined(MBEDTLS_ARCH_IS_X86) && defined(MBEDTLS_AESNI_C)))
Jerry Yu69436812023-04-25 11:08:30 +080029#error "MBEDTLS_AES_USE_HARDWARE_ONLY defined, but not all prerequisites"
Jerry Yu02b15192023-04-23 14:43:19 +080030#endif
31#endif
32
Jerry Yud6e312d2023-08-18 17:19:51 +080033#if defined(MBEDTLS_ARCH_IS_X86)
Jerry Yu61fc5ed2023-08-18 17:28:48 +080034#if defined(MBEDTLS_PADLOCK_C)
35#if !defined(MBEDTLS_HAVE_ASM)
Jerry Yu13696bb2023-08-10 13:36:32 +080036#error "MBEDTLS_PADLOCK_C defined, but not all prerequisites"
37#endif
Jerry Yu61fc5ed2023-08-18 17:28:48 +080038#if defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
39#error "MBEDTLS_AES_USE_HARDWARE_ONLY cannot be defined when " \
40 "MBEDTLS_PADLOCK_C is set"
41#endif
42#endif
Jerry Yu02b15192023-04-23 14:43:19 +080043#endif
44
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045#if defined(MBEDTLS_PADLOCK_C)
Chris Jones16dbaeb2021-03-09 17:47:55 +000046#include "padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000047#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000049#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010050#endif
Jerry Yu3f2fb712023-01-10 17:05:42 +080051#if defined(MBEDTLS_AESCE_C)
52#include "aesce.h"
53#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000055#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Jerry Yu9e628622023-08-17 11:20:09 +080059#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
Paul Bakker048d04e2012-02-12 17:31:04 +000060static int aes_padlock_ace = -1;
61#endif
62
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020063#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000064/*
65 * Forward S-box
66 */
Dave Rodgman18ddf612023-10-04 14:03:12 +010067MBEDTLS_MAYBE_UNUSED static const unsigned char FSb[256] =
Paul Bakker5121ce52009-01-03 21:22:43 +000068{
69 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
70 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
71 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
72 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
73 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
74 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
75 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
76 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
77 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
78 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
79 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
80 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
81 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
82 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
83 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
84 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
85 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
86 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
87 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
88 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
89 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
90 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
91 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
92 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
93 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
94 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
95 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
96 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
97 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
98 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
99 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
100 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
101};
102
103/*
104 * Forward tables
105 */
106#define FT \
107\
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \
109 V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \
110 V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \
111 V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \
112 V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \
113 V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \
114 V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \
115 V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \
116 V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \
117 V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \
118 V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \
119 V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \
120 V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \
121 V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \
122 V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \
123 V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \
124 V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \
125 V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \
126 V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \
127 V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \
128 V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \
129 V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \
130 V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \
131 V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \
132 V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \
133 V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \
134 V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \
135 V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \
136 V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \
137 V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \
138 V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \
139 V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \
140 V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \
141 V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \
142 V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \
143 V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \
144 V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \
145 V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \
146 V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \
147 V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \
148 V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \
149 V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \
150 V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \
151 V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \
152 V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \
153 V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \
154 V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \
155 V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \
156 V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \
157 V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \
158 V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \
159 V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \
160 V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \
161 V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \
162 V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \
163 V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \
164 V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \
165 V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \
166 V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \
167 V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \
168 V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \
169 V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \
170 V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \
171 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 +0000172
Gilles Peskine449bd832023-01-11 14:50:10 +0100173#define V(a, b, c, d) 0x##a##b##c##d
Dave Rodgman18ddf612023-10-04 14:03:12 +0100174MBEDTLS_MAYBE_UNUSED static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000175#undef V
176
Gilles Peskine449bd832023-01-11 14:50:10 +0100177#define V(a, b, c, d) 0x##b##c##d##a
Dave Rodgman18ddf612023-10-04 14:03:12 +0100178MBEDTLS_MAYBE_UNUSED static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000179#undef V
180
Gilles Peskine449bd832023-01-11 14:50:10 +0100181#define V(a, b, c, d) 0x##c##d##a##b
Dave Rodgman18ddf612023-10-04 14:03:12 +0100182MBEDTLS_MAYBE_UNUSED static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000183#undef V
184
Gilles Peskine449bd832023-01-11 14:50:10 +0100185#define V(a, b, c, d) 0x##d##a##b##c
Dave Rodgman18ddf612023-10-04 14:03:12 +0100186MBEDTLS_MAYBE_UNUSED static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000187#undef V
188
189#undef FT
190
191/*
192 * Reverse S-box
193 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100194MBEDTLS_MAYBE_UNUSED static const unsigned char RSb[256] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000195{
196 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
197 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
198 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
199 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
200 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
201 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
202 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
203 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
204 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
205 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
206 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
207 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
208 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
209 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
210 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
211 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
212 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
213 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
214 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
215 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
216 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
217 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
218 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
219 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
220 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
221 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
222 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
223 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
224 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
225 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
226 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
227 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
228};
229
230/*
231 * Reverse tables
232 */
233#define RT \
234\
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \
236 V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \
237 V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \
238 V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \
239 V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \
240 V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \
241 V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \
242 V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \
243 V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \
244 V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \
245 V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \
246 V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \
247 V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \
248 V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \
249 V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \
250 V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \
251 V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \
252 V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \
253 V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \
254 V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \
255 V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \
256 V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \
257 V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \
258 V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \
259 V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \
260 V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \
261 V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \
262 V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \
263 V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \
264 V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \
265 V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \
266 V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \
267 V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \
268 V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \
269 V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \
270 V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \
271 V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \
272 V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \
273 V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \
274 V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \
275 V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \
276 V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \
277 V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \
278 V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \
279 V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \
280 V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \
281 V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \
282 V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \
283 V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \
284 V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \
285 V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \
286 V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \
287 V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \
288 V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \
289 V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \
290 V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \
291 V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \
292 V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \
293 V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \
294 V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \
295 V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \
296 V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \
297 V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \
298 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 +0000299
Dave Rodgmanad4e76b2023-06-27 19:20:27 +0100300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301#define V(a, b, c, d) 0x##a##b##c##d
Dave Rodgman18ddf612023-10-04 14:03:12 +0100302MBEDTLS_MAYBE_UNUSED static const uint32_t RT0[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##b##c##d##a
Dave Rodgman18ddf612023-10-04 14:03:12 +0100306MBEDTLS_MAYBE_UNUSED static const uint32_t RT1[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##c##d##a##b
Dave Rodgman18ddf612023-10-04 14:03:12 +0100310MBEDTLS_MAYBE_UNUSED static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000311#undef V
312
Gilles Peskine449bd832023-01-11 14:50:10 +0100313#define V(a, b, c, d) 0x##d##a##b##c
Dave Rodgman18ddf612023-10-04 14:03:12 +0100314MBEDTLS_MAYBE_UNUSED static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000315#undef V
316
317#undef RT
318
319/*
320 * Round constants
321 */
Dave Rodgman4b779be2023-10-12 16:17:10 +0100322MBEDTLS_MAYBE_UNUSED static const uint32_t round_constants[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000323{
324 0x00000001, 0x00000002, 0x00000004, 0x00000008,
325 0x00000010, 0x00000020, 0x00000040, 0x00000080,
326 0x0000001B, 0x00000036
327};
328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000330
331/*
332 * Forward S-box & tables
333 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100334MBEDTLS_MAYBE_UNUSED static unsigned char FSb[256];
335MBEDTLS_MAYBE_UNUSED static uint32_t FT0[256];
336MBEDTLS_MAYBE_UNUSED static uint32_t FT1[256];
337MBEDTLS_MAYBE_UNUSED static uint32_t FT2[256];
338MBEDTLS_MAYBE_UNUSED static uint32_t FT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340/*
341 * Reverse S-box & tables
342 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100343MBEDTLS_MAYBE_UNUSED static unsigned char RSb[256];
Dave Rodgmanad4e76b2023-06-27 19:20:27 +0100344
Dave Rodgman18ddf612023-10-04 14:03:12 +0100345MBEDTLS_MAYBE_UNUSED static uint32_t RT0[256];
346MBEDTLS_MAYBE_UNUSED static uint32_t RT1[256];
347MBEDTLS_MAYBE_UNUSED static uint32_t RT2[256];
348MBEDTLS_MAYBE_UNUSED static uint32_t RT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000349
350/*
351 * Round constants
352 */
Dave Rodgman4b779be2023-10-12 16:17:10 +0100353MBEDTLS_MAYBE_UNUSED static uint32_t round_constants[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
355/*
356 * Tables generation code
357 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100358#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24)
359#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00))
360#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
Dave Rodgman18ddf612023-10-04 14:03:12 +0100362MBEDTLS_MAYBE_UNUSED static int aes_init_done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
Dave Rodgman18ddf612023-10-04 14:03:12 +0100364MBEDTLS_MAYBE_UNUSED static void aes_gen_tables(void)
Paul Bakker5121ce52009-01-03 21:22:43 +0000365{
Yanray Wangfe944ce2023-06-26 18:16:01 +0800366 int i;
367 uint8_t x, y, z;
Yanray Wang5c86b172023-06-26 16:54:52 +0800368 uint8_t pow[256];
369 uint8_t log[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000370
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;
Yanray Wang5c86b172023-06-26 16:54:52 +0800376 log[x] = (uint8_t) i;
Yanray Wangfe944ce2023-06-26 18:16:01 +0800377 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++) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200384 round_constants[i] = x;
Yanray Wangfe944ce2023-06-26 18:16:01 +0800385 x = 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
Yanray Wangfe944ce2023-06-26 18:16:01 +0800397 y = x; y = (y << 1) | (y >> 7);
398 x ^= y; y = (y << 1) | (y >> 7);
399 x ^= y; y = (y << 1) | (y >> 7);
400 x ^= y; y = (y << 1) | (y >> 7);
Paul Bakker5121ce52009-01-03 21:22:43 +0000401 x ^= y ^ 0x63;
402
Yanray Wangfe944ce2023-06-26 18:16:01 +0800403 FSb[i] = x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000404 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];
Yanray Wangfe944ce2023-06-26 18:16:01 +0800412 y = XTIME(x);
413 z = 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
Dave Rodgman450c1ff2023-09-29 15:52:33 +0100428#if !defined(MBEDTLS_AES_DECRYPT_ALT) || \
429 (!defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY))
Gilles Peskine449bd832023-01-11 14:50:10 +0100430 RT0[i] = ((uint32_t) MUL(0x0E, x)) ^
431 ((uint32_t) MUL(0x09, x) << 8) ^
432 ((uint32_t) MUL(0x0D, x) << 16) ^
433 ((uint32_t) MUL(0x0B, x) << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000434
Hanno Beckerad049a92017-06-19 16:31:54 +0100435#if !defined(MBEDTLS_AES_FEWER_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 RT1[i] = ROTL8(RT0[i]);
437 RT2[i] = ROTL8(RT1[i]);
438 RT3[i] = ROTL8(RT2[i]);
Hanno Becker177d3cf2017-06-07 15:52:48 +0100439#endif /* !MBEDTLS_AES_FEWER_TABLES */
Dave Rodgman450c1ff2023-09-29 15:52:33 +0100440#endif \
441 /* !defined(MBEDTLS_AES_DECRYPT_ALT) || (!defined(MBEDTLS_AES_SETKEY_DEC_ALT) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000442 }
443}
444
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200445#undef ROTL8
446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000448
Hanno Beckerad049a92017-06-19 16:31:54 +0100449#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200450
Gilles Peskine449bd832023-01-11 14:50:10 +0100451#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24))
452#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16))
453#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8))
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200454
455#define AES_RT0(idx) RT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100456#define AES_RT1(idx) ROTL8(RT0[idx])
457#define AES_RT2(idx) ROTL16(RT0[idx])
458#define AES_RT3(idx) ROTL24(RT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200459
460#define AES_FT0(idx) FT0[idx]
Gilles Peskine449bd832023-01-11 14:50:10 +0100461#define AES_FT1(idx) ROTL8(FT0[idx])
462#define AES_FT2(idx) ROTL16(FT0[idx])
463#define AES_FT3(idx) ROTL24(FT0[idx])
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200464
Hanno Becker177d3cf2017-06-07 15:52:48 +0100465#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200466
467#define AES_RT0(idx) RT0[idx]
468#define AES_RT1(idx) RT1[idx]
469#define AES_RT2(idx) RT2[idx]
470#define AES_RT3(idx) RT3[idx]
471
472#define AES_FT0(idx) FT0[idx]
473#define AES_FT1(idx) FT1[idx]
474#define AES_FT2(idx) FT2[idx]
475#define AES_FT3(idx) FT3[idx]
476
Hanno Becker177d3cf2017-06-07 15:52:48 +0100477#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200478
Gilles Peskine449bd832023-01-11 14:50:10 +0100479void mbedtls_aes_init(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200480{
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 memset(ctx, 0, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200482}
483
Gilles Peskine449bd832023-01-11 14:50:10 +0100484void mbedtls_aes_free(mbedtls_aes_context *ctx)
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485{
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 if (ctx == NULL) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 }
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200489
Gilles Peskine449bd832023-01-11 14:50:10 +0100490 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context));
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200491}
492
Jaeden Amero9366feb2018-05-29 18:55:17 +0100493#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100494void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100495{
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 mbedtls_aes_init(&ctx->crypt);
497 mbedtls_aes_init(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100498}
499
Gilles Peskine449bd832023-01-11 14:50:10 +0100500void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100501{
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 if (ctx == NULL) {
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100503 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 }
Simon Butcher5201e412018-12-06 17:40:14 +0000505
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 mbedtls_aes_free(&ctx->crypt);
507 mbedtls_aes_free(&ctx->tweak);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100508}
509#endif /* MBEDTLS_CIPHER_MODE_XTS */
510
Gilles Peskine0de8f852023-03-16 17:14:59 +0100511/* Some implementations need the round keys to be aligned.
512 * Return an offset to be added to buf, such that (buf + offset) is
513 * correctly aligned.
514 * Note that the offset is in units of elements of buf, i.e. 32-bit words,
515 * i.e. an offset of 1 means 4 bytes and so on.
516 */
Jerry Yu96084472023-08-17 18:10:45 +0800517#if (defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)) || \
Gilles Peskine9c682e72023-03-16 17:21:33 +0100518 (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100519#define MAY_NEED_TO_ALIGN
520#endif
Dave Rodgman28a539a2023-06-27 18:22:34 +0100521
Dave Rodgman18ddf612023-10-04 14:03:12 +0100522MBEDTLS_MAYBE_UNUSED static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100523{
524#if defined(MAY_NEED_TO_ALIGN)
525 int align_16_bytes = 0;
526
Jerry Yu9e628622023-08-17 11:20:09 +0800527#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
Gilles Peskine0de8f852023-03-16 17:14:59 +0100528 if (aes_padlock_ace == -1) {
529 aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE);
530 }
531 if (aes_padlock_ace) {
532 align_16_bytes = 1;
533 }
534#endif
535
Gilles Peskine9c682e72023-03-16 17:21:33 +0100536#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
Gilles Peskine0de8f852023-03-16 17:14:59 +0100537 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
538 align_16_bytes = 1;
539 }
540#endif
541
542 if (align_16_bytes) {
543 /* These implementations needs 16-byte alignment
544 * for the round key array. */
545 unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4;
546 if (delta == 0) {
547 return 0;
548 } else {
549 return 4 - delta; // 16 bytes = 4 uint32_t
550 }
551 }
552#else /* MAY_NEED_TO_ALIGN */
553 (void) buf;
554#endif /* MAY_NEED_TO_ALIGN */
555
556 return 0;
557}
558
Paul Bakker5121ce52009-01-03 21:22:43 +0000559/*
560 * AES key schedule (encryption)
561 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200562#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100563int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
564 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000565{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000566 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000567
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 switch (keybits) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000569 case 128: ctx->nr = 10; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800570#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 case 192: ctx->nr = 12; break;
572 case 256: ctx->nr = 14; break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800573#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 }
576
Simon Butcher5201e412018-12-06 17:40:14 +0000577#if !defined(MBEDTLS_AES_ROM_TABLES)
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 if (aes_init_done == 0) {
Simon Butcher5201e412018-12-06 17:40:14 +0000579 aes_gen_tables();
580 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000581 }
582#endif
583
Gilles Peskine0de8f852023-03-16 17:14:59 +0100584 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100585 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000586
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100587#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
589 return mbedtls_aesni_setkey_enc((unsigned char *) RK, key, keybits);
590 }
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100591#endif
592
Jerry Yu72fd0bd2023-08-18 16:31:01 +0800593#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +0100594 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yu3f2fb712023-01-10 17:05:42 +0800595 return mbedtls_aesce_setkey_enc((unsigned char *) RK, key, keybits);
596 }
597#endif
598
Jerry Yu29c91ba2023-08-04 11:02:04 +0800599#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Jerry Yu3a0f0442023-08-17 17:06:21 +0800600 for (unsigned int i = 0; i < (keybits >> 5); i++) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2);
Paul Bakker5121ce52009-01-03 21:22:43 +0000602 }
603
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 switch (ctx->nr) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000605 case 10:
606
Jerry Yu3a0f0442023-08-17 17:06:21 +0800607 for (unsigned int i = 0; i < 10; i++, RK += 4) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200608 RK[4] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^
610 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^
611 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^
612 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000613
614 RK[5] = RK[1] ^ RK[4];
615 RK[6] = RK[2] ^ RK[5];
616 RK[7] = RK[3] ^ RK[6];
617 }
618 break;
619
Arto Kinnunen732ca322023-04-14 14:26:10 +0800620#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000621 case 12:
622
Jerry Yu3a0f0442023-08-17 17:06:21 +0800623 for (unsigned int i = 0; i < 8; i++, RK += 6) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200624 RK[6] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^
626 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^
627 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^
628 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000629
630 RK[7] = RK[1] ^ RK[6];
631 RK[8] = RK[2] ^ RK[7];
632 RK[9] = RK[3] ^ RK[8];
633 RK[10] = RK[4] ^ RK[9];
634 RK[11] = RK[5] ^ RK[10];
635 }
636 break;
637
638 case 14:
639
Jerry Yu3a0f0442023-08-17 17:06:21 +0800640 for (unsigned int i = 0; i < 7; i++, RK += 8) {
Jerzy Kasenbergee62fce2023-10-11 16:36:24 +0200641 RK[8] = RK[0] ^ round_constants[i] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100642 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^
643 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^
644 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^
645 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000646
647 RK[9] = RK[1] ^ RK[8];
648 RK[10] = RK[2] ^ RK[9];
649 RK[11] = RK[3] ^ RK[10];
650
651 RK[12] = RK[4] ^
Gilles Peskine449bd832023-01-11 14:50:10 +0100652 ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^
653 ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^
654 ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^
655 ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000656
657 RK[13] = RK[5] ^ RK[12];
658 RK[14] = RK[6] ^ RK[13];
659 RK[15] = RK[7] ^ RK[14];
660 }
661 break;
Arto Kinnunen732ca322023-04-14 14:26:10 +0800662#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000663 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000664
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 return 0;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800666#endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
Paul Bakker5121ce52009-01-03 21:22:43 +0000667}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200668#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000669
670/*
671 * AES key schedule (decryption)
672 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200673#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100674int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
675 unsigned int keybits)
Paul Bakker5121ce52009-01-03 21:22:43 +0000676{
Jerry Yu29c91ba2023-08-04 11:02:04 +0800677#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Jerry Yu29c91ba2023-08-04 11:02:04 +0800678 uint32_t *SK;
679#endif
680 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200681 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000682 uint32_t *RK;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800683
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200684
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 mbedtls_aes_init(&cty);
Paul Bakker5121ce52009-01-03 21:22:43 +0000686
Gilles Peskine0de8f852023-03-16 17:14:59 +0100687 ctx->rk_offset = mbedtls_aes_rk_offset(ctx->buf);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100688 RK = ctx->buf + ctx->rk_offset;
Paul Bakker5121ce52009-01-03 21:22:43 +0000689
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200690 /* Also checks keybits */
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200692 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100693 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000694
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200695 ctx->nr = cty.nr;
696
Gilles Peskine9af58cd2023-03-10 22:29:32 +0100697#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
699 mbedtls_aesni_inverse_key((unsigned char *) RK,
700 (const unsigned char *) (cty.buf + cty.rk_offset), ctx->nr);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200701 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100702 }
703#endif
704
Jerry Yu72fd0bd2023-08-18 16:31:01 +0800705#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +0100706 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yue096da12023-01-10 17:07:01 +0800707 mbedtls_aesce_inverse_key(
708 (unsigned char *) RK,
709 (const unsigned char *) (cty.buf + cty.rk_offset),
710 ctx->nr);
711 goto exit;
712 }
713#endif
714
Jerry Yu29c91ba2023-08-04 11:02:04 +0800715#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100716 SK = cty.buf + cty.rk_offset + cty.nr * 4;
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
718 *RK++ = *SK++;
719 *RK++ = *SK++;
720 *RK++ = *SK++;
721 *RK++ = *SK++;
Jerry Yu3a0f0442023-08-17 17:06:21 +0800722 SK -= 8;
723 for (int i = ctx->nr - 1; i > 0; i--, SK -= 8) {
724 for (int j = 0; j < 4; j++, SK++) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^
726 AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^
727 AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^
728 AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]);
Paul Bakker5121ce52009-01-03 21:22:43 +0000729 }
730 }
731
732 *RK++ = *SK++;
733 *RK++ = *SK++;
734 *RK++ = *SK++;
735 *RK++ = *SK++;
Jerry Yu29c91ba2023-08-04 11:02:04 +0800736#endif /* !MBEDTLS_AES_USE_HARDWARE_ONLY */
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200737exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 mbedtls_aes_free(&cty);
Paul Bakker2b222c82009-07-27 21:03:45 +0000739
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000741}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100742#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100743
744#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100745static int mbedtls_aes_xts_decode_keys(const unsigned char *key,
746 unsigned int keybits,
747 const unsigned char **key1,
748 unsigned int *key1bits,
749 const unsigned char **key2,
750 unsigned int *key2bits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100751{
752 const unsigned int half_keybits = keybits / 2;
753 const unsigned int half_keybytes = half_keybits / 8;
754
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 switch (keybits) {
Jaeden Amero9366feb2018-05-29 18:55:17 +0100756 case 256: break;
757 case 512: break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100759 }
760
761 *key1bits = half_keybits;
762 *key2bits = half_keybits;
763 *key1 = &key[0];
764 *key2 = &key[half_keybytes];
765
766 return 0;
767}
768
Gilles Peskine449bd832023-01-11 14:50:10 +0100769int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
770 const unsigned char *key,
771 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772{
Janos Follath24eed8d2019-11-22 13:21:35 +0000773 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100774 const unsigned char *key1, *key2;
775 unsigned int key1bits, key2bits;
776
Gilles Peskine449bd832023-01-11 14:50:10 +0100777 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
778 &key2, &key2bits);
779 if (ret != 0) {
780 return ret;
781 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100782
783 /* Set the tweak key. Always set tweak key for the encryption mode. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100784 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
785 if (ret != 0) {
786 return ret;
787 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100788
789 /* Set crypt key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100791}
792
Gilles Peskine449bd832023-01-11 14:50:10 +0100793int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
794 const unsigned char *key,
795 unsigned int keybits)
Jaeden Amero9366feb2018-05-29 18:55:17 +0100796{
Janos Follath24eed8d2019-11-22 13:21:35 +0000797 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100798 const unsigned char *key1, *key2;
799 unsigned int key1bits, key2bits;
800
Gilles Peskine449bd832023-01-11 14:50:10 +0100801 ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits,
802 &key2, &key2bits);
803 if (ret != 0) {
804 return ret;
805 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100806
807 /* Set the tweak key. Always set tweak key for encryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits);
809 if (ret != 0) {
810 return ret;
811 }
Jaeden Amero9366feb2018-05-29 18:55:17 +0100812
813 /* Set crypt key for decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits);
Jaeden Amero9366feb2018-05-29 18:55:17 +0100815}
816#endif /* MBEDTLS_CIPHER_MODE_XTS */
817
Gilles Peskine449bd832023-01-11 14:50:10 +0100818#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Joe Subbianicd84d762021-07-08 14:59:52 +0100819 do \
820 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \
822 AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \
823 AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \
824 AES_FT3(MBEDTLS_BYTE_3(Y3)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100825 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \
827 AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \
828 AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \
829 AES_FT3(MBEDTLS_BYTE_3(Y0)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100830 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \
832 AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \
833 AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \
834 AES_FT3(MBEDTLS_BYTE_3(Y1)); \
Joe Subbianicd84d762021-07-08 14:59:52 +0100835 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \
837 AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \
838 AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \
839 AES_FT3(MBEDTLS_BYTE_3(Y2)); \
840 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
Gilles Peskine449bd832023-01-11 14:50:10 +0100842#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100843 do \
844 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100845 (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \
846 AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \
847 AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \
848 AES_RT3(MBEDTLS_BYTE_3(Y1)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100849 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \
851 AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \
852 AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \
853 AES_RT3(MBEDTLS_BYTE_3(Y2)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100854 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100855 (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \
856 AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \
857 AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \
858 AES_RT3(MBEDTLS_BYTE_3(Y3)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100859 \
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \
861 AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \
862 AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \
863 AES_RT3(MBEDTLS_BYTE_3(Y0)); \
864 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000865
866/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200867 * AES-ECB block encryption
868 */
869#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100870int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
871 const unsigned char input[16],
872 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200873{
874 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100875 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200877 uint32_t X[4];
878 uint32_t Y[4];
879 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
882 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
883 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
884 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200885
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
887 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
888 AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200889 }
890
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200892
Gilles Peskine5197c662020-08-26 17:03:24 +0200893 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
895 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
896 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
897 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200898
Gilles Peskine5197c662020-08-26 17:03:24 +0200899 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100900 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
901 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
902 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
903 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200904
Gilles Peskine5197c662020-08-26 17:03:24 +0200905 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100906 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
907 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
908 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
909 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200910
Gilles Peskine5197c662020-08-26 17:03:24 +0200911 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100912 ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
913 ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
914 ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
915 ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200916
Gilles Peskine449bd832023-01-11 14:50:10 +0100917 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
918 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
919 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
920 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925}
926#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
927
928/*
929 * AES-ECB block decryption
930 */
931#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100932int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
933 const unsigned char input[16],
934 unsigned char output[16])
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200935{
936 int i;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100937 uint32_t *RK = ctx->buf + ctx->rk_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 struct {
Gilles Peskine5197c662020-08-26 17:03:24 +0200939 uint32_t X[4];
940 uint32_t Y[4];
941 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200942
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++;
944 t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++;
945 t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++;
946 t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 for (i = (ctx->nr >> 1) - 1; i > 0; i--) {
949 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
950 AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200951 }
952
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200954
Gilles Peskine5197c662020-08-26 17:03:24 +0200955 t.X[0] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^
957 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^
958 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^
959 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200960
Gilles Peskine5197c662020-08-26 17:03:24 +0200961 t.X[1] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^
963 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^
964 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^
965 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200966
Gilles Peskine5197c662020-08-26 17:03:24 +0200967 t.X[2] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^
969 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^
970 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^
971 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200972
Gilles Peskine5197c662020-08-26 17:03:24 +0200973 t.X[3] = *RK++ ^ \
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^
975 ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^
976 ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^
977 ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24);
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0);
980 MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4);
981 MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8);
982 MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12);
Andres AGf5bf7182017-03-03 14:09:56 +0000983
Gilles Peskine449bd832023-01-11 14:50:10 +0100984 mbedtls_platform_zeroize(&t, sizeof(t));
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500985
Gilles Peskine449bd832023-01-11 14:50:10 +0100986 return 0;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200987}
988#endif /* !MBEDTLS_AES_DECRYPT_ALT */
989
Gilles Peskine148cad12023-03-16 13:08:42 +0100990/* VIA Padlock and our intrinsics-based implementation of AESNI require
991 * the round keys to be aligned on a 16-byte boundary. We take care of this
992 * before creating them, but the AES context may have moved (this can happen
993 * if the library is called from a language with managed memory), and in later
994 * calls it might have a different alignment with respect to 16-byte memory.
995 * So we may need to realign.
996 */
Dave Rodgman18ddf612023-10-04 14:03:12 +0100997MBEDTLS_MAYBE_UNUSED static void aes_maybe_realign(mbedtls_aes_context *ctx)
Gilles Peskine148cad12023-03-16 13:08:42 +0100998{
Gilles Peskine0de8f852023-03-16 17:14:59 +0100999 unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf);
1000 if (new_offset != ctx->rk_offset) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001001 memmove(ctx->buf + new_offset, // new address
1002 ctx->buf + ctx->rk_offset, // current address
1003 (ctx->nr + 1) * 16); // number of round keys * bytes per rk
1004 ctx->rk_offset = new_offset;
1005 }
1006}
Gilles Peskine148cad12023-03-16 13:08:42 +01001007
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001008/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001009 * AES-ECB block encryption/decryption
1010 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001011int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
1012 int mode,
1013 const unsigned char input[16],
1014 unsigned char output[16])
Paul Bakker5121ce52009-01-03 21:22:43 +00001015{
Gilles Peskine449bd832023-01-11 14:50:10 +01001016 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001017 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001018 }
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001019
Gilles Peskine0de8f852023-03-16 17:14:59 +01001020#if defined(MAY_NEED_TO_ALIGN)
1021 aes_maybe_realign(ctx);
1022#endif
1023
Gilles Peskine9af58cd2023-03-10 22:29:32 +01001024#if defined(MBEDTLS_AESNI_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1026 return mbedtls_aesni_crypt_ecb(ctx, mode, input, output);
1027 }
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001028#endif
1029
Jerry Yu72fd0bd2023-08-18 16:31:01 +08001030#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +01001031 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Jerry Yu2bb3d812023-01-10 17:38:26 +08001032 return mbedtls_aesce_crypt_ecb(ctx, mode, input, output);
1033 }
1034#endif
1035
Jerry Yu9e628622023-08-17 11:20:09 +08001036#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001037 if (aes_padlock_ace > 0) {
Gilles Peskine148cad12023-03-16 13:08:42 +01001038 return mbedtls_padlock_xcryptecb(ctx, mode, input, output);
Paul Bakker5121ce52009-01-03 21:22:43 +00001039 }
1040#endif
1041
Jerry Yu29c91ba2023-08-04 11:02:04 +08001042#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001043 if (mode == MBEDTLS_AES_ENCRYPT) {
1044 return mbedtls_internal_aes_encrypt(ctx, input, output);
1045 } else {
1046 return mbedtls_internal_aes_decrypt(ctx, input, output);
1047 }
Jerry Yu29c91ba2023-08-04 11:02:04 +08001048#endif
1049
Paul Bakker5121ce52009-01-03 21:22:43 +00001050}
1051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001052#if defined(MBEDTLS_CIPHER_MODE_CBC)
Dave Rodgmand05e7f12023-06-14 18:58:48 +01001053
Paul Bakker5121ce52009-01-03 21:22:43 +00001054/*
1055 * AES-CBC buffer encryption/decryption
1056 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001057int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
1058 int mode,
1059 size_t length,
1060 unsigned char iv[16],
1061 const unsigned char *input,
1062 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001063{
Gilles Peskine7820a572021-07-07 21:08:28 +02001064 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001065 unsigned char temp[16];
1066
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001068 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001069 }
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001070
Paul Elliott2ad93672023-08-11 11:07:06 +01001071 /* Nothing to do if length is zero. */
1072 if (length == 0) {
1073 return 0;
1074 }
1075
Gilles Peskine449bd832023-01-11 14:50:10 +01001076 if (length % 16) {
1077 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
1078 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001079
Jerry Yu9e628622023-08-17 11:20:09 +08001080#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 if (aes_padlock_ace > 0) {
1082 if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) {
1083 return 0;
1084 }
Paul Bakker9af723c2014-05-01 13:03:14 +02001085
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001086 // If padlock data misaligned, we just fall back to
1087 // unaccelerated mode
1088 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001089 }
1090#endif
1091
Dave Rodgman906c63c2023-06-14 17:53:51 +01001092 const unsigned char *ivp = iv;
1093
Gilles Peskine449bd832023-01-11 14:50:10 +01001094 if (mode == MBEDTLS_AES_DECRYPT) {
1095 while (length > 0) {
1096 memcpy(temp, input, 16);
1097 ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output);
1098 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001099 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 }
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001101 /* Avoid using the NEON implementation of mbedtls_xor. Because of the dependency on
Dave Rodgman2dd15b32023-06-15 20:27:53 +01001102 * the result for the next block in CBC, and the cost of transferring that data from
1103 * NEON registers, NEON is slower on aarch64. */
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001104 mbedtls_xor_no_simd(output, output, iv, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001105
Gilles Peskine449bd832023-01-11 14:50:10 +01001106 memcpy(iv, temp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001107
1108 input += 16;
1109 output += 16;
1110 length -= 16;
1111 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001112 } else {
1113 while (length > 0) {
Dave Rodgmana0b166e2023-06-15 18:44:16 +01001114 mbedtls_xor_no_simd(output, input, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001115
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output);
1117 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001118 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001119 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001120 ivp = output;
Paul Bakker5121ce52009-01-03 21:22:43 +00001121
1122 input += 16;
1123 output += 16;
1124 length -= 16;
1125 }
Dave Rodgman906c63c2023-06-14 17:53:51 +01001126 memcpy(iv, ivp, 16);
Paul Bakker5121ce52009-01-03 21:22:43 +00001127 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001128 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001129
Gilles Peskine7820a572021-07-07 21:08:28 +02001130exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001131 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001132}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001134
Aorimn5f778012016-06-09 23:22:58 +02001135#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001136
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001137typedef unsigned char mbedtls_be128[16];
1138
1139/*
1140 * GF(2^128) multiplication function
1141 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001142 * This function multiplies a field element by x in the polynomial field
1143 * representation. It uses 64-bit word operations to gain speed but compensates
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001144 * for machine endianness and hence works correctly on both big and little
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001145 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001146 */
Dave Rodgman4ad81cc2023-06-16 15:04:04 +01001147#if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001148MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
Dave Rodgman4ad81cc2023-06-16 15:04:04 +01001149#endif
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001150static inline void mbedtls_gf128mul_x_ble(unsigned char r[16],
Dave Rodgman2dd15b32023-06-15 20:27:53 +01001151 const unsigned char x[16])
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001152{
1153 uint64_t a, b, ra, rb;
1154
Gilles Peskine449bd832023-01-11 14:50:10 +01001155 a = MBEDTLS_GET_UINT64_LE(x, 0);
1156 b = MBEDTLS_GET_UINT64_LE(x, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001157
Gilles Peskine449bd832023-01-11 14:50:10 +01001158 ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3));
1159 rb = (a >> 63) | (b << 1);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001160
Gilles Peskine449bd832023-01-11 14:50:10 +01001161 MBEDTLS_PUT_UINT64_LE(ra, r, 0);
1162 MBEDTLS_PUT_UINT64_LE(rb, r, 8);
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001163}
1164
Aorimn5f778012016-06-09 23:22:58 +02001165/*
1166 * AES-XTS buffer encryption/decryption
Dave Rodgman6cfd9b52023-06-15 18:46:23 +01001167 *
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001168 * Use of MBEDTLS_OPTIMIZE_FOR_PERFORMANCE here and for mbedtls_gf128mul_x_ble()
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001169 * is a 3x performance improvement for gcc -Os, if we have hardware AES support.
Aorimn5f778012016-06-09 23:22:58 +02001170 */
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001171#if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C)
Dave Rodgman9bb7e6f2023-06-16 09:41:21 +01001172MBEDTLS_OPTIMIZE_FOR_PERFORMANCE
Dave Rodgmanb2814bd2023-06-16 14:50:33 +01001173#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001174int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
1175 int mode,
1176 size_t length,
1177 const unsigned char data_unit[16],
1178 const unsigned char *input,
1179 unsigned char *output)
Aorimn5f778012016-06-09 23:22:58 +02001180{
Janos Follath24eed8d2019-11-22 13:21:35 +00001181 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001182 size_t blocks = length / 16;
1183 size_t leftover = length % 16;
1184 unsigned char tweak[16];
1185 unsigned char prev_tweak[16];
1186 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001189 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 }
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001191
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001192 /* Data units must be at least 16 bytes long. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 if (length < 16) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001194 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001195 }
Aorimn5f778012016-06-09 23:22:58 +02001196
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001197 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 if (length > (1 << 20) * 16) {
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001199 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 }
Aorimn5f778012016-06-09 23:22:58 +02001201
Jaeden Amerod82cd862018-04-28 15:02:45 +01001202 /* Compute the tweak. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT,
1204 data_unit, tweak);
1205 if (ret != 0) {
1206 return ret;
1207 }
Aorimn5f778012016-06-09 23:22:58 +02001208
Gilles Peskine449bd832023-01-11 14:50:10 +01001209 while (blocks--) {
Dave Rodgman360e04f2023-06-09 17:18:32 +01001210 if (MBEDTLS_UNLIKELY(leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0)) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001211 /* We are on the last block in a decrypt operation that has
1212 * leftover bytes, so we need to use the next tweak for this block,
Tom Cosgrove1797b052022-12-04 17:19:59 +00001213 * and this tweak for the leftover bytes. Save the current tweak for
Jaeden Amerod82cd862018-04-28 15:02:45 +01001214 * the leftovers and then update the current tweak for use on this,
1215 * the last full block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 memcpy(prev_tweak, tweak, sizeof(tweak));
1217 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218 }
1219
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 mbedtls_xor(tmp, input, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001221
Gilles Peskine449bd832023-01-11 14:50:10 +01001222 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1223 if (ret != 0) {
1224 return ret;
1225 }
Jaeden Amerod82cd862018-04-28 15:02:45 +01001226
Gilles Peskine449bd832023-01-11 14:50:10 +01001227 mbedtls_xor(output, tmp, tweak, 16);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001228
1229 /* Update the tweak for the next block. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 mbedtls_gf128mul_x_ble(tweak, tweak);
Jaeden Amerod82cd862018-04-28 15:02:45 +01001231
1232 output += 16;
1233 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001234 }
1235
Gilles Peskine449bd832023-01-11 14:50:10 +01001236 if (leftover) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001237 /* If we are on the leftover bytes in a decrypt operation, we need to
1238 * use the previous tweak for these bytes (as saved in prev_tweak). */
1239 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001240
Jaeden Amerod82cd862018-04-28 15:02:45 +01001241 /* We are now on the final part of the data unit, which doesn't divide
1242 * evenly by 16. It's time for ciphertext stealing. */
1243 size_t i;
1244 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001245
Jaeden Amerod82cd862018-04-28 15:02:45 +01001246 /* Copy ciphertext bytes from the previous block to our output for each
Dave Rodgman069e7f42022-11-24 19:37:26 +00001247 * byte of ciphertext we won't steal. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 for (i = 0; i < leftover; i++) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001249 output[i] = prev_output[i];
Aorimn5f778012016-06-09 23:22:58 +02001250 }
Aorimn5f778012016-06-09 23:22:58 +02001251
Dave Rodgman069e7f42022-11-24 19:37:26 +00001252 /* Copy the remainder of the input for this final round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001253 mbedtls_xor(tmp, input, t, leftover);
Dave Rodgmana8cf6072022-11-22 15:02:54 +00001254
Jaeden Amerod82cd862018-04-28 15:02:45 +01001255 /* Copy ciphertext bytes from the previous block for input in this
1256 * round. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001257 mbedtls_xor(tmp + i, prev_output + i, t + i, 16 - i);
Aorimn5f778012016-06-09 23:22:58 +02001258
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp);
1260 if (ret != 0) {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001261 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01001262 }
Aorimn5f778012016-06-09 23:22:58 +02001263
Jaeden Amerod82cd862018-04-28 15:02:45 +01001264 /* Write the result back to the previous block, overriding the previous
1265 * output we copied. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001266 mbedtls_xor(prev_output, tmp, t, 16);
Aorimn5f778012016-06-09 23:22:58 +02001267 }
1268
Gilles Peskine449bd832023-01-11 14:50:10 +01001269 return 0;
Aorimn5f778012016-06-09 23:22:58 +02001270}
1271#endif /* MBEDTLS_CIPHER_MODE_XTS */
1272
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001273#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001274/*
1275 * AES-CFB128 buffer encryption/decryption
1276 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001277int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
1278 int mode,
1279 size_t length,
1280 size_t *iv_off,
1281 unsigned char iv[16],
1282 const unsigned char *input,
1283 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +00001284{
Paul Bakker27fdf462011-06-09 13:55:13 +00001285 int c;
Gilles Peskine7820a572021-07-07 21:08:28 +02001286 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001287 size_t n;
1288
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001290 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001291 }
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001292
1293 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 if (n > 15) {
1296 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1297 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001298
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 if (mode == MBEDTLS_AES_DECRYPT) {
1300 while (length--) {
1301 if (n == 0) {
1302 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1303 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001304 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001306 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001307
1308 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001309 *output++ = (unsigned char) (c ^ iv[n]);
Paul Bakker5121ce52009-01-03 21:22:43 +00001310 iv[n] = (unsigned char) c;
1311
Gilles Peskine449bd832023-01-11 14:50:10 +01001312 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001313 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 } else {
1315 while (length--) {
1316 if (n == 0) {
1317 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1318 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001319 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001320 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001321 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001322
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Paul Bakker5121ce52009-01-03 21:22:43 +00001324
Gilles Peskine449bd832023-01-11 14:50:10 +01001325 n = (n + 1) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001326 }
1327 }
1328
1329 *iv_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001330 ret = 0;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001331
Gilles Peskine7820a572021-07-07 21:08:28 +02001332exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001334}
Paul Bakker556efba2014-01-24 15:38:12 +01001335
1336/*
1337 * AES-CFB8 buffer encryption/decryption
1338 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001339int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
1340 int mode,
1341 size_t length,
1342 unsigned char iv[16],
1343 const unsigned char *input,
1344 unsigned char *output)
Paul Bakker556efba2014-01-24 15:38:12 +01001345{
Gilles Peskine7820a572021-07-07 21:08:28 +02001346 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker556efba2014-01-24 15:38:12 +01001347 unsigned char c;
1348 unsigned char ov[17];
1349
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {
Tuvshinzaya Erdenekhuua8ef1562022-08-05 15:31:57 +01001351 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 }
1353 while (length--) {
1354 memcpy(ov, iv, 16);
1355 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1356 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001357 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 }
Paul Bakker556efba2014-01-24 15:38:12 +01001359
Gilles Peskine449bd832023-01-11 14:50:10 +01001360 if (mode == MBEDTLS_AES_DECRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001361 ov[16] = *input;
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 }
Paul Bakker556efba2014-01-24 15:38:12 +01001363
Gilles Peskine449bd832023-01-11 14:50:10 +01001364 c = *output++ = (unsigned char) (iv[0] ^ *input++);
Paul Bakker556efba2014-01-24 15:38:12 +01001365
Gilles Peskine449bd832023-01-11 14:50:10 +01001366 if (mode == MBEDTLS_AES_ENCRYPT) {
Paul Bakker556efba2014-01-24 15:38:12 +01001367 ov[16] = c;
Gilles Peskine449bd832023-01-11 14:50:10 +01001368 }
Paul Bakker556efba2014-01-24 15:38:12 +01001369
Gilles Peskine449bd832023-01-11 14:50:10 +01001370 memcpy(iv, ov + 1, 16);
Paul Bakker556efba2014-01-24 15:38:12 +01001371 }
Gilles Peskine7820a572021-07-07 21:08:28 +02001372 ret = 0;
Paul Bakker556efba2014-01-24 15:38:12 +01001373
Gilles Peskine7820a572021-07-07 21:08:28 +02001374exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001375 return ret;
Paul Bakker556efba2014-01-24 15:38:12 +01001376}
Simon Butcher76a5b222018-04-22 22:57:27 +01001377#endif /* MBEDTLS_CIPHER_MODE_CFB */
1378
1379#if defined(MBEDTLS_CIPHER_MODE_OFB)
1380/*
1381 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1382 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001383int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
1384 size_t length,
1385 size_t *iv_off,
1386 unsigned char iv[16],
1387 const unsigned char *input,
1388 unsigned char *output)
Simon Butcher76a5b222018-04-22 22:57:27 +01001389{
Simon Butcherad4e4932018-04-29 00:43:47 +01001390 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001391 size_t n;
1392
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001393 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001394
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 if (n > 15) {
1396 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1397 }
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001398
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 while (length--) {
1400 if (n == 0) {
1401 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv);
1402 if (ret != 0) {
Simon Butcherad4e4932018-04-29 00:43:47 +01001403 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 }
Simon Butcherad4e4932018-04-29 00:43:47 +01001405 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001406 *output++ = *input++ ^ iv[n];
1407
Gilles Peskine449bd832023-01-11 14:50:10 +01001408 n = (n + 1) & 0x0F;
Simon Butcher76a5b222018-04-22 22:57:27 +01001409 }
1410
1411 *iv_off = n;
1412
Simon Butcherad4e4932018-04-29 00:43:47 +01001413exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001414 return ret;
Simon Butcher76a5b222018-04-22 22:57:27 +01001415}
1416#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001417
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001418#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001419/*
1420 * AES-CTR buffer encryption/decryption
1421 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001422int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
1423 size_t length,
1424 size_t *nc_off,
1425 unsigned char nonce_counter[16],
1426 unsigned char stream_block[16],
1427 const unsigned char *input,
1428 unsigned char *output)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001429{
Paul Bakker369e14b2012-04-18 14:16:09 +00001430 int c, i;
Gilles Peskine7820a572021-07-07 21:08:28 +02001431 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001432 size_t n;
1433
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001434 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001435
Gilles Peskine449bd832023-01-11 14:50:10 +01001436 if (n > 0x0F) {
1437 return MBEDTLS_ERR_AES_BAD_INPUT_DATA;
1438 }
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001439
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 while (length--) {
1441 if (n == 0) {
1442 ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block);
1443 if (ret != 0) {
Gilles Peskine7820a572021-07-07 21:08:28 +02001444 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001445 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001446
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 for (i = 16; i > 0; i--) {
1448 if (++nonce_counter[i - 1] != 0) {
Paul Bakker369e14b2012-04-18 14:16:09 +00001449 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 }
1451 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001452 }
1453 c = *input++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001454 *output++ = (unsigned char) (c ^ stream_block[n]);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001455
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 n = (n + 1) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001457 }
1458
1459 *nc_off = n;
Gilles Peskine7820a572021-07-07 21:08:28 +02001460 ret = 0;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001461
Gilles Peskine7820a572021-07-07 21:08:28 +02001462exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001463 return ret;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001464}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001465#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001467#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001468
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001470/*
1471 * AES test vectors from:
1472 *
1473 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1474 */
Yanray Wang62c99912023-05-11 11:06:53 +08001475static const unsigned char aes_test_ecb_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001476{
1477 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1478 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
Yanray Wang62c99912023-05-11 11:06:53 +08001479#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001480 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1481 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1482 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1483 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
Yanray Wang62c99912023-05-11 11:06:53 +08001484#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001485};
1486
Yanray Wang62c99912023-05-11 11:06:53 +08001487static const unsigned char aes_test_ecb_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001488{
1489 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1490 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
Yanray Wang62c99912023-05-11 11:06:53 +08001491#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001492 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1493 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1494 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1495 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001496#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001497};
1498
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001499#if defined(MBEDTLS_CIPHER_MODE_CBC)
Yanray Wang62c99912023-05-11 11:06:53 +08001500static const unsigned char aes_test_cbc_dec[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001501{
1502 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1503 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
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 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1506 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1507 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1508 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
Yanray Wang62c99912023-05-11 11:06:53 +08001509#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001510};
1511
Yanray Wang62c99912023-05-11 11:06:53 +08001512static const unsigned char aes_test_cbc_enc[][16] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001513{
1514 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1515 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
Yanray Wang62c99912023-05-11 11:06:53 +08001516#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001517 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1518 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1519 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1520 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
Yanray Wang62c99912023-05-11 11:06:53 +08001521#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001522};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001523#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001525#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001526/*
1527 * AES-CFB128 test vectors from:
1528 *
1529 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1530 */
Yanray Wang62c99912023-05-11 11:06:53 +08001531static const unsigned char aes_test_cfb128_key[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001532{
1533 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1534 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001535#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001536 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1537 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1538 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1539 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1540 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1541 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1542 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001543#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001544};
1545
1546static const unsigned char aes_test_cfb128_iv[16] =
1547{
1548 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1549 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1550};
1551
1552static const unsigned char aes_test_cfb128_pt[64] =
1553{
1554 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1555 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1556 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1557 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1558 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1559 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1560 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1561 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1562};
1563
Yanray Wang62c99912023-05-11 11:06:53 +08001564static const unsigned char aes_test_cfb128_ct[][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +00001565{
1566 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1567 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1568 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1569 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1570 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1571 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1572 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1573 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
Yanray Wang62c99912023-05-11 11:06:53 +08001574#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +00001575 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1576 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1577 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1578 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1579 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1580 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1581 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1582 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1583 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1584 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1585 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1586 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1587 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1588 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1589 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1590 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
Yanray Wang62c99912023-05-11 11:06:53 +08001591#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001592};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001593#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001594
Simon Butcherad4e4932018-04-29 00:43:47 +01001595#if defined(MBEDTLS_CIPHER_MODE_OFB)
1596/*
1597 * AES-OFB test vectors from:
1598 *
Simon Butcher5db13622018-06-04 22:11:25 +01001599 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001600 */
Yanray Wang62c99912023-05-11 11:06:53 +08001601static const unsigned char aes_test_ofb_key[][32] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001602{
1603 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1604 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
Yanray Wang62c99912023-05-11 11:06:53 +08001605#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001606 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1607 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1608 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1609 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1610 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1611 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1612 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Yanray Wang62c99912023-05-11 11:06:53 +08001613#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001614};
1615
1616static const unsigned char aes_test_ofb_iv[16] =
1617{
1618 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1619 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1620};
1621
1622static const unsigned char aes_test_ofb_pt[64] =
1623{
1624 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1625 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1626 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1627 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1628 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1629 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1630 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1631 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1632};
1633
Yanray Wang62c99912023-05-11 11:06:53 +08001634static const unsigned char aes_test_ofb_ct[][64] =
Simon Butcherad4e4932018-04-29 00:43:47 +01001635{
1636 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1637 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1638 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1639 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1640 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1641 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1642 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1643 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
Yanray Wang62c99912023-05-11 11:06:53 +08001644#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Simon Butcherad4e4932018-04-29 00:43:47 +01001645 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1646 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1647 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1648 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1649 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1650 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1651 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1652 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1653 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1654 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1655 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1656 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1657 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1658 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1659 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1660 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
Yanray Wang62c99912023-05-11 11:06:53 +08001661#endif
Simon Butcherad4e4932018-04-29 00:43:47 +01001662};
1663#endif /* MBEDTLS_CIPHER_MODE_OFB */
1664
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001665#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001666/*
1667 * AES-CTR test vectors from:
1668 *
1669 * http://www.faqs.org/rfcs/rfc3686.html
1670 */
1671
Yanray Wang62c99912023-05-11 11:06:53 +08001672static const unsigned char aes_test_ctr_key[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001673{
1674 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1675 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1676 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1677 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1678 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1679 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1680};
1681
Yanray Wang62c99912023-05-11 11:06:53 +08001682static const unsigned char aes_test_ctr_nonce_counter[][16] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001683{
1684 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1686 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1687 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1688 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1689 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1690};
1691
Yanray Wang62c99912023-05-11 11:06:53 +08001692static const unsigned char aes_test_ctr_pt[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001693{
1694 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1695 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001696 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1697 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1698 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1699 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1700
1701 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1702 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1703 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1704 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1705 0x20, 0x21, 0x22, 0x23 }
1706};
1707
Yanray Wang62c99912023-05-11 11:06:53 +08001708static const unsigned char aes_test_ctr_ct[][48] =
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001709{
1710 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1711 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1712 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1713 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1714 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1715 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1716 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1717 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1718 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1719 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1720 0x25, 0xB2, 0x07, 0x2F }
1721};
1722
1723static const int aes_test_ctr_len[3] =
Gilles Peskine449bd832023-01-11 14:50:10 +01001724{ 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001725#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001726
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001727#if defined(MBEDTLS_CIPHER_MODE_XTS)
1728/*
1729 * AES-XTS test vectors from:
1730 *
1731 * IEEE P1619/D16 Annex B
1732 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1733 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1734 */
1735static const unsigned char aes_test_xts_key[][32] =
1736{
1737 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1738 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1741 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1742 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1743 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1744 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1745 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1746 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1747 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1748 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1749};
1750
1751static const unsigned char aes_test_xts_pt32[][32] =
1752{
1753 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1757 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1758 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1759 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1760 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1761 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1762 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1763 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1764 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1765};
1766
1767static const unsigned char aes_test_xts_ct32[][32] =
1768{
1769 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1770 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1771 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1772 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1773 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1774 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1775 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1776 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1777 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1778 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1779 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1780 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1781};
1782
1783static const unsigned char aes_test_xts_data_unit[][16] =
1784{
Gilles Peskine449bd832023-01-11 14:50:10 +01001785 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1787 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1789 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001791};
1792
1793#endif /* MBEDTLS_CIPHER_MODE_XTS */
1794
Paul Bakker5121ce52009-01-03 21:22:43 +00001795/*
1796 * Checkup routine
1797 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001798int mbedtls_aes_self_test(int verbose)
Paul Bakker5121ce52009-01-03 21:22:43 +00001799{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001800 int ret = 0, i, j, u, mode;
1801 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001802 unsigned char key[32];
1803 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001804 const unsigned char *aes_tests;
Andrzej Kurek252283f2022-09-27 07:54:16 -04001805#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1806 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001807 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001808#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001809#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001810 unsigned char prv[16];
1811#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001812#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1813 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001814 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001815#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001816#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001817 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001818#endif
1819#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001820 unsigned char nonce_counter[16];
1821 unsigned char stream_block[16];
1822#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001823 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001824
Gilles Peskine449bd832023-01-11 14:50:10 +01001825 memset(key, 0, 32);
1826 mbedtls_aes_init(&ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00001827
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001828 if (verbose != 0) {
1829#if defined(MBEDTLS_AES_ALT)
1830 mbedtls_printf(" AES note: alternative implementation.\n");
1831#else /* MBEDTLS_AES_ALT */
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001832#if defined(MBEDTLS_AESNI_HAVE_CODE)
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001833#if MBEDTLS_AESNI_HAVE_CODE == 1
Dave Rodgman086e1372023-06-16 20:21:39 +01001834 mbedtls_printf(" AES note: AESNI code present (assembly implementation).\n");
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001835#elif MBEDTLS_AESNI_HAVE_CODE == 2
Dave Rodgman086e1372023-06-16 20:21:39 +01001836 mbedtls_printf(" AES note: AESNI code present (intrinsics implementation).\n");
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001837#else
Antonio de Angelis1ee4d122023-08-16 12:26:37 +01001838#error "Unrecognised value for MBEDTLS_AESNI_HAVE_CODE"
Dave Rodgman96a9e6a2023-06-16 20:18:36 +01001839#endif
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001840 if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
1841 mbedtls_printf(" AES note: using AESNI.\n");
1842 } else
1843#endif
Jerry Yu9e628622023-08-17 11:20:09 +08001844#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE)
Jerry Yu2319af02023-08-17 10:38:57 +08001845 if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) {
1846 mbedtls_printf(" AES note: using VIA Padlock.\n");
1847 } else
1848#endif
Jerry Yu72fd0bd2023-08-18 16:31:01 +08001849#if defined(MBEDTLS_AESCE_HAVE_CODE)
Dave Rodgmanf2249ec2023-08-04 14:27:58 +01001850 if (MBEDTLS_AESCE_HAS_SUPPORT()) {
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001851 mbedtls_printf(" AES note: using AESCE.\n");
1852 } else
1853#endif
Jerry Yu29c91ba2023-08-04 11:02:04 +08001854 {
1855#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
1856 mbedtls_printf(" AES note: built-in implementation.\n");
1857#endif
1858 }
Gilles Peskine7e67bd52023-03-10 22:35:24 +01001859#endif /* MBEDTLS_AES_ALT */
1860 }
1861
Paul Bakker5121ce52009-01-03 21:22:43 +00001862 /*
1863 * ECB mode
1864 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001865 {
1866 static const int num_tests =
1867 sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001868
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001869 for (i = 0; i < num_tests << 1; i++) {
1870 u = i >> 1;
1871 keybits = 128 + u * 64;
1872 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001873
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001874 if (verbose != 0) {
1875 mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
1876 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
1877 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08001878
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001879 memset(buf, 0, 16);
Gilles Peskine449bd832023-01-11 14:50:10 +01001880
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001881 if (mode == MBEDTLS_AES_DECRYPT) {
1882 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1883 aes_tests = aes_test_ecb_dec[u];
1884 } else {
1885 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1886 aes_tests = aes_test_ecb_enc[u];
1887 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001888
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001889 /*
1890 * AES-192 is an optional feature that may be unavailable when
1891 * there is an alternative underlying implementation i.e. when
1892 * MBEDTLS_AES_ALT is defined.
1893 */
1894 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1895 mbedtls_printf("skipped\n");
1896 continue;
1897 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001898 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001899 }
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001900
1901 for (j = 0; j < 10000; j++) {
1902 ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
1903 if (ret != 0) {
1904 goto exit;
1905 }
1906 }
1907
1908 if (memcmp(buf, aes_tests, 16) != 0) {
1909 ret = 1;
1910 goto exit;
1911 }
1912
1913 if (verbose != 0) {
1914 mbedtls_printf("passed\n");
1915 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001916 }
1917
Gilles Peskine449bd832023-01-11 14:50:10 +01001918 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001919 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001921 }
1922
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001923#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001924 /*
1925 * CBC mode
1926 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001927 {
1928 static const int num_tests =
1929 sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
Paul Bakker5121ce52009-01-03 21:22:43 +00001930
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001931 for (i = 0; i < num_tests << 1; i++) {
1932 u = i >> 1;
1933 keybits = 128 + u * 64;
1934 mode = i & 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001935
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001936 if (verbose != 0) {
1937 mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
1938 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
Paul Bakker5121ce52009-01-03 21:22:43 +00001939 }
1940
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001941 memset(iv, 0, 16);
1942 memset(prv, 0, 16);
1943 memset(buf, 0, 16);
1944
1945 if (mode == MBEDTLS_AES_DECRYPT) {
1946 ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
1947 aes_tests = aes_test_cbc_dec[u];
1948 } else {
1949 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
1950 aes_tests = aes_test_cbc_enc[u];
1951 }
1952
1953 /*
1954 * AES-192 is an optional feature that may be unavailable when
1955 * there is an alternative underlying implementation i.e. when
1956 * MBEDTLS_AES_ALT is defined.
1957 */
1958 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
1959 mbedtls_printf("skipped\n");
1960 continue;
1961 } else if (ret != 0) {
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001962 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001964
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001965 for (j = 0; j < 10000; j++) {
1966 if (mode == MBEDTLS_AES_ENCRYPT) {
1967 unsigned char tmp[16];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001968
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001969 memcpy(tmp, prv, 16);
1970 memcpy(prv, buf, 16);
1971 memcpy(buf, tmp, 16);
1972 }
1973
1974 ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
1975 if (ret != 0) {
1976 goto exit;
1977 }
1978
1979 }
1980
1981 if (memcmp(buf, aes_tests, 16) != 0) {
1982 ret = 1;
1983 goto exit;
1984 }
1985
1986 if (verbose != 0) {
1987 mbedtls_printf("passed\n");
1988 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001989 }
1990
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08001992 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001994 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001995#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001996
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001997#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001998 /*
1999 * CFB128 mode
2000 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002001 {
2002 static const int num_tests =
2003 sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
Paul Bakker5121ce52009-01-03 21:22:43 +00002004
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002005 for (i = 0; i < num_tests << 1; i++) {
2006 u = i >> 1;
2007 keybits = 128 + u * 64;
2008 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002009
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002010 if (verbose != 0) {
2011 mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
2012 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2013 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002014
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002015 memcpy(iv, aes_test_cfb128_iv, 16);
2016 memcpy(key, aes_test_cfb128_key[u], keybits / 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002017
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002018 offset = 0;
2019 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2020 /*
2021 * AES-192 is an optional feature that may be unavailable when
2022 * there is an alternative underlying implementation i.e. when
2023 * MBEDTLS_AES_ALT is defined.
2024 */
2025 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2026 mbedtls_printf("skipped\n");
2027 continue;
2028 } else if (ret != 0) {
2029 goto exit;
2030 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002031
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002032 if (mode == MBEDTLS_AES_DECRYPT) {
2033 memcpy(buf, aes_test_cfb128_ct[u], 64);
2034 aes_tests = aes_test_cfb128_pt;
2035 } else {
2036 memcpy(buf, aes_test_cfb128_pt, 64);
2037 aes_tests = aes_test_cfb128_ct[u];
2038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002039
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002040 ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
2041 if (ret != 0) {
2042 goto exit;
2043 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002044
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002045 if (memcmp(buf, aes_tests, 64) != 0) {
2046 ret = 1;
2047 goto exit;
2048 }
2049
2050 if (verbose != 0) {
2051 mbedtls_printf("passed\n");
2052 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002053 }
2054
Gilles Peskine449bd832023-01-11 14:50:10 +01002055 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002056 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002057 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002058 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002059#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002060
Simon Butcherad4e4932018-04-29 00:43:47 +01002061#if defined(MBEDTLS_CIPHER_MODE_OFB)
2062 /*
2063 * OFB mode
2064 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002065 {
2066 static const int num_tests =
2067 sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
Simon Butcherad4e4932018-04-29 00:43:47 +01002068
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002069 for (i = 0; i < num_tests << 1; i++) {
2070 u = i >> 1;
2071 keybits = 128 + u * 64;
2072 mode = i & 1;
Simon Butcherad4e4932018-04-29 00:43:47 +01002073
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002074 if (verbose != 0) {
2075 mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
2076 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2077 }
Arto Kinnunen0f066182023-04-20 10:02:46 +08002078
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002079 memcpy(iv, aes_test_ofb_iv, 16);
2080 memcpy(key, aes_test_ofb_key[u], keybits / 8);
Simon Butcherad4e4932018-04-29 00:43:47 +01002081
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002082 offset = 0;
2083 ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
2084 /*
2085 * AES-192 is an optional feature that may be unavailable when
2086 * there is an alternative underlying implementation i.e. when
2087 * MBEDTLS_AES_ALT is defined.
2088 */
2089 if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
2090 mbedtls_printf("skipped\n");
2091 continue;
2092 } else if (ret != 0) {
2093 goto exit;
2094 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002095
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002096 if (mode == MBEDTLS_AES_DECRYPT) {
2097 memcpy(buf, aes_test_ofb_ct[u], 64);
2098 aes_tests = aes_test_ofb_pt;
2099 } else {
2100 memcpy(buf, aes_test_ofb_pt, 64);
2101 aes_tests = aes_test_ofb_ct[u];
2102 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002103
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002104 ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
2105 if (ret != 0) {
2106 goto exit;
2107 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002108
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002109 if (memcmp(buf, aes_tests, 64) != 0) {
2110 ret = 1;
2111 goto exit;
2112 }
2113
2114 if (verbose != 0) {
2115 mbedtls_printf("passed\n");
2116 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002117 }
2118
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 if (verbose != 0) {
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002120 mbedtls_printf("\n");
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002122 }
Simon Butcherad4e4932018-04-29 00:43:47 +01002123#endif /* MBEDTLS_CIPHER_MODE_OFB */
2124
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002125#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002126 /*
2127 * CTR mode
2128 */
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002129 {
2130 static const int num_tests =
2131 sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002132
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002133 for (i = 0; i < num_tests << 1; i++) {
2134 u = i >> 1;
2135 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002136
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002137 if (verbose != 0) {
2138 mbedtls_printf(" AES-CTR-128 (%s): ",
2139 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2140 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002141
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002142 memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
2143 memcpy(key, aes_test_ctr_key[u], 16);
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002144
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002145 offset = 0;
2146 if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
2147 goto exit;
2148 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002149
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002150 len = aes_test_ctr_len[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002151
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002152 if (mode == MBEDTLS_AES_DECRYPT) {
2153 memcpy(buf, aes_test_ctr_ct[u], len);
2154 aes_tests = aes_test_ctr_pt[u];
2155 } else {
2156 memcpy(buf, aes_test_ctr_pt[u], len);
2157 aes_tests = aes_test_ctr_ct[u];
2158 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002159
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002160 ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
2161 stream_block, buf, buf);
2162 if (ret != 0) {
2163 goto exit;
2164 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002165
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002166 if (memcmp(buf, aes_tests, len) != 0) {
2167 ret = 1;
2168 goto exit;
2169 }
2170
2171 if (verbose != 0) {
2172 mbedtls_printf("passed\n");
2173 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002175 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 if (verbose != 0) {
2178 mbedtls_printf("\n");
2179 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002180#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002181
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002182#if defined(MBEDTLS_CIPHER_MODE_XTS)
Yanray Wang59c2dfa2023-05-11 12:04:23 +08002183 /*
2184 * XTS mode
2185 */
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002186 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002187 static const int num_tests =
2188 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2189 mbedtls_aes_xts_context ctx_xts;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002190
Gilles Peskine449bd832023-01-11 14:50:10 +01002191 mbedtls_aes_xts_init(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002192
Gilles Peskine449bd832023-01-11 14:50:10 +01002193 for (i = 0; i < num_tests << 1; i++) {
2194 const unsigned char *data_unit;
2195 u = i >> 1;
2196 mode = i & 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002197
Gilles Peskine449bd832023-01-11 14:50:10 +01002198 if (verbose != 0) {
2199 mbedtls_printf(" AES-XTS-128 (%s): ",
2200 (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
2201 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002202
Gilles Peskine449bd832023-01-11 14:50:10 +01002203 memset(key, 0, sizeof(key));
2204 memcpy(key, aes_test_xts_key[u], 32);
2205 data_unit = aes_test_xts_data_unit[u];
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002206
Gilles Peskine449bd832023-01-11 14:50:10 +01002207 len = sizeof(*aes_test_xts_ct32);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002208
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 if (mode == MBEDTLS_AES_DECRYPT) {
2210 ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256);
2211 if (ret != 0) {
2212 goto exit;
2213 }
2214 memcpy(buf, aes_test_xts_ct32[u], len);
2215 aes_tests = aes_test_xts_pt32[u];
2216 } else {
2217 ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256);
2218 if (ret != 0) {
2219 goto exit;
2220 }
2221 memcpy(buf, aes_test_xts_pt32[u], len);
2222 aes_tests = aes_test_xts_ct32[u];
2223 }
2224
2225
2226 ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit,
2227 buf, buf);
2228 if (ret != 0) {
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002229 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002230 }
2231
2232 if (memcmp(buf, aes_tests, len) != 0) {
2233 ret = 1;
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002234 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 }
2236
2237 if (verbose != 0) {
2238 mbedtls_printf("passed\n");
2239 }
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002240 }
2241
Gilles Peskine449bd832023-01-11 14:50:10 +01002242 if (verbose != 0) {
2243 mbedtls_printf("\n");
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002244 }
2245
Gilles Peskine449bd832023-01-11 14:50:10 +01002246 mbedtls_aes_xts_free(&ctx_xts);
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002247 }
2248#endif /* MBEDTLS_CIPHER_MODE_XTS */
2249
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002250 ret = 0;
2251
2252exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002253 if (ret != 0 && verbose != 0) {
2254 mbedtls_printf("failed\n");
2255 }
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002256
Gilles Peskine449bd832023-01-11 14:50:10 +01002257 mbedtls_aes_free(&ctx);
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002258
Gilles Peskine449bd832023-01-11 14:50:10 +01002259 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002260}
2261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002262#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002264#endif /* MBEDTLS_AES_C */