blob: b36b81c73c3ee020189d0ca56dc2f6971cf261c4 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
21 *
22 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
23 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Rich Evans00ab4702015-02-06 13:43:58 +000030#include <string.h>
31
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030033#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_PADLOCK_C)
Chris Jones16dbaeb2021-03-09 17:47:55 +000037#include "padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_AESNI_C)
Chris Jones187782f2021-03-09 17:28:35 +000040#include "aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010041#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_SELF_TEST)
44#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010046#else
Rich Evans00ab4702015-02-06 13:43:58 +000047#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#define mbedtls_printf printf
49#endif /* MBEDTLS_PLATFORM_C */
50#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020053
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010054/* Parameter validation macros based on platform_util.h */
55#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010056 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010057#define AES_VALIDATE( cond ) \
58 MBEDTLS_INTERNAL_VALIDATE( cond )
59
Paul Bakker5121ce52009-01-03 21:22:43 +000060/*
61 * 32-bit integer manipulation macros (little endian)
62 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000063#ifndef GET_UINT32_LE
64#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000065{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000066 (n) = ( (uint32_t) (b)[(i) ] ) \
67 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
68 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
69 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000070}
71#endif
72
Paul Bakker5c2364c2012-10-01 14:41:15 +000073#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000074#define PUT_UINT32_LE(n,b,i) \
75{ \
76 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
77 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
78 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
79 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000080}
81#endif
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083#if defined(MBEDTLS_PADLOCK_C) && \
84 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +000085static int aes_padlock_ace = -1;
86#endif
87
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000089/*
90 * Forward S-box
91 */
92static const unsigned char FSb[256] =
93{
94 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
95 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
96 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
97 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
98 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
99 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
100 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
101 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
102 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
103 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
104 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
105 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
106 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
107 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
108 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
109 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
110 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
111 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
112 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
113 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
114 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
115 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
116 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
117 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
118 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
119 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
120 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
121 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
122 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
123 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
124 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
125 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
126};
127
128/*
129 * Forward tables
130 */
131#define FT \
132\
133 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
134 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
135 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
136 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
137 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
138 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
139 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
140 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
141 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
142 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
143 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
144 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
145 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
146 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
147 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
148 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
149 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
150 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
151 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
152 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
153 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
154 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
155 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
156 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
157 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
158 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
159 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
160 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
161 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
162 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
163 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
164 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
165 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
166 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
167 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
168 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
169 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
170 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
171 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
172 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
173 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
174 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
175 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
176 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
177 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
178 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
179 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
180 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
181 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
182 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
183 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
184 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
185 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
186 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
187 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
188 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
189 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
190 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
191 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
192 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
193 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
194 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
195 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
196 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
197
198#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000199static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000200#undef V
201
Hanno Beckerad049a92017-06-19 16:31:54 +0100202#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200203
Paul Bakker5121ce52009-01-03 21:22:43 +0000204#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000205static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000206#undef V
207
208#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000209static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000210#undef V
211
212#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000213static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000214#undef V
215
Hanno Becker177d3cf2017-06-07 15:52:48 +0100216#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200217
Paul Bakker5121ce52009-01-03 21:22:43 +0000218#undef FT
219
220/*
221 * Reverse S-box
222 */
223static const unsigned char RSb[256] =
224{
225 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
226 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
227 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
228 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
229 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
230 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
231 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
232 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
233 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
234 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
235 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
236 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
237 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
238 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
239 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
240 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
241 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
242 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
243 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
244 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
245 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
246 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
247 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
248 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
249 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
250 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
251 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
252 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
253 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
254 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
255 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
256 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
257};
258
259/*
260 * Reverse tables
261 */
262#define RT \
263\
264 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
265 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
266 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
267 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
268 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
269 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
270 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
271 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
272 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
273 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
274 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
275 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
276 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
277 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
278 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
279 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
280 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
281 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
282 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
283 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
284 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
285 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
286 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
287 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
288 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
289 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
290 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
291 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
292 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
293 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
294 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
295 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
296 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
297 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
298 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
299 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
300 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
301 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
302 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
303 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
304 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
305 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
306 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
307 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
308 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
309 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
310 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
311 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
312 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
313 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
314 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
315 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
316 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
317 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
318 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
319 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
320 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
321 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
322 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
323 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
324 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
325 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
326 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
327 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
328
329#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000330static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000331#undef V
332
Hanno Beckerad049a92017-06-19 16:31:54 +0100333#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200334
Paul Bakker5121ce52009-01-03 21:22:43 +0000335#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000336static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000337#undef V
338
339#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000340static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000341#undef V
342
343#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000344static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000345#undef V
346
Hanno Becker177d3cf2017-06-07 15:52:48 +0100347#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200348
Paul Bakker5121ce52009-01-03 21:22:43 +0000349#undef RT
350
351/*
352 * Round constants
353 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000354static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000355{
356 0x00000001, 0x00000002, 0x00000004, 0x00000008,
357 0x00000010, 0x00000020, 0x00000040, 0x00000080,
358 0x0000001B, 0x00000036
359};
360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
363/*
364 * Forward S-box & tables
365 */
366static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200367static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100368#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200369static uint32_t FT1[256];
370static uint32_t FT2[256];
371static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100372#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
374/*
375 * Reverse S-box & tables
376 */
377static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100379#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000380static uint32_t RT1[256];
381static uint32_t RT2[256];
382static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100383#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385/*
386 * Round constants
387 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000388static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
390/*
391 * Tables generation code
392 */
Hanno Becker1eeca412018-10-15 12:01:35 +0100393#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
394#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker818bac52018-10-26 09:13:26 +0100395#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000396
397static int aes_init_done = 0;
398
399static void aes_gen_tables( void )
400{
401 int i, x, y, z;
402 int pow[256];
403 int log[256];
404
405 /*
406 * compute pow and log tables over GF(2^8)
407 */
408 for( i = 0, x = 1; i < 256; i++ )
409 {
410 pow[i] = x;
411 log[x] = i;
412 x = ( x ^ XTIME( x ) ) & 0xFF;
413 }
414
415 /*
416 * calculate the round constants
417 */
418 for( i = 0, x = 1; i < 10; i++ )
419 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000420 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000421 x = XTIME( x ) & 0xFF;
422 }
423
424 /*
425 * generate the forward and reverse S-boxes
426 */
427 FSb[0x00] = 0x63;
428 RSb[0x63] = 0x00;
429
430 for( i = 1; i < 256; i++ )
431 {
432 x = pow[255 - log[i]];
433
Paul Bakker66d5d072014-06-17 16:39:18 +0200434 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
435 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
436 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
437 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000438 x ^= y ^ 0x63;
439
440 FSb[i] = (unsigned char) x;
441 RSb[x] = (unsigned char) i;
442 }
443
444 /*
445 * generate the forward and reverse tables
446 */
447 for( i = 0; i < 256; i++ )
448 {
449 x = FSb[i];
450 y = XTIME( x ) & 0xFF;
451 z = ( y ^ x ) & 0xFF;
452
Paul Bakker5c2364c2012-10-01 14:41:15 +0000453 FT0[i] = ( (uint32_t) y ) ^
454 ( (uint32_t) x << 8 ) ^
455 ( (uint32_t) x << 16 ) ^
456 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000457
Hanno Beckerad049a92017-06-19 16:31:54 +0100458#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000459 FT1[i] = ROTL8( FT0[i] );
460 FT2[i] = ROTL8( FT1[i] );
461 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100462#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000463
464 x = RSb[i];
465
Paul Bakker5c2364c2012-10-01 14:41:15 +0000466 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
467 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
468 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
469 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000470
Hanno Beckerad049a92017-06-19 16:31:54 +0100471#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000472 RT1[i] = ROTL8( RT0[i] );
473 RT2[i] = ROTL8( RT1[i] );
474 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100475#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000476 }
477}
478
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200479#undef ROTL8
480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000482
Hanno Beckerad049a92017-06-19 16:31:54 +0100483#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200484
485#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
486#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
487#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
488
489#define AES_RT0(idx) RT0[idx]
490#define AES_RT1(idx) ROTL8( RT0[idx] )
491#define AES_RT2(idx) ROTL16( RT0[idx] )
492#define AES_RT3(idx) ROTL24( RT0[idx] )
493
494#define AES_FT0(idx) FT0[idx]
495#define AES_FT1(idx) ROTL8( FT0[idx] )
496#define AES_FT2(idx) ROTL16( FT0[idx] )
497#define AES_FT3(idx) ROTL24( FT0[idx] )
498
Hanno Becker177d3cf2017-06-07 15:52:48 +0100499#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200500
501#define AES_RT0(idx) RT0[idx]
502#define AES_RT1(idx) RT1[idx]
503#define AES_RT2(idx) RT2[idx]
504#define AES_RT3(idx) RT3[idx]
505
506#define AES_FT0(idx) FT0[idx]
507#define AES_FT1(idx) FT1[idx]
508#define AES_FT2(idx) FT2[idx]
509#define AES_FT3(idx) FT3[idx]
510
Hanno Becker177d3cf2017-06-07 15:52:48 +0100511#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200514{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100515 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000516
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200517 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200518}
519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200521{
522 if( ctx == NULL )
523 return;
524
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500525 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200526}
527
Jaeden Amero9366feb2018-05-29 18:55:17 +0100528#if defined(MBEDTLS_CIPHER_MODE_XTS)
529void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
530{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100531 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000532
Jaeden Amero9366feb2018-05-29 18:55:17 +0100533 mbedtls_aes_init( &ctx->crypt );
534 mbedtls_aes_init( &ctx->tweak );
535}
536
537void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
538{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100539 if( ctx == NULL )
540 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000541
Jaeden Amero9366feb2018-05-29 18:55:17 +0100542 mbedtls_aes_free( &ctx->crypt );
543 mbedtls_aes_free( &ctx->tweak );
544}
545#endif /* MBEDTLS_CIPHER_MODE_XTS */
546
Paul Bakker5121ce52009-01-03 21:22:43 +0000547/*
548 * AES key schedule (encryption)
549 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200550#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200552 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000553{
Paul Bakker23986e52011-04-24 08:57:21 +0000554 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000555 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100557 AES_VALIDATE_RET( ctx != NULL );
558 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000559
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200560 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000561 {
562 case 128: ctx->nr = 10; break;
563 case 192: ctx->nr = 12; break;
564 case 256: ctx->nr = 14; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000566 }
567
Simon Butcher5201e412018-12-06 17:40:14 +0000568#if !defined(MBEDTLS_AES_ROM_TABLES)
569 if( aes_init_done == 0 )
570 {
571 aes_gen_tables();
572 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000573 }
574#endif
575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000577 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100578 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000579
580 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000582 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000583#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000584 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000585
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100587 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200588 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100589#endif
590
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200591 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000592 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000593 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000594 }
595
596 switch( ctx->nr )
597 {
598 case 10:
599
600 for( i = 0; i < 10; i++, RK += 4 )
601 {
602 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000603 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
604 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
605 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
606 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000607
608 RK[5] = RK[1] ^ RK[4];
609 RK[6] = RK[2] ^ RK[5];
610 RK[7] = RK[3] ^ RK[6];
611 }
612 break;
613
614 case 12:
615
616 for( i = 0; i < 8; i++, RK += 6 )
617 {
618 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000619 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
620 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
621 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
622 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000623
624 RK[7] = RK[1] ^ RK[6];
625 RK[8] = RK[2] ^ RK[7];
626 RK[9] = RK[3] ^ RK[8];
627 RK[10] = RK[4] ^ RK[9];
628 RK[11] = RK[5] ^ RK[10];
629 }
630 break;
631
632 case 14:
633
634 for( i = 0; i < 7; i++, RK += 8 )
635 {
636 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000637 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
638 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
639 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
640 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[9] = RK[1] ^ RK[8];
643 RK[10] = RK[2] ^ RK[9];
644 RK[11] = RK[3] ^ RK[10];
645
646 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000647 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
648 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
649 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
650 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
652 RK[13] = RK[5] ^ RK[12];
653 RK[14] = RK[6] ^ RK[13];
654 RK[15] = RK[7] ^ RK[14];
655 }
656 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000658
659 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000660}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200661#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000662
663/*
664 * AES key schedule (decryption)
665 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200666#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200668 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000669{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200670 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000672 uint32_t *RK;
673 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200674
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100675 AES_VALIDATE_RET( ctx != NULL );
676 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200678 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000681 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100682 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000683
684 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000686 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000687#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000688 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000689
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200690 /* Also checks keybits */
691 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200692 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000693
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200694 ctx->nr = cty.nr;
695
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200696#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100697 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100698 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100700 (const unsigned char *) cty.rk, 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
Paul Bakker5121ce52009-01-03 21:22:43 +0000705 SK = cty.rk + cty.nr * 4;
706
707 *RK++ = *SK++;
708 *RK++ = *SK++;
709 *RK++ = *SK++;
710 *RK++ = *SK++;
711
712 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
713 {
714 for( j = 0; j < 4; j++, SK++ )
715 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200716 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
717 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
718 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
719 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000720 }
721 }
722
723 *RK++ = *SK++;
724 *RK++ = *SK++;
725 *RK++ = *SK++;
726 *RK++ = *SK++;
727
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200728exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200729 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000730
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200731 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000732}
gabor-mezei-arm95db3012020-10-26 11:35:23 +0100733#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Jaeden Amero9366feb2018-05-29 18:55:17 +0100734
735#if defined(MBEDTLS_CIPHER_MODE_XTS)
736static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
737 unsigned int keybits,
738 const unsigned char **key1,
739 unsigned int *key1bits,
740 const unsigned char **key2,
741 unsigned int *key2bits )
742{
743 const unsigned int half_keybits = keybits / 2;
744 const unsigned int half_keybytes = half_keybits / 8;
745
746 switch( keybits )
747 {
748 case 256: break;
749 case 512: break;
750 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
751 }
752
753 *key1bits = half_keybits;
754 *key2bits = half_keybits;
755 *key1 = &key[0];
756 *key2 = &key[half_keybytes];
757
758 return 0;
759}
760
761int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
762 const unsigned char *key,
763 unsigned int keybits)
764{
Janos Follath24eed8d2019-11-22 13:21:35 +0000765 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100766 const unsigned char *key1, *key2;
767 unsigned int key1bits, key2bits;
768
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100769 AES_VALIDATE_RET( ctx != NULL );
770 AES_VALIDATE_RET( key != NULL );
771
Jaeden Amero9366feb2018-05-29 18:55:17 +0100772 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
773 &key2, &key2bits );
774 if( ret != 0 )
775 return( ret );
776
777 /* Set the tweak key. Always set tweak key for the encryption mode. */
778 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
779 if( ret != 0 )
780 return( ret );
781
782 /* Set crypt key for encryption. */
783 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
784}
785
786int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
787 const unsigned char *key,
788 unsigned int keybits)
789{
Janos Follath24eed8d2019-11-22 13:21:35 +0000790 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100791 const unsigned char *key1, *key2;
792 unsigned int key1bits, key2bits;
793
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100794 AES_VALIDATE_RET( ctx != NULL );
795 AES_VALIDATE_RET( key != NULL );
796
Jaeden Amero9366feb2018-05-29 18:55:17 +0100797 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
798 &key2, &key2bits );
799 if( ret != 0 )
800 return( ret );
801
802 /* Set the tweak key. Always set tweak key for encryption. */
803 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
804 if( ret != 0 )
805 return( ret );
806
807 /* Set crypt key for decryption. */
808 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
809}
810#endif /* MBEDTLS_CIPHER_MODE_XTS */
811
Hanno Becker1eeca412018-10-15 12:01:35 +0100812#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
813 do \
814 { \
815 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
816 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
817 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
818 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
819 \
820 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
821 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
822 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
823 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
824 \
825 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
826 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
827 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
828 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
829 \
830 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
831 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
832 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
833 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
834 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000835
Hanno Becker1eeca412018-10-15 12:01:35 +0100836#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
837 do \
838 { \
839 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
840 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
841 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
842 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
843 \
844 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
845 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
846 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
847 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
848 \
849 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
850 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
851 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
852 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
853 \
854 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
855 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
856 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
857 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
858 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000859
860/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200861 * AES-ECB block encryption
862 */
863#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000864int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
865 const unsigned char input[16],
866 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200867{
868 int i;
Gilles Peskine5197c662020-08-26 17:03:24 +0200869 uint32_t *RK = ctx->rk;
870 struct
871 {
872 uint32_t X[4];
873 uint32_t Y[4];
874 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200875
Gilles Peskine5197c662020-08-26 17:03:24 +0200876 GET_UINT32_LE( t.X[0], input, 0 ); t.X[0] ^= *RK++;
877 GET_UINT32_LE( t.X[1], input, 4 ); t.X[1] ^= *RK++;
878 GET_UINT32_LE( t.X[2], input, 8 ); t.X[2] ^= *RK++;
879 GET_UINT32_LE( t.X[3], input, 12 ); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200880
881 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
882 {
Gilles Peskine5197c662020-08-26 17:03:24 +0200883 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] );
884 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 +0200885 }
886
Gilles Peskine5197c662020-08-26 17:03:24 +0200887 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 +0200888
Gilles Peskine5197c662020-08-26 17:03:24 +0200889 t.X[0] = *RK++ ^ \
890 ( (uint32_t) FSb[ ( t.Y[0] ) & 0xFF ] ) ^
891 ( (uint32_t) FSb[ ( t.Y[1] >> 8 ) & 0xFF ] << 8 ) ^
892 ( (uint32_t) FSb[ ( t.Y[2] >> 16 ) & 0xFF ] << 16 ) ^
893 ( (uint32_t) FSb[ ( t.Y[3] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200894
Gilles Peskine5197c662020-08-26 17:03:24 +0200895 t.X[1] = *RK++ ^ \
896 ( (uint32_t) FSb[ ( t.Y[1] ) & 0xFF ] ) ^
897 ( (uint32_t) FSb[ ( t.Y[2] >> 8 ) & 0xFF ] << 8 ) ^
898 ( (uint32_t) FSb[ ( t.Y[3] >> 16 ) & 0xFF ] << 16 ) ^
899 ( (uint32_t) FSb[ ( t.Y[0] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200900
Gilles Peskine5197c662020-08-26 17:03:24 +0200901 t.X[2] = *RK++ ^ \
902 ( (uint32_t) FSb[ ( t.Y[2] ) & 0xFF ] ) ^
903 ( (uint32_t) FSb[ ( t.Y[3] >> 8 ) & 0xFF ] << 8 ) ^
904 ( (uint32_t) FSb[ ( t.Y[0] >> 16 ) & 0xFF ] << 16 ) ^
905 ( (uint32_t) FSb[ ( t.Y[1] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906
Gilles Peskine5197c662020-08-26 17:03:24 +0200907 t.X[3] = *RK++ ^ \
908 ( (uint32_t) FSb[ ( t.Y[3] ) & 0xFF ] ) ^
909 ( (uint32_t) FSb[ ( t.Y[0] >> 8 ) & 0xFF ] << 8 ) ^
910 ( (uint32_t) FSb[ ( t.Y[1] >> 16 ) & 0xFF ] << 16 ) ^
911 ( (uint32_t) FSb[ ( t.Y[2] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200912
Gilles Peskine5197c662020-08-26 17:03:24 +0200913 PUT_UINT32_LE( t.X[0], output, 0 );
914 PUT_UINT32_LE( t.X[1], output, 4 );
915 PUT_UINT32_LE( t.X[2], output, 8 );
916 PUT_UINT32_LE( t.X[3], output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000917
Gilles Peskine5197c662020-08-26 17:03:24 +0200918 mbedtls_platform_zeroize( &t, sizeof( t ) );
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500919
Andres AGf5bf7182017-03-03 14:09:56 +0000920 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200921}
922#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
923
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100924#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100925void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
926 const unsigned char input[16],
927 unsigned char output[16] )
928{
929 mbedtls_internal_aes_encrypt( ctx, input, output );
930}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100931#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100932
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200933/*
934 * AES-ECB block decryption
935 */
936#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000937int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
938 const unsigned char input[16],
939 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200940{
941 int i;
Gilles Peskine5197c662020-08-26 17:03:24 +0200942 uint32_t *RK = ctx->rk;
943 struct
944 {
945 uint32_t X[4];
946 uint32_t Y[4];
947 } t;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200948
Gilles Peskine5197c662020-08-26 17:03:24 +0200949 GET_UINT32_LE( t.X[0], input, 0 ); t.X[0] ^= *RK++;
950 GET_UINT32_LE( t.X[1], input, 4 ); t.X[1] ^= *RK++;
951 GET_UINT32_LE( t.X[2], input, 8 ); t.X[2] ^= *RK++;
952 GET_UINT32_LE( t.X[3], input, 12 ); t.X[3] ^= *RK++;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200953
954 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
955 {
Gilles Peskine5197c662020-08-26 17:03:24 +0200956 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] );
957 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 +0200958 }
959
Gilles Peskine5197c662020-08-26 17:03:24 +0200960 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 +0200961
Gilles Peskine5197c662020-08-26 17:03:24 +0200962 t.X[0] = *RK++ ^ \
963 ( (uint32_t) RSb[ ( t.Y[0] ) & 0xFF ] ) ^
964 ( (uint32_t) RSb[ ( t.Y[3] >> 8 ) & 0xFF ] << 8 ) ^
965 ( (uint32_t) RSb[ ( t.Y[2] >> 16 ) & 0xFF ] << 16 ) ^
966 ( (uint32_t) RSb[ ( t.Y[1] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200967
Gilles Peskine5197c662020-08-26 17:03:24 +0200968 t.X[1] = *RK++ ^ \
969 ( (uint32_t) RSb[ ( t.Y[1] ) & 0xFF ] ) ^
970 ( (uint32_t) RSb[ ( t.Y[0] >> 8 ) & 0xFF ] << 8 ) ^
971 ( (uint32_t) RSb[ ( t.Y[3] >> 16 ) & 0xFF ] << 16 ) ^
972 ( (uint32_t) RSb[ ( t.Y[2] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200973
Gilles Peskine5197c662020-08-26 17:03:24 +0200974 t.X[2] = *RK++ ^ \
975 ( (uint32_t) RSb[ ( t.Y[2] ) & 0xFF ] ) ^
976 ( (uint32_t) RSb[ ( t.Y[1] >> 8 ) & 0xFF ] << 8 ) ^
977 ( (uint32_t) RSb[ ( t.Y[0] >> 16 ) & 0xFF ] << 16 ) ^
978 ( (uint32_t) RSb[ ( t.Y[3] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200979
Gilles Peskine5197c662020-08-26 17:03:24 +0200980 t.X[3] = *RK++ ^ \
981 ( (uint32_t) RSb[ ( t.Y[3] ) & 0xFF ] ) ^
982 ( (uint32_t) RSb[ ( t.Y[2] >> 8 ) & 0xFF ] << 8 ) ^
983 ( (uint32_t) RSb[ ( t.Y[1] >> 16 ) & 0xFF ] << 16 ) ^
984 ( (uint32_t) RSb[ ( t.Y[0] >> 24 ) & 0xFF ] << 24 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200985
Gilles Peskine5197c662020-08-26 17:03:24 +0200986 PUT_UINT32_LE( t.X[0], output, 0 );
987 PUT_UINT32_LE( t.X[1], output, 4 );
988 PUT_UINT32_LE( t.X[2], output, 8 );
989 PUT_UINT32_LE( t.X[3], output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000990
Gilles Peskine5197c662020-08-26 17:03:24 +0200991 mbedtls_platform_zeroize( &t, sizeof( t ) );
Andrzej Kurek96ae5cd2019-11-12 03:05:51 -0500992
Andres AGf5bf7182017-03-03 14:09:56 +0000993 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200994}
995#endif /* !MBEDTLS_AES_DECRYPT_ALT */
996
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100997#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100998void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
999 const unsigned char input[16],
1000 unsigned char output[16] )
1001{
1002 mbedtls_internal_aes_decrypt( ctx, input, output );
1003}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001004#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001005
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001006/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001007 * AES-ECB block encryption/decryption
1008 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001010 int mode,
1011 const unsigned char input[16],
1012 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001013{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001014 AES_VALIDATE_RET( ctx != NULL );
1015 AES_VALIDATE_RET( input != NULL );
1016 AES_VALIDATE_RET( output != NULL );
1017 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1018 mode == MBEDTLS_AES_DECRYPT );
1019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001021 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001023#endif
1024
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001025#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001026 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001027 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001029 return( 0 );
1030
1031 // If padlock data misaligned, we just fall back to
1032 // unaccelerated mode
1033 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001034 }
1035#endif
1036
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001037 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001038 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001039 else
Andres AGf5bf7182017-03-03 14:09:56 +00001040 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001041}
1042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001044/*
1045 * AES-CBC buffer encryption/decryption
1046 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001048 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001049 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001050 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001051 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001052 unsigned char *output )
1053{
1054 int i;
1055 unsigned char temp[16];
1056
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001057 AES_VALIDATE_RET( ctx != NULL );
1058 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1059 mode == MBEDTLS_AES_DECRYPT );
1060 AES_VALIDATE_RET( iv != NULL );
1061 AES_VALIDATE_RET( input != NULL );
1062 AES_VALIDATE_RET( output != NULL );
1063
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001064 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001066
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001068 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001069 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001070 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001071 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001072
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001073 // If padlock data misaligned, we just fall back to
1074 // unaccelerated mode
1075 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001076 }
1077#endif
1078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001080 {
1081 while( length > 0 )
1082 {
1083 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001085
1086 for( i = 0; i < 16; i++ )
1087 output[i] = (unsigned char)( output[i] ^ iv[i] );
1088
1089 memcpy( iv, temp, 16 );
1090
1091 input += 16;
1092 output += 16;
1093 length -= 16;
1094 }
1095 }
1096 else
1097 {
1098 while( length > 0 )
1099 {
1100 for( i = 0; i < 16; i++ )
1101 output[i] = (unsigned char)( input[i] ^ iv[i] );
1102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001103 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001104 memcpy( iv, output, 16 );
1105
1106 input += 16;
1107 output += 16;
1108 length -= 16;
1109 }
1110 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001111
1112 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001113}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001115
Aorimn5f778012016-06-09 23:22:58 +02001116#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001117
1118/* Endianess with 64 bits values */
1119#ifndef GET_UINT64_LE
1120#define GET_UINT64_LE(n,b,i) \
1121{ \
1122 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1123 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1124 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1125 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1126 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1127 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1128 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1129 | ( (uint64_t) (b)[(i) ] ); \
1130}
1131#endif
1132
1133#ifndef PUT_UINT64_LE
1134#define PUT_UINT64_LE(n,b,i) \
1135{ \
1136 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1137 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1138 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1139 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1140 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1141 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1142 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1143 (b)[(i) ] = (unsigned char) ( (n) ); \
1144}
1145#endif
1146
1147typedef unsigned char mbedtls_be128[16];
1148
1149/*
1150 * GF(2^128) multiplication function
1151 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001152 * This function multiplies a field element by x in the polynomial field
1153 * representation. It uses 64-bit word operations to gain speed but compensates
1154 * for machine endianess and hence works correctly on both big and little
1155 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001156 */
1157static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001158 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001159{
1160 uint64_t a, b, ra, rb;
1161
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001162 GET_UINT64_LE( a, x, 0 );
1163 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001164
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001165 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1166 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001167
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001168 PUT_UINT64_LE( ra, r, 0 );
1169 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001170}
1171
Aorimn5f778012016-06-09 23:22:58 +02001172/*
1173 * AES-XTS buffer encryption/decryption
1174 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001175int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1176 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001177 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001178 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001179 const unsigned char *input,
1180 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001181{
Janos Follath24eed8d2019-11-22 13:21:35 +00001182 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jaeden Amerod82cd862018-04-28 15:02:45 +01001183 size_t blocks = length / 16;
1184 size_t leftover = length % 16;
1185 unsigned char tweak[16];
1186 unsigned char prev_tweak[16];
1187 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001188
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001189 AES_VALIDATE_RET( ctx != NULL );
1190 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1191 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001192 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001193 AES_VALIDATE_RET( input != NULL );
1194 AES_VALIDATE_RET( output != NULL );
1195
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001196 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001197 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001198 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001199
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001200 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001201 if( length > ( 1 << 20 ) * 16 )
1202 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001203
Jaeden Amerod82cd862018-04-28 15:02:45 +01001204 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001205 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1206 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001207 if( ret != 0 )
1208 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001209
Jaeden Amerod82cd862018-04-28 15:02:45 +01001210 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001211 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001212 size_t i;
1213
1214 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1215 {
1216 /* We are on the last block in a decrypt operation that has
1217 * leftover bytes, so we need to use the next tweak for this block,
1218 * and this tweak for the lefover bytes. Save the current tweak for
1219 * the leftovers and then update the current tweak for use on this,
1220 * the last full block. */
1221 memcpy( prev_tweak, tweak, sizeof( tweak ) );
1222 mbedtls_gf128mul_x_ble( tweak, tweak );
1223 }
1224
1225 for( i = 0; i < 16; i++ )
1226 tmp[i] = input[i] ^ tweak[i];
1227
1228 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1229 if( ret != 0 )
1230 return( ret );
1231
1232 for( i = 0; i < 16; i++ )
1233 output[i] = tmp[i] ^ tweak[i];
1234
1235 /* Update the tweak for the next block. */
1236 mbedtls_gf128mul_x_ble( tweak, tweak );
1237
1238 output += 16;
1239 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001240 }
1241
Jaeden Amerod82cd862018-04-28 15:02:45 +01001242 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001243 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001244 /* If we are on the leftover bytes in a decrypt operation, we need to
1245 * use the previous tweak for these bytes (as saved in prev_tweak). */
1246 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001247
Jaeden Amerod82cd862018-04-28 15:02:45 +01001248 /* We are now on the final part of the data unit, which doesn't divide
1249 * evenly by 16. It's time for ciphertext stealing. */
1250 size_t i;
1251 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001252
Jaeden Amerod82cd862018-04-28 15:02:45 +01001253 /* Copy ciphertext bytes from the previous block to our output for each
1254 * byte of cyphertext we won't steal. At the same time, copy the
1255 * remainder of the input for this final round (since the loop bounds
1256 * are the same). */
1257 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001258 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001259 output[i] = prev_output[i];
1260 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001261 }
Aorimn5f778012016-06-09 23:22:58 +02001262
Jaeden Amerod82cd862018-04-28 15:02:45 +01001263 /* Copy ciphertext bytes from the previous block for input in this
1264 * round. */
1265 for( ; i < 16; i++ )
1266 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001267
Jaeden Amerod82cd862018-04-28 15:02:45 +01001268 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1269 if( ret != 0 )
1270 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001271
Jaeden Amerod82cd862018-04-28 15:02:45 +01001272 /* Write the result back to the previous block, overriding the previous
1273 * output we copied. */
1274 for( i = 0; i < 16; i++ )
1275 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001276 }
1277
1278 return( 0 );
1279}
1280#endif /* MBEDTLS_CIPHER_MODE_XTS */
1281
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001282#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001283/*
1284 * AES-CFB128 buffer encryption/decryption
1285 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001286int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001287 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001288 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001289 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001290 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001291 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001292 unsigned char *output )
1293{
Paul Bakker27fdf462011-06-09 13:55:13 +00001294 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001295 size_t n;
1296
1297 AES_VALIDATE_RET( ctx != NULL );
1298 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1299 mode == MBEDTLS_AES_DECRYPT );
1300 AES_VALIDATE_RET( iv_off != NULL );
1301 AES_VALIDATE_RET( iv != NULL );
1302 AES_VALIDATE_RET( input != NULL );
1303 AES_VALIDATE_RET( output != NULL );
1304
1305 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001306
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001307 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001308 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001311 {
1312 while( length-- )
1313 {
1314 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001315 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001316
1317 c = *input++;
1318 *output++ = (unsigned char)( c ^ iv[n] );
1319 iv[n] = (unsigned char) c;
1320
Paul Bakker66d5d072014-06-17 16:39:18 +02001321 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001322 }
1323 }
1324 else
1325 {
1326 while( length-- )
1327 {
1328 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001330
1331 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1332
Paul Bakker66d5d072014-06-17 16:39:18 +02001333 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001334 }
1335 }
1336
1337 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001338
1339 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001340}
Paul Bakker556efba2014-01-24 15:38:12 +01001341
1342/*
1343 * AES-CFB8 buffer encryption/decryption
1344 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001346 int mode,
1347 size_t length,
1348 unsigned char iv[16],
1349 const unsigned char *input,
1350 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001351{
1352 unsigned char c;
1353 unsigned char ov[17];
1354
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001355 AES_VALIDATE_RET( ctx != NULL );
1356 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1357 mode == MBEDTLS_AES_DECRYPT );
1358 AES_VALIDATE_RET( iv != NULL );
1359 AES_VALIDATE_RET( input != NULL );
1360 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001361 while( length-- )
1362 {
Paul Bakker66d5d072014-06-17 16:39:18 +02001363 memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001364 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001366 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001367 ov[16] = *input;
1368
1369 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001371 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001372 ov[16] = c;
1373
Paul Bakker66d5d072014-06-17 16:39:18 +02001374 memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001375 }
1376
1377 return( 0 );
1378}
Simon Butcher76a5b222018-04-22 22:57:27 +01001379#endif /* MBEDTLS_CIPHER_MODE_CFB */
1380
1381#if defined(MBEDTLS_CIPHER_MODE_OFB)
1382/*
1383 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1384 */
1385int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001386 size_t length,
1387 size_t *iv_off,
1388 unsigned char iv[16],
1389 const unsigned char *input,
1390 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001391{
Simon Butcherad4e4932018-04-29 00:43:47 +01001392 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001393 size_t n;
1394
1395 AES_VALIDATE_RET( ctx != NULL );
1396 AES_VALIDATE_RET( iv_off != NULL );
1397 AES_VALIDATE_RET( iv != NULL );
1398 AES_VALIDATE_RET( input != NULL );
1399 AES_VALIDATE_RET( output != NULL );
1400
1401 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001402
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001403 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001404 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1405
Simon Butcher76a5b222018-04-22 22:57:27 +01001406 while( length-- )
1407 {
1408 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001409 {
1410 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1411 if( ret != 0 )
1412 goto exit;
1413 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001414 *output++ = *input++ ^ iv[n];
1415
1416 n = ( n + 1 ) & 0x0F;
1417 }
1418
1419 *iv_off = n;
1420
Simon Butcherad4e4932018-04-29 00:43:47 +01001421exit:
1422 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001423}
1424#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001426#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001427/*
1428 * AES-CTR buffer encryption/decryption
1429 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001431 size_t length,
1432 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001433 unsigned char nonce_counter[16],
1434 unsigned char stream_block[16],
1435 const unsigned char *input,
1436 unsigned char *output )
1437{
Paul Bakker369e14b2012-04-18 14:16:09 +00001438 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001439 size_t n;
1440
1441 AES_VALIDATE_RET( ctx != NULL );
1442 AES_VALIDATE_RET( nc_off != NULL );
1443 AES_VALIDATE_RET( nonce_counter != NULL );
1444 AES_VALIDATE_RET( stream_block != NULL );
1445 AES_VALIDATE_RET( input != NULL );
1446 AES_VALIDATE_RET( output != NULL );
1447
1448 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001449
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001450 if ( n > 0x0F )
1451 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1452
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001453 while( length-- )
1454 {
1455 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001456 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001457
Paul Bakker369e14b2012-04-18 14:16:09 +00001458 for( i = 16; i > 0; i-- )
1459 if( ++nonce_counter[i - 1] != 0 )
1460 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001461 }
1462 c = *input++;
1463 *output++ = (unsigned char)( c ^ stream_block[n] );
1464
Paul Bakker66d5d072014-06-17 16:39:18 +02001465 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001466 }
1467
1468 *nc_off = n;
1469
1470 return( 0 );
1471}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001472#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001473
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001474#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001475
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001477/*
1478 * AES test vectors from:
1479 *
1480 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1481 */
1482static const unsigned char aes_test_ecb_dec[3][16] =
1483{
1484 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1485 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1486 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1487 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1488 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1489 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1490};
1491
1492static const unsigned char aes_test_ecb_enc[3][16] =
1493{
1494 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1495 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1496 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1497 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1498 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1499 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1500};
1501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001502#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001503static const unsigned char aes_test_cbc_dec[3][16] =
1504{
1505 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1506 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1507 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1508 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1509 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1510 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1511};
1512
1513static const unsigned char aes_test_cbc_enc[3][16] =
1514{
1515 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1516 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1517 { 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 }
1521};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001525/*
1526 * AES-CFB128 test vectors from:
1527 *
1528 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1529 */
1530static const unsigned char aes_test_cfb128_key[3][32] =
1531{
1532 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1533 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1534 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1535 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1536 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1537 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1538 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1539 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1540 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1541};
1542
1543static const unsigned char aes_test_cfb128_iv[16] =
1544{
1545 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1546 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1547};
1548
1549static const unsigned char aes_test_cfb128_pt[64] =
1550{
1551 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1552 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1553 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1554 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1555 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1556 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1557 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1558 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1559};
1560
1561static const unsigned char aes_test_cfb128_ct[3][64] =
1562{
1563 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1564 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1565 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1566 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1567 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1568 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1569 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1570 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1571 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1572 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1573 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1574 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1575 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1576 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1577 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1578 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1579 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1580 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1581 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1582 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1583 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1584 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1585 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1586 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1587};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001588#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001589
Simon Butcherad4e4932018-04-29 00:43:47 +01001590#if defined(MBEDTLS_CIPHER_MODE_OFB)
1591/*
1592 * AES-OFB test vectors from:
1593 *
Simon Butcher5db13622018-06-04 22:11:25 +01001594 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001595 */
1596static const unsigned char aes_test_ofb_key[3][32] =
1597{
1598 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1599 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1600 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1601 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1602 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1603 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1604 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1605 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1606 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1607};
1608
1609static const unsigned char aes_test_ofb_iv[16] =
1610{
1611 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1612 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1613};
1614
1615static const unsigned char aes_test_ofb_pt[64] =
1616{
1617 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1618 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1619 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1620 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1621 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1622 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1623 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1624 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1625};
1626
1627static const unsigned char aes_test_ofb_ct[3][64] =
1628{
1629 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1630 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1631 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1632 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1633 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1634 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1635 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1636 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1637 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1638 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1639 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1640 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1641 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1642 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1643 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1644 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1645 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1646 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1647 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1648 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1649 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1650 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1651 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1652 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1653};
1654#endif /* MBEDTLS_CIPHER_MODE_OFB */
1655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001657/*
1658 * AES-CTR test vectors from:
1659 *
1660 * http://www.faqs.org/rfcs/rfc3686.html
1661 */
1662
1663static const unsigned char aes_test_ctr_key[3][16] =
1664{
1665 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1666 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1667 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1668 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1669 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1670 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1671};
1672
1673static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1674{
1675 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1677 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1678 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1679 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1680 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1681};
1682
1683static const unsigned char aes_test_ctr_pt[3][48] =
1684{
1685 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1686 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1687
1688 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1689 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1690 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1691 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1692
1693 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1694 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1695 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1696 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1697 0x20, 0x21, 0x22, 0x23 }
1698};
1699
1700static const unsigned char aes_test_ctr_ct[3][48] =
1701{
1702 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1703 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1704 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1705 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1706 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1707 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1708 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1709 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1710 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1711 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1712 0x25, 0xB2, 0x07, 0x2F }
1713};
1714
1715static const int aes_test_ctr_len[3] =
1716 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001718
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001719#if defined(MBEDTLS_CIPHER_MODE_XTS)
1720/*
1721 * AES-XTS test vectors from:
1722 *
1723 * IEEE P1619/D16 Annex B
1724 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1725 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1726 */
1727static const unsigned char aes_test_xts_key[][32] =
1728{
1729 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1733 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1734 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1735 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1736 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1737 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1738 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1739 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1740 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1741};
1742
1743static const unsigned char aes_test_xts_pt32[][32] =
1744{
1745 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1749 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1750 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1751 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1752 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1753 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1754 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1755 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1756 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1757};
1758
1759static const unsigned char aes_test_xts_ct32[][32] =
1760{
1761 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1762 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1763 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1764 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1765 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1766 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1767 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1768 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1769 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1770 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1771 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1772 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1773};
1774
1775static const unsigned char aes_test_xts_data_unit[][16] =
1776{
1777 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1779 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1781 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1783};
1784
1785#endif /* MBEDTLS_CIPHER_MODE_XTS */
1786
Paul Bakker5121ce52009-01-03 21:22:43 +00001787/*
1788 * Checkup routine
1789 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001790int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00001791{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001792 int ret = 0, i, j, u, mode;
1793 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001794 unsigned char key[32];
1795 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001796 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001797#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001798 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001799#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001800#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001801 unsigned char prv[16];
1802#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001803#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1804 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001805 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001806#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001807#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001808 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001809#endif
1810#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001811 unsigned char nonce_counter[16];
1812 unsigned char stream_block[16];
1813#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001814 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001815
1816 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001817 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00001818
1819 /*
1820 * ECB mode
1821 */
1822 for( i = 0; i < 6; i++ )
1823 {
1824 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001825 keybits = 128 + u * 64;
1826 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001827
1828 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +02001829 mbedtls_printf( " AES-ECB-%3u (%s): ", keybits,
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001830 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001831
1832 memset( buf, 0, 16 );
1833
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001834 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001835 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001836 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1837 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001838 }
1839 else
1840 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001841 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1842 aes_tests = aes_test_ecb_enc[u];
1843 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001844
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001845 /*
1846 * AES-192 is an optional feature that may be unavailable when
1847 * there is an alternative underlying implementation i.e. when
1848 * MBEDTLS_AES_ALT is defined.
1849 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001850 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001851 {
1852 mbedtls_printf( "skipped\n" );
1853 continue;
1854 }
1855 else if( ret != 0 )
1856 {
1857 goto exit;
1858 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001859
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001860 for( j = 0; j < 10000; j++ )
1861 {
1862 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
1863 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001864 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001865 }
1866
1867 if( memcmp( buf, aes_tests, 16 ) != 0 )
1868 {
1869 ret = 1;
1870 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001871 }
1872
1873 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001874 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001875 }
1876
1877 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001878 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001880#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001881 /*
1882 * CBC mode
1883 */
1884 for( i = 0; i < 6; i++ )
1885 {
1886 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001887 keybits = 128 + u * 64;
1888 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001889
1890 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +02001891 mbedtls_printf( " AES-CBC-%3u (%s): ", keybits,
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001892 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001893
1894 memset( iv , 0, 16 );
1895 memset( prv, 0, 16 );
1896 memset( buf, 0, 16 );
1897
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001898 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001899 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001900 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1901 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001902 }
1903 else
1904 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001905 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1906 aes_tests = aes_test_cbc_enc[u];
1907 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001908
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001909 /*
1910 * AES-192 is an optional feature that may be unavailable when
1911 * there is an alternative underlying implementation i.e. when
1912 * MBEDTLS_AES_ALT is defined.
1913 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001914 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001915 {
1916 mbedtls_printf( "skipped\n" );
1917 continue;
1918 }
1919 else if( ret != 0 )
1920 {
1921 goto exit;
1922 }
1923
1924 for( j = 0; j < 10000; j++ )
1925 {
1926 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001927 {
1928 unsigned char tmp[16];
1929
Paul Bakker5121ce52009-01-03 21:22:43 +00001930 memcpy( tmp, prv, 16 );
1931 memcpy( prv, buf, 16 );
1932 memcpy( buf, tmp, 16 );
1933 }
1934
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001935 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
1936 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001937 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001938
1939 }
1940
1941 if( memcmp( buf, aes_tests, 16 ) != 0 )
1942 {
1943 ret = 1;
1944 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001945 }
1946
1947 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001949 }
1950
1951 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001952 mbedtls_printf( "\n" );
1953#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001954
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001955#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001956 /*
1957 * CFB128 mode
1958 */
1959 for( i = 0; i < 6; i++ )
1960 {
1961 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001962 keybits = 128 + u * 64;
1963 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001964
1965 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +02001966 mbedtls_printf( " AES-CFB128-%3u (%s): ", keybits,
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001967 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001968
1969 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001970 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001971
1972 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001973 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001974 /*
1975 * AES-192 is an optional feature that may be unavailable when
1976 * there is an alternative underlying implementation i.e. when
1977 * MBEDTLS_AES_ALT is defined.
1978 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001979 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001980 {
1981 mbedtls_printf( "skipped\n" );
1982 continue;
1983 }
1984 else if( ret != 0 )
1985 {
1986 goto exit;
1987 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001988
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001989 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001990 {
1991 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001992 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001993 }
1994 else
1995 {
1996 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001997 aes_tests = aes_test_cfb128_ct[u];
1998 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001999
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002000 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2001 if( ret != 0 )
2002 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002003
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002004 if( memcmp( buf, aes_tests, 64 ) != 0 )
2005 {
2006 ret = 1;
2007 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002008 }
2009
2010 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002011 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002012 }
2013
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002014 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002015 mbedtls_printf( "\n" );
2016#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002017
Simon Butcherad4e4932018-04-29 00:43:47 +01002018#if defined(MBEDTLS_CIPHER_MODE_OFB)
2019 /*
2020 * OFB mode
2021 */
2022 for( i = 0; i < 6; i++ )
2023 {
2024 u = i >> 1;
2025 keybits = 128 + u * 64;
2026 mode = i & 1;
2027
2028 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +02002029 mbedtls_printf( " AES-OFB-%3u (%s): ", keybits,
Simon Butcherad4e4932018-04-29 00:43:47 +01002030 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2031
2032 memcpy( iv, aes_test_ofb_iv, 16 );
2033 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2034
2035 offset = 0;
2036 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2037 /*
2038 * AES-192 is an optional feature that may be unavailable when
2039 * there is an alternative underlying implementation i.e. when
2040 * MBEDTLS_AES_ALT is defined.
2041 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002042 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002043 {
2044 mbedtls_printf( "skipped\n" );
2045 continue;
2046 }
2047 else if( ret != 0 )
2048 {
2049 goto exit;
2050 }
2051
2052 if( mode == MBEDTLS_AES_DECRYPT )
2053 {
2054 memcpy( buf, aes_test_ofb_ct[u], 64 );
2055 aes_tests = aes_test_ofb_pt;
2056 }
2057 else
2058 {
2059 memcpy( buf, aes_test_ofb_pt, 64 );
2060 aes_tests = aes_test_ofb_ct[u];
2061 }
2062
2063 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2064 if( ret != 0 )
2065 goto exit;
2066
2067 if( memcmp( buf, aes_tests, 64 ) != 0 )
2068 {
2069 ret = 1;
2070 goto exit;
2071 }
2072
2073 if( verbose != 0 )
2074 mbedtls_printf( "passed\n" );
2075 }
2076
2077 if( verbose != 0 )
2078 mbedtls_printf( "\n" );
2079#endif /* MBEDTLS_CIPHER_MODE_OFB */
2080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002081#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002082 /*
2083 * CTR mode
2084 */
2085 for( i = 0; i < 6; i++ )
2086 {
2087 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002088 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002089
2090 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002091 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002092 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002093
2094 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2095 memcpy( key, aes_test_ctr_key[u], 16 );
2096
2097 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002098 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2099 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002100
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002101 len = aes_test_ctr_len[u];
2102
2103 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002104 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002106 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002107 }
2108 else
2109 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002110 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002111 aes_tests = aes_test_ctr_ct[u];
2112 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002113
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002114 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2115 stream_block, buf, buf );
2116 if( ret != 0 )
2117 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002118
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002119 if( memcmp( buf, aes_tests, len ) != 0 )
2120 {
2121 ret = 1;
2122 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002123 }
2124
2125 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002126 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002127 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002128
2129 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002130 mbedtls_printf( "\n" );
2131#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002132
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002133#if defined(MBEDTLS_CIPHER_MODE_XTS)
2134 {
2135 static const int num_tests =
2136 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2137 mbedtls_aes_xts_context ctx_xts;
2138
2139 /*
2140 * XTS mode
2141 */
2142 mbedtls_aes_xts_init( &ctx_xts );
2143
2144 for( i = 0; i < num_tests << 1; i++ )
2145 {
2146 const unsigned char *data_unit;
2147 u = i >> 1;
2148 mode = i & 1;
2149
2150 if( verbose != 0 )
2151 mbedtls_printf( " AES-XTS-128 (%s): ",
2152 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2153
2154 memset( key, 0, sizeof( key ) );
2155 memcpy( key, aes_test_xts_key[u], 32 );
2156 data_unit = aes_test_xts_data_unit[u];
2157
2158 len = sizeof( *aes_test_xts_ct32 );
2159
2160 if( mode == MBEDTLS_AES_DECRYPT )
2161 {
2162 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2163 if( ret != 0)
2164 goto exit;
2165 memcpy( buf, aes_test_xts_ct32[u], len );
2166 aes_tests = aes_test_xts_pt32[u];
2167 }
2168 else
2169 {
2170 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2171 if( ret != 0)
2172 goto exit;
2173 memcpy( buf, aes_test_xts_pt32[u], len );
2174 aes_tests = aes_test_xts_ct32[u];
2175 }
2176
2177
2178 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2179 buf, buf );
2180 if( ret != 0 )
2181 goto exit;
2182
2183 if( memcmp( buf, aes_tests, len ) != 0 )
2184 {
2185 ret = 1;
2186 goto exit;
2187 }
2188
2189 if( verbose != 0 )
2190 mbedtls_printf( "passed\n" );
2191 }
2192
2193 if( verbose != 0 )
2194 mbedtls_printf( "\n" );
2195
2196 mbedtls_aes_xts_free( &ctx_xts );
2197 }
2198#endif /* MBEDTLS_CIPHER_MODE_XTS */
2199
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002200 ret = 0;
2201
2202exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002203 if( ret != 0 && verbose != 0 )
2204 mbedtls_printf( "failed\n" );
2205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002206 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002207
2208 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002209}
2210
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002211#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002213#endif /* MBEDTLS_AES_C */