blob: d6a6b0097f1c9ca48a4b790a88d9f7343c8c7d20 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
23 *
24 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
25 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Rich Evans00ab4702015-02-06 13:43:58 +000036#include <string.h>
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030039#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050040#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Andrzej Kurekfba59212020-08-07 21:02:25 -040048#if defined(MBEDTLS_CRC_C) && defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
49#include "mbedtls/crc.h"
50#endif
51
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if defined(MBEDTLS_SELF_TEST)
53#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000054#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010055#else
Rich Evans00ab4702015-02-06 13:43:58 +000056#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#define mbedtls_printf printf
58#endif /* MBEDTLS_PLATFORM_C */
59#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020062
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010063/* Parameter validation macros based on platform_util.h */
64#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010065 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010066#define AES_VALIDATE( cond ) \
67 MBEDTLS_INTERNAL_VALIDATE( cond )
68
Paul Bakker5121ce52009-01-03 21:22:43 +000069/*
70 * 32-bit integer manipulation macros (little endian)
71 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000072#ifndef GET_UINT32_LE
73#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000074{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000075 (n) = ( (uint32_t) (b)[(i) ] ) \
76 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
77 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
78 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000079}
80#endif
81
Paul Bakker5c2364c2012-10-01 14:41:15 +000082#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000083#define PUT_UINT32_LE(n,b,i) \
84{ \
85 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
86 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
87 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
88 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000089}
90#endif
91
Arto Kinnunen172836a2019-11-28 13:34:13 +020092/*
93 * Data structure for AES round data
94 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020095typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020096 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020097 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020098} aes_r_data_t;
99
100#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200101/* Number of additional AES dummy rounds added for SCA countermeasures */
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200102#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +0200103#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105#if defined(MBEDTLS_PADLOCK_C) && \
106 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000107static int aes_padlock_ace = -1;
108#endif
109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000111/*
112 * Forward S-box
113 */
114static const unsigned char FSb[256] =
115{
116 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
117 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
118 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
119 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
120 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
121 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
122 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
123 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
124 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
125 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
126 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
127 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
128 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
129 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
130 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
131 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
132 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
133 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
134 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
135 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
136 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
137 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
138 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
139 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
140 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
141 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
142 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
143 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
144 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
145 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
146 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
147 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
148};
149
150/*
151 * Forward tables
152 */
153#define FT \
154\
155 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
156 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
157 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
158 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
159 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
160 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
161 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
162 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
163 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
164 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
165 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
166 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
167 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
168 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
169 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
170 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
171 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
172 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
173 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
174 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
175 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
176 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
177 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
178 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
179 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
180 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
181 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
182 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
183 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
184 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
185 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
186 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
187 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
188 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
189 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
190 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
191 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
192 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
193 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
194 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
195 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
196 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
197 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
198 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
199 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
200 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
201 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
202 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
203 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
204 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
205 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
206 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
207 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
208 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
209 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
210 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
211 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
212 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
213 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
214 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
215 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
216 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
217 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
218 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
219
220#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000221static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000222#undef V
223
Hanno Beckerad049a92017-06-19 16:31:54 +0100224#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200225
Paul Bakker5121ce52009-01-03 21:22:43 +0000226#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000227static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000228#undef V
229
230#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000231static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000232#undef V
233
234#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000235static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000236#undef V
237
Hanno Becker177d3cf2017-06-07 15:52:48 +0100238#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200239
Paul Bakker5121ce52009-01-03 21:22:43 +0000240#undef FT
241
Arto Kinnunen14804442019-10-16 13:43:59 +0300242#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000243/*
244 * Reverse S-box
245 */
246static const unsigned char RSb[256] =
247{
248 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
249 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
250 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
251 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
252 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
253 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
254 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
255 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
256 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
257 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
258 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
259 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
260 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
261 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
262 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
263 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
264 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
265 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
266 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
267 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
268 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
269 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
270 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
271 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
272 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
273 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
274 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
275 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
276 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
277 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
278 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
279 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
280};
Arto Kinnunen14804442019-10-16 13:43:59 +0300281#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000282
283/*
284 * Reverse tables
285 */
286#define RT \
287\
288 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
289 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
290 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
291 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
292 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
293 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
294 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
295 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
296 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
297 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
298 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
299 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
300 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
301 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
302 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
303 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
304 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
305 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
306 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
307 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
308 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
309 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
310 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
311 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
312 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
313 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
314 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
315 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
316 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
317 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
318 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
319 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
320 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
321 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
322 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
323 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
324 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
325 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
326 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
327 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
328 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
329 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
330 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
331 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
332 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
333 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
334 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
335 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
336 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
337 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
338 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
339 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
340 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
341 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
342 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
343 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
344 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
345 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
346 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
347 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
348 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
349 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
350 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
351 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
352
Arto Kinnunen14804442019-10-16 13:43:59 +0300353#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000354#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000355static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000356#undef V
357
Hanno Beckerad049a92017-06-19 16:31:54 +0100358#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200359
Paul Bakker5121ce52009-01-03 21:22:43 +0000360#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000362#undef V
363
364#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000365static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000366#undef V
367
368#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000369static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000370#undef V
371
Hanno Becker177d3cf2017-06-07 15:52:48 +0100372#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300373#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200374
Paul Bakker5121ce52009-01-03 21:22:43 +0000375#undef RT
376
377/*
378 * Round constants
379 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000380static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000381{
382 0x00000001, 0x00000002, 0x00000004, 0x00000008,
383 0x00000010, 0x00000020, 0x00000040, 0x00000080,
384 0x0000001B, 0x00000036
385};
386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
389/*
390 * Forward S-box & tables
391 */
392static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200393static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100394#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200395static uint32_t FT1[256];
396static uint32_t FT2[256];
397static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100398#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000399
400/*
401 * Reverse S-box & tables
402 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300403#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000404static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000405static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100406#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000407static uint32_t RT1[256];
408static uint32_t RT2[256];
409static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100410#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300411#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000412
413/*
414 * Round constants
415 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000416static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
418/*
419 * Tables generation code
420 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100421#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
422#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100423#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000424
425static int aes_init_done = 0;
426
427static void aes_gen_tables( void )
428{
429 int i, x, y, z;
430 int pow[256];
431 int log[256];
432
433 /*
434 * compute pow and log tables over GF(2^8)
435 */
436 for( i = 0, x = 1; i < 256; i++ )
437 {
438 pow[i] = x;
439 log[x] = i;
440 x = ( x ^ XTIME( x ) ) & 0xFF;
441 }
442
443 /*
444 * calculate the round constants
445 */
446 for( i = 0, x = 1; i < 10; i++ )
447 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000448 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000449 x = XTIME( x ) & 0xFF;
450 }
451
452 /*
453 * generate the forward and reverse S-boxes
454 */
455 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300456#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000457 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300458#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
460 for( i = 1; i < 256; i++ )
461 {
462 x = pow[255 - log[i]];
463
Paul Bakker66d5d072014-06-17 16:39:18 +0200464 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
465 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
466 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
467 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 x ^= y ^ 0x63;
469
470 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300471#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000472 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300473#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000474 }
475
476 /*
477 * generate the forward and reverse tables
478 */
479 for( i = 0; i < 256; i++ )
480 {
481 x = FSb[i];
482 y = XTIME( x ) & 0xFF;
483 z = ( y ^ x ) & 0xFF;
484
Paul Bakker5c2364c2012-10-01 14:41:15 +0000485 FT0[i] = ( (uint32_t) y ) ^
486 ( (uint32_t) x << 8 ) ^
487 ( (uint32_t) x << 16 ) ^
488 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000489
Hanno Beckerad049a92017-06-19 16:31:54 +0100490#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000491 FT1[i] = ROTL8( FT0[i] );
492 FT2[i] = ROTL8( FT1[i] );
493 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100494#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000495
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300496#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000497 x = RSb[i];
498
Paul Bakker5c2364c2012-10-01 14:41:15 +0000499 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
500 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
501 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
502 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000503
Hanno Beckerad049a92017-06-19 16:31:54 +0100504#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000505 RT1[i] = ROTL8( RT0[i] );
506 RT2[i] = ROTL8( RT1[i] );
507 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100508#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300509#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000510 }
511}
512
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200513#undef ROTL8
514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000516
Arto Kinnunen172836a2019-11-28 13:34:13 +0200517/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200518 * Randomize positions for AES SCA countermeasures if AES countermeasures are
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200519 * enabled. If the countermeasures are not enabled then we fill the given table
520 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200521 *
522 * Dummy rounds are added as follows:
523 * 1. One dummy round added to the initial round key addition (executed in
524 * random order).
525 * 2. Random number of dummy rounds added as first and/or last AES calculation
526 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
527 *
528 * Description of the bytes in the table are as follows:
529 * - 2 bytes for initial round key addition
530 * - remaining bytes for AES calculation with real or dummy data
531 *
532 * Each byte indicates one AES calculation round:
533 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
534 * -bit 2 = offset for even/odd rounds
535 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200536 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200537 * Return Number of additional AES rounds
538 *
539 * Example of the control bytes:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200540 * R = real data in actual AES calculation round
541 * Ri = Real data in initial round key addition phase
542 * F = fake data in actual AES calculation round
543 * Fi = fake data in initial round key addition phase
544 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200545 * 1. No countermeasures enabled and AES-128, only real data (R) used:
546 * | Ri | R | R | R | R | R | R | R | R | R | R |
547 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200548 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200549 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200550 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
551 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200552 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200553#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200554static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200555{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200556 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200557
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200558 mbedtls_platform_memset( tbl, 0, tbl_len );
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400559 // get random from 0x0fff
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200560 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561
562 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200563 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200564 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200565 tbl[i++] = 0x10; // dummy data
566 tbl[i++] = 0x00 | 0x03; // real data + stop marker
567 } else {
568 tbl[i++] = 0x00; // real data
569 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200570 }
571
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200573 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200574 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200575
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200576 // randomize positions for the dummy rounds
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400577 num = ( num & 0x0fff ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200578
579 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200580 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200581 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200582 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200583 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200584
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200585 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200586 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200587 {
588 tbl[j] = 0x10; // dummy data
589 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200591 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200593 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200595 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200597 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200598 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200599 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200600 is_even_pos = 0;
601 }
602 else
603 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200604 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200605 is_even_pos = 1;
606 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200607 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200608 }
609 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200610
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200611 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
612 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
613
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200614 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200615}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200616#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200617
Hanno Beckerad049a92017-06-19 16:31:54 +0100618#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200619
620#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
621#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
622#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
623
624#define AES_RT0(idx) RT0[idx]
625#define AES_RT1(idx) ROTL8( RT0[idx] )
626#define AES_RT2(idx) ROTL16( RT0[idx] )
627#define AES_RT3(idx) ROTL24( RT0[idx] )
628
629#define AES_FT0(idx) FT0[idx]
630#define AES_FT1(idx) ROTL8( FT0[idx] )
631#define AES_FT2(idx) ROTL16( FT0[idx] )
632#define AES_FT3(idx) ROTL24( FT0[idx] )
633
Hanno Becker177d3cf2017-06-07 15:52:48 +0100634#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200635
636#define AES_RT0(idx) RT0[idx]
637#define AES_RT1(idx) RT1[idx]
638#define AES_RT2(idx) RT2[idx]
639#define AES_RT3(idx) RT3[idx]
640
641#define AES_FT0(idx) FT0[idx]
642#define AES_FT1(idx) FT1[idx]
643#define AES_FT2(idx) FT2[idx]
644#define AES_FT3(idx) FT3[idx]
645
Hanno Becker177d3cf2017-06-07 15:52:48 +0100646#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200647
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100650 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000651
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200652 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200653}
654
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200656{
657 if( ctx == NULL )
658 return;
659
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500660 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200661}
662
Jaeden Amero9366feb2018-05-29 18:55:17 +0100663#if defined(MBEDTLS_CIPHER_MODE_XTS)
664void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
665{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100666 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000667
Jaeden Amero9366feb2018-05-29 18:55:17 +0100668 mbedtls_aes_init( &ctx->crypt );
669 mbedtls_aes_init( &ctx->tweak );
670}
671
672void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
673{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100674 if( ctx == NULL )
675 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000676
Jaeden Amero9366feb2018-05-29 18:55:17 +0100677 mbedtls_aes_free( &ctx->crypt );
678 mbedtls_aes_free( &ctx->tweak );
679}
680#endif /* MBEDTLS_CIPHER_MODE_XTS */
681
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400682#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400683static void mbedtls_generate_fake_key( unsigned int keybits, mbedtls_aes_context *ctx )
684{
685 unsigned int qword;
686
687 for( qword = keybits >> 5; qword > 0; qword-- )
688 {
689 ctx->frk[ qword - 1 ] = mbedtls_platform_random_uint32();
690 }
691}
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400692#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Andrzej Kureke78775e2020-07-02 10:57:00 -0400693
Paul Bakker5121ce52009-01-03 21:22:43 +0000694/*
695 * AES key schedule (encryption)
696 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200697#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200699 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000700{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200701 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200702 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200703 volatile unsigned int i = 0;
704 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000705 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200706 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100708 AES_VALIDATE_RET( ctx != NULL );
709 AES_VALIDATE_RET( key != NULL );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400710 (void) ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000711
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200712 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000713 {
714 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300715#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000716 case 192: ctx->nr = 12; break;
717 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300718#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000720 }
721
Simon Butcher5201e412018-12-06 17:40:14 +0000722#if !defined(MBEDTLS_AES_ROM_TABLES)
723 if( aes_init_done == 0 )
724 {
725 aes_gen_tables();
726 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000727 }
728#endif
729
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000731 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100732 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000733
734 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000736 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000737#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000738 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400739#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400740 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400741#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000742
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100744 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200745 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100746#endif
747
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400748 /* Three least significant bits are truncated from keybits, which is
749 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400750 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200751 offset = mbedtls_platform_random_in_range( keybits >> 5 );
752
753 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000754 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200755 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200756 flow_ctrl++;
757 }
758
759 for( j = 0; j < offset; j++ )
760 {
761 GET_UINT32_LE( RK[j], key, j << 2 );
762 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000763 }
764
765 switch( ctx->nr )
766 {
767 case 10:
768
769 for( i = 0; i < 10; i++, RK += 4 )
770 {
771 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000772 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
773 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
774 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
775 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000776
777 RK[5] = RK[1] ^ RK[4];
778 RK[6] = RK[2] ^ RK[5];
779 RK[7] = RK[3] ^ RK[6];
780 }
781 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300782#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000783 case 12:
784
785 for( i = 0; i < 8; i++, RK += 6 )
786 {
787 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000788 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
789 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
790 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
791 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000792
793 RK[7] = RK[1] ^ RK[6];
794 RK[8] = RK[2] ^ RK[7];
795 RK[9] = RK[3] ^ RK[8];
796 RK[10] = RK[4] ^ RK[9];
797 RK[11] = RK[5] ^ RK[10];
798 }
799 break;
800
801 case 14:
802
803 for( i = 0; i < 7; i++, RK += 8 )
804 {
805 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000806 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
807 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
808 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
809 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000810
811 RK[9] = RK[1] ^ RK[8];
812 RK[10] = RK[2] ^ RK[9];
813 RK[11] = RK[3] ^ RK[10];
814
815 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000816 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
817 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
818 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
819 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000820
821 RK[13] = RK[5] ^ RK[12];
822 RK[14] = RK[6] ^ RK[13];
823 RK[15] = RK[7] ^ RK[14];
824 }
825 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300826#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000827 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000828
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200829 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200830 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200831#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
832 || ( ctx->nr == 12 && i == 8 )
833 || ( ctx->nr == 14 && i == 7 )
834#endif
835 ) )
836 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400837#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
838 ctx->crc = mbedtls_crc_update( 0, ctx->rk, keybits >> 3 );
839#endif
840 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200841 }
842
Andrzej Kurekca609372020-07-08 03:19:02 -0400843 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200844 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000845}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200846#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000847
848/*
849 * AES key schedule (decryption)
850 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200851#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200853 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000854{
Arto Kinnunen14804442019-10-16 13:43:59 +0300855#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
856 (void) ctx;
857 (void) key;
858 (void) keybits;
859
860 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
861#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200862 volatile unsigned int i = 0, j = 0;
863 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000865 uint32_t *RK;
866 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200867
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100868 AES_VALIDATE_RET( ctx != NULL );
869 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200871 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000872
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000874 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100875 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000876
877 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000879 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000880#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000881 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400882#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400883 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400884#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000885
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200886 /* Also checks keybits */
887 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200888 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000889
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200890 ctx->nr = cty.nr;
891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200892#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100893 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100894 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100896 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200897 i = 0;
898 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200899 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100900 }
901#endif
902
Paul Bakker5121ce52009-01-03 21:22:43 +0000903 SK = cty.rk + cty.nr * 4;
904
905 *RK++ = *SK++;
906 *RK++ = *SK++;
907 *RK++ = *SK++;
908 *RK++ = *SK++;
909
910 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
911 {
912 for( j = 0; j < 4; j++, SK++ )
913 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200914 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
915 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
916 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
917 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000918 }
919 }
920
921 *RK++ = *SK++;
922 *RK++ = *SK++;
923 *RK++ = *SK++;
924 *RK++ = *SK++;
925
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200926exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000928
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200929 if( ret != 0 )
930 {
931 return( ret );
932 }
933 else if( ( i == 0 ) && ( j == 4 ) )
934 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400935#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
936 ctx->crc = mbedtls_crc_update( 0, ctx->rk, keybits >> 3 );
937#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200938 return( ret );
939 }
940 else
941 {
942 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
943 }
944
Arto Kinnunen14804442019-10-16 13:43:59 +0300945#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000946}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100947
948#if defined(MBEDTLS_CIPHER_MODE_XTS)
949static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
950 unsigned int keybits,
951 const unsigned char **key1,
952 unsigned int *key1bits,
953 const unsigned char **key2,
954 unsigned int *key2bits )
955{
956 const unsigned int half_keybits = keybits / 2;
957 const unsigned int half_keybytes = half_keybits / 8;
958
959 switch( keybits )
960 {
961 case 256: break;
962 case 512: break;
963 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
964 }
965
966 *key1bits = half_keybits;
967 *key2bits = half_keybits;
968 *key1 = &key[0];
969 *key2 = &key[half_keybytes];
970
971 return 0;
972}
973
974int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
975 const unsigned char *key,
976 unsigned int keybits)
977{
978 int ret;
979 const unsigned char *key1, *key2;
980 unsigned int key1bits, key2bits;
981
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100982 AES_VALIDATE_RET( ctx != NULL );
983 AES_VALIDATE_RET( key != NULL );
984
Jaeden Amero9366feb2018-05-29 18:55:17 +0100985 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
986 &key2, &key2bits );
987 if( ret != 0 )
988 return( ret );
989
990 /* Set the tweak key. Always set tweak key for the encryption mode. */
991 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
992 if( ret != 0 )
993 return( ret );
994
995 /* Set crypt key for encryption. */
996 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
997}
998
999int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
1000 const unsigned char *key,
1001 unsigned int keybits)
1002{
1003 int ret;
1004 const unsigned char *key1, *key2;
1005 unsigned int key1bits, key2bits;
1006
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +01001007 AES_VALIDATE_RET( ctx != NULL );
1008 AES_VALIDATE_RET( key != NULL );
1009
Jaeden Amero9366feb2018-05-29 18:55:17 +01001010 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
1011 &key2, &key2bits );
1012 if( ret != 0 )
1013 return( ret );
1014
1015 /* Set the tweak key. Always set tweak key for encryption. */
1016 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1017 if( ret != 0 )
1018 return( ret );
1019
1020 /* Set crypt key for decryption. */
1021 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
1022}
1023#endif /* MBEDTLS_CIPHER_MODE_XTS */
1024
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001025#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001026
Paul Bakker5121ce52009-01-03 21:22:43 +00001027/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001028 * AES-ECB block encryption
1029 */
1030#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001031
Arto Kinnunen311ab592020-01-16 17:20:51 +02001032#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001033static uint32_t *aes_fround( uint32_t *R,
1034 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1035 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1036{
1037 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1038 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1039 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1040 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1041
1042 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1043 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1044 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1045 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1046
1047 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1048 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1049 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1050 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1051
1052 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1053 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1054 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1055 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1056
1057 return R;
1058}
1059
1060static void aes_fround_final( uint32_t *R,
1061 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1062 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1063{
1064 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1065 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1066 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1067 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1068
1069 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1070 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1071 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1072 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1073
1074 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1075 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1076 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1077 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1078
1079 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1080 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1081 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1082 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1083}
1084
Andres AGf5bf7182017-03-03 14:09:56 +00001085int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1086 const unsigned char input[16],
1087 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001088{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001089 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001090 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001091 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001092 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001093 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001094 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001095 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001096 // control bytes for AES calculation rounds,
1097 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1098 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001099
Andrzej Kurekfba59212020-08-07 21:02:25 -04001100#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1101 unsigned key_bytes = 0;
1102 uint16_t check_crc = 0;
1103 switch( ctx->nr )
1104 {
1105 case 10: key_bytes = 16; break;
1106#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1107 case 12: key_bytes = 24; break;
1108 case 14: key_bytes = 32; break;
1109#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1110 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1111 }
1112 check_crc = mbedtls_crc_update( 0, ctx->rk, key_bytes );
1113#endif
1114
Arto Kinnunen172836a2019-11-28 13:34:13 +02001115 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001116 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001117
Arto Kinnunen311ab592020-01-16 17:20:51 +02001118 aes_data_table[0] = &aes_data_real;
1119 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001120
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001121 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001122 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1123 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001124 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001125
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001126 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001127 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001128
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001129 // SCA countermeasure, randomize secret data location by initializing it in
1130 // a random order and writing randomized fake data between the real data
1131 // writes.
1132 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001133 i = offset;
1134 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001135 {
1136 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001137 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001138 flow_control++;
1139 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001140
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001141 tindex = 0;
1142 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001143 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001144 // Get pointer to the real or fake data
1145 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1146 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001147
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001148 // initial round key addition
1149 for( i = 0; i < 4; i++ )
1150 {
1151 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1152 }
1153 tindex++;
1154 flow_control++;
1155 } while( stop_mark == 0 );
1156
1157 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1158 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001159 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001160 // Get pointer to the real or fake data
1161 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1162 offset = round_ctrl_table[tindex] & 0x04;
1163 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001164
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001165 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1166 &aes_data_ptr->xy_values[0 + offset],
1167 &aes_data_ptr->xy_values[1 + offset],
1168 &aes_data_ptr->xy_values[2 + offset],
1169 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001170 aes_data_ptr->xy_values[4 - offset],
1171 aes_data_ptr->xy_values[5 - offset],
1172 aes_data_ptr->xy_values[6 - offset],
1173 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001174 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001175 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001176 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001177
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001178 // Calculate final AES round + dummy rounds
1179 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001180 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001181 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1182 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001183 aes_fround_final( aes_data_ptr->rk_ptr,
1184 &aes_data_ptr->xy_values[0],
1185 &aes_data_ptr->xy_values[1],
1186 &aes_data_ptr->xy_values[2],
1187 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001188 aes_data_ptr->xy_values[4],
1189 aes_data_ptr->xy_values[5],
1190 aes_data_ptr->xy_values[6],
1191 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001192 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001193 tindex++;
1194 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001195
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001196 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001197 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001198
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001199 // SCA countermeasure, randomize secret data location by writing to it in
1200 // a random order.
1201 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001202 i = offset;
1203 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001204 {
1205 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1206 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001207 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001208
Andrzej Kurekfba59212020-08-07 21:02:25 -04001209 /* Double negation is used to silence an "extraneous parentheses" warning */
1210 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1211#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1212 && check_crc == ctx->crc
1213#endif
1214 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001215 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001216#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1217 mbedtls_platform_random_delay();
1218 if( mbedtls_crc_update( 0, ctx->rk, key_bytes ) == ctx->crc )
1219#endif
1220 {
1221 return 0;
1222 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001223 }
1224
Andrzej Kurekca609372020-07-08 03:19:02 -04001225 // Clear the output in case of a FI
1226 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001227 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001228}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001229
1230#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1231
1232#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1233 do \
1234 { \
1235 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1236 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1237 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1238 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1239 \
1240 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1241 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1242 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1243 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1244 \
1245 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1246 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1247 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1248 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1249 \
1250 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1251 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1252 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1253 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1254 } while( 0 )
1255
1256int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1257 const unsigned char input[16],
1258 unsigned char output[16] )
1259{
1260 int i;
1261 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1262
1263 RK = ctx->rk;
1264
1265 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1266 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1267 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1268 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1269
1270 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1271 {
1272 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1273 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1274 }
1275
1276 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1277
1278 X0 = *RK++ ^ \
1279 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1280 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1281 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1282 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1283
1284 X1 = *RK++ ^ \
1285 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1286 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1287 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1288 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1289
1290 X2 = *RK++ ^ \
1291 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1292 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1293 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1294 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1295
1296 X3 = *RK++ ^ \
1297 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1298 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1299 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1300 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1301
1302 PUT_UINT32_LE( X0, output, 0 );
1303 PUT_UINT32_LE( X1, output, 4 );
1304 PUT_UINT32_LE( X2, output, 8 );
1305 PUT_UINT32_LE( X3, output, 12 );
1306
Andrzej Kureka8405442019-11-12 03:34:03 -05001307 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1308 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1309 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1310 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1311
1312 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1313 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1314 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1315 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1316
1317 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1318
Arto Kinnunen311ab592020-01-16 17:20:51 +02001319 return( 0 );
1320}
1321#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001322#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1323
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001324#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001325void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1326 const unsigned char input[16],
1327 unsigned char output[16] )
1328{
1329 mbedtls_internal_aes_encrypt( ctx, input, output );
1330}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001331#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001332
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001333/*
1334 * AES-ECB block decryption
1335 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001336
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001337#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001338#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001339
Arto Kinnunen311ab592020-01-16 17:20:51 +02001340#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001341static uint32_t *aes_rround( uint32_t *R,
1342 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1343 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1344{
1345 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1346 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1347 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1348 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1349
1350 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1351 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1352 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1353 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1354
1355 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1356 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1357 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1358 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1359
1360 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1361 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1362 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1363 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1364 return R;
1365}
1366
1367static void aes_rround_final( uint32_t *R,
1368 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1369 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1370{
1371 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1372 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1373 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1374 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1375
1376 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1377 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1378 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1379 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1380
1381 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1382 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1383 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1384 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1385
1386 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1387 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1388 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1389 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1390}
1391
Andres AGf5bf7182017-03-03 14:09:56 +00001392int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1393 const unsigned char input[16],
1394 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001395{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001396 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001397 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001398 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001399 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001400 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001401 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001402 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001403 // control bytes for AES calculation rounds,
1404 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1405 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001406
Andrzej Kurekfba59212020-08-07 21:02:25 -04001407#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1408 unsigned key_bytes = 0;
1409 uint16_t check_crc = 0;
1410 switch( ctx->nr )
1411 {
1412 case 10: key_bytes = 16; break;
1413#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1414 case 12: key_bytes = 24; break;
1415 case 14: key_bytes = 32; break;
1416#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1417 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1418 }
1419 check_crc = mbedtls_crc_update( 0, ctx->rk, key_bytes );
1420#endif
1421
Arto Kinnunen172836a2019-11-28 13:34:13 +02001422 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001423 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001424
Arto Kinnunen311ab592020-01-16 17:20:51 +02001425 aes_data_table[0] = &aes_data_real;
1426 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001427
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001428 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001429 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001430 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001431 flow_control = dummy_rounds;
1432
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001433 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001434 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001435
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001436 // SCA countermeasure, randomize secret data location by initializing it in
1437 // a random order and writing randomized fake data between the real data
1438 // writes.
1439 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001440 i = offset;
1441 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001442 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001443 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001444 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001445 flow_control++;
1446 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001447
1448 tindex = 0;
1449 do
1450 {
1451 // Get pointer to the real or fake data
1452 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1453 stop_mark = round_ctrl_table[tindex] & 0x03;
1454
1455 // initial round key addition
1456 for( i = 0; i < 4; i++ )
1457 {
1458 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1459 }
1460 tindex++;
1461 flow_control++;
1462 } while( stop_mark == 0 );
1463
1464 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1465 do
1466 {
1467 // Get pointer to the real or fake data
1468 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1469 offset = round_ctrl_table[tindex] & 0x04;
1470 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001471
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001472 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1473 &aes_data_ptr->xy_values[0 + offset],
1474 &aes_data_ptr->xy_values[1 + offset],
1475 &aes_data_ptr->xy_values[2 + offset],
1476 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001477 aes_data_ptr->xy_values[4 - offset],
1478 aes_data_ptr->xy_values[5 - offset],
1479 aes_data_ptr->xy_values[6 - offset],
1480 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001481 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001482 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001483 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001484
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001485 // Calculate final AES round + dummy rounds
1486 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001487 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001488 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1489 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001490 aes_rround_final( aes_data_ptr->rk_ptr,
1491 &aes_data_ptr->xy_values[0],
1492 &aes_data_ptr->xy_values[1],
1493 &aes_data_ptr->xy_values[2],
1494 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001495 aes_data_ptr->xy_values[4],
1496 aes_data_ptr->xy_values[5],
1497 aes_data_ptr->xy_values[6],
1498 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001499 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001500 tindex++;
1501 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001502
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001503 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001504 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001505
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001506 // SCA countermeasure, randomize secret data location by writing to it in
1507 // a random order.
1508 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001509 i = offset;
1510 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001511 {
1512 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001513 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001514 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001515
Andrzej Kurekfba59212020-08-07 21:02:25 -04001516 /* Double negation is used to silence an "extraneous parentheses" warning */
1517 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1518#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1519 && check_crc == ctx->crc
1520#endif
1521 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001522 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001523#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1524 mbedtls_platform_random_delay();
1525 if( mbedtls_crc_update( 0, ctx->rk, key_bytes ) == ctx->crc )
1526#endif
1527 {
1528 return 0;
1529 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001530 }
1531
Andrzej Kurekca609372020-07-08 03:19:02 -04001532 // Clear the output in case of a FI
1533 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001534 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001535}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001536
1537#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1538
1539#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1540 do \
1541 { \
1542 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1543 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1544 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1545 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1546 \
1547 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1548 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1549 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1550 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1551 \
1552 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1553 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1554 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1555 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1556 \
1557 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1558 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1559 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1560 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1561 } while( 0 )
1562
1563int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1564 const unsigned char input[16],
1565 unsigned char output[16] )
1566{
1567 int i;
1568 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1569
1570 RK = ctx->rk;
1571
1572 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1573 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1574 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1575 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1576
1577 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1578 {
1579 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1580 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1581 }
1582
1583 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1584
1585 X0 = *RK++ ^ \
1586 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1587 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1588 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1589 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1590
1591 X1 = *RK++ ^ \
1592 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1593 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1594 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1595 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1596
1597 X2 = *RK++ ^ \
1598 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1599 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1600 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1601 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1602
1603 X3 = *RK++ ^ \
1604 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1605 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1606 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1607 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1608
1609 PUT_UINT32_LE( X0, output, 0 );
1610 PUT_UINT32_LE( X1, output, 4 );
1611 PUT_UINT32_LE( X2, output, 8 );
1612 PUT_UINT32_LE( X3, output, 12 );
1613
Andrzej Kureka8405442019-11-12 03:34:03 -05001614 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1615 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1616 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1617 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1618
1619 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1620 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1621 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1622 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1623
1624 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1625
Arto Kinnunen311ab592020-01-16 17:20:51 +02001626 return( 0 );
1627}
1628#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1629
Arto Kinnunen14804442019-10-16 13:43:59 +03001630#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001631#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1632
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001633#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001634void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1635 const unsigned char input[16],
1636 unsigned char output[16] )
1637{
Arto Kinnunen14804442019-10-16 13:43:59 +03001638#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1639 (void) ctx;
1640 (void) input;
1641 (void) output;
1642#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001643 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001644#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001645}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001646#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001647
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001648/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001649 * AES-ECB block encryption/decryption
1650 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001651int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001652 int mode,
1653 const unsigned char input[16],
1654 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001655{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001656 AES_VALIDATE_RET( ctx != NULL );
1657 AES_VALIDATE_RET( input != NULL );
1658 AES_VALIDATE_RET( output != NULL );
1659 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1660 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001661 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001663#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001664 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001665 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001666#endif
1667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001668#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001669 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001670 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001671 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001672 return( 0 );
1673
1674 // If padlock data misaligned, we just fall back to
1675 // unaccelerated mode
1676 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001677 }
1678#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001679
Arto Kinnunen14804442019-10-16 13:43:59 +03001680#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1681 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1682#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001683
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001684 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001685 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001686 else
Andres AGf5bf7182017-03-03 14:09:56 +00001687 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001688#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001689}
1690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001692/*
1693 * AES-CBC buffer encryption/decryption
1694 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001695int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001696 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001697 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001698 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001699 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001700 unsigned char *output )
1701{
1702 int i;
1703 unsigned char temp[16];
1704
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001705 AES_VALIDATE_RET( ctx != NULL );
1706 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1707 mode == MBEDTLS_AES_DECRYPT );
1708 AES_VALIDATE_RET( iv != NULL );
1709 AES_VALIDATE_RET( input != NULL );
1710 AES_VALIDATE_RET( output != NULL );
1711
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001712 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001713 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001715#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001716 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001717 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001718 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001719 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001720
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001721 // If padlock data misaligned, we just fall back to
1722 // unaccelerated mode
1723 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001724 }
1725#endif
1726
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001727 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001728 {
1729 while( length > 0 )
1730 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001731 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001732 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001733
1734 for( i = 0; i < 16; i++ )
1735 output[i] = (unsigned char)( output[i] ^ iv[i] );
1736
Teppo Järvelin91d79382019-10-02 09:09:31 +03001737 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001738
1739 input += 16;
1740 output += 16;
1741 length -= 16;
1742 }
1743 }
1744 else
1745 {
1746 while( length > 0 )
1747 {
1748 for( i = 0; i < 16; i++ )
1749 output[i] = (unsigned char)( input[i] ^ iv[i] );
1750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001751 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001752 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001753
1754 input += 16;
1755 output += 16;
1756 length -= 16;
1757 }
1758 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001759
1760 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001761}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001762#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001763
Aorimn5f778012016-06-09 23:22:58 +02001764#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001765
1766/* Endianess with 64 bits values */
1767#ifndef GET_UINT64_LE
1768#define GET_UINT64_LE(n,b,i) \
1769{ \
1770 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1771 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1772 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1773 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1774 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1775 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1776 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1777 | ( (uint64_t) (b)[(i) ] ); \
1778}
1779#endif
1780
1781#ifndef PUT_UINT64_LE
1782#define PUT_UINT64_LE(n,b,i) \
1783{ \
1784 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1785 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1786 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1787 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1788 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1789 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1790 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1791 (b)[(i) ] = (unsigned char) ( (n) ); \
1792}
1793#endif
1794
1795typedef unsigned char mbedtls_be128[16];
1796
1797/*
1798 * GF(2^128) multiplication function
1799 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001800 * This function multiplies a field element by x in the polynomial field
1801 * representation. It uses 64-bit word operations to gain speed but compensates
1802 * for machine endianess and hence works correctly on both big and little
1803 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001804 */
1805static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001806 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001807{
1808 uint64_t a, b, ra, rb;
1809
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001810 GET_UINT64_LE( a, x, 0 );
1811 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001812
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001813 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1814 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001815
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001816 PUT_UINT64_LE( ra, r, 0 );
1817 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001818}
1819
Aorimn5f778012016-06-09 23:22:58 +02001820/*
1821 * AES-XTS buffer encryption/decryption
1822 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001823int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1824 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001825 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001826 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001827 const unsigned char *input,
1828 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001829{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001830 int ret;
1831 size_t blocks = length / 16;
1832 size_t leftover = length % 16;
1833 unsigned char tweak[16];
1834 unsigned char prev_tweak[16];
1835 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001836
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001837 AES_VALIDATE_RET( ctx != NULL );
1838 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1839 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001840 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001841 AES_VALIDATE_RET( input != NULL );
1842 AES_VALIDATE_RET( output != NULL );
1843
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001844 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001845 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001846 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001847
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001848 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001849 if( length > ( 1 << 20 ) * 16 )
1850 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001851
Jaeden Amerod82cd862018-04-28 15:02:45 +01001852 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001853 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1854 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001855 if( ret != 0 )
1856 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001857
Jaeden Amerod82cd862018-04-28 15:02:45 +01001858 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001859 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001860 size_t i;
1861
1862 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1863 {
1864 /* We are on the last block in a decrypt operation that has
1865 * leftover bytes, so we need to use the next tweak for this block,
1866 * and this tweak for the lefover bytes. Save the current tweak for
1867 * the leftovers and then update the current tweak for use on this,
1868 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001869 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001870 mbedtls_gf128mul_x_ble( tweak, tweak );
1871 }
1872
1873 for( i = 0; i < 16; i++ )
1874 tmp[i] = input[i] ^ tweak[i];
1875
1876 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1877 if( ret != 0 )
1878 return( ret );
1879
1880 for( i = 0; i < 16; i++ )
1881 output[i] = tmp[i] ^ tweak[i];
1882
1883 /* Update the tweak for the next block. */
1884 mbedtls_gf128mul_x_ble( tweak, tweak );
1885
1886 output += 16;
1887 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001888 }
1889
Jaeden Amerod82cd862018-04-28 15:02:45 +01001890 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001891 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001892 /* If we are on the leftover bytes in a decrypt operation, we need to
1893 * use the previous tweak for these bytes (as saved in prev_tweak). */
1894 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001895
Jaeden Amerod82cd862018-04-28 15:02:45 +01001896 /* We are now on the final part of the data unit, which doesn't divide
1897 * evenly by 16. It's time for ciphertext stealing. */
1898 size_t i;
1899 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001900
Jaeden Amerod82cd862018-04-28 15:02:45 +01001901 /* Copy ciphertext bytes from the previous block to our output for each
1902 * byte of cyphertext we won't steal. At the same time, copy the
1903 * remainder of the input for this final round (since the loop bounds
1904 * are the same). */
1905 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001906 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001907 output[i] = prev_output[i];
1908 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001909 }
Aorimn5f778012016-06-09 23:22:58 +02001910
Jaeden Amerod82cd862018-04-28 15:02:45 +01001911 /* Copy ciphertext bytes from the previous block for input in this
1912 * round. */
1913 for( ; i < 16; i++ )
1914 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001915
Jaeden Amerod82cd862018-04-28 15:02:45 +01001916 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1917 if( ret != 0 )
1918 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001919
Jaeden Amerod82cd862018-04-28 15:02:45 +01001920 /* Write the result back to the previous block, overriding the previous
1921 * output we copied. */
1922 for( i = 0; i < 16; i++ )
1923 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001924 }
1925
1926 return( 0 );
1927}
1928#endif /* MBEDTLS_CIPHER_MODE_XTS */
1929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001930#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001931/*
1932 * AES-CFB128 buffer encryption/decryption
1933 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001934int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001935 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001936 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001937 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001938 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001939 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001940 unsigned char *output )
1941{
Paul Bakker27fdf462011-06-09 13:55:13 +00001942 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001943 size_t n;
1944
1945 AES_VALIDATE_RET( ctx != NULL );
1946 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1947 mode == MBEDTLS_AES_DECRYPT );
1948 AES_VALIDATE_RET( iv_off != NULL );
1949 AES_VALIDATE_RET( iv != NULL );
1950 AES_VALIDATE_RET( input != NULL );
1951 AES_VALIDATE_RET( output != NULL );
1952
1953 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001954
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001955 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001956 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1957
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001958 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001959 {
1960 while( length-- )
1961 {
1962 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001963 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001964
1965 c = *input++;
1966 *output++ = (unsigned char)( c ^ iv[n] );
1967 iv[n] = (unsigned char) c;
1968
Paul Bakker66d5d072014-06-17 16:39:18 +02001969 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001970 }
1971 }
1972 else
1973 {
1974 while( length-- )
1975 {
1976 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001977 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001978
1979 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1980
Paul Bakker66d5d072014-06-17 16:39:18 +02001981 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001982 }
1983 }
1984
1985 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001986
1987 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001988}
Paul Bakker556efba2014-01-24 15:38:12 +01001989
1990/*
1991 * AES-CFB8 buffer encryption/decryption
1992 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001993int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001994 int mode,
1995 size_t length,
1996 unsigned char iv[16],
1997 const unsigned char *input,
1998 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001999{
2000 unsigned char c;
2001 unsigned char ov[17];
2002
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01002003 AES_VALIDATE_RET( ctx != NULL );
2004 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
2005 mode == MBEDTLS_AES_DECRYPT );
2006 AES_VALIDATE_RET( iv != NULL );
2007 AES_VALIDATE_RET( input != NULL );
2008 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01002009 while( length-- )
2010 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03002011 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002012 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01002013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002014 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002015 ov[16] = *input;
2016
2017 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
2018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002019 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002020 ov[16] = c;
2021
Teppo Järvelin91d79382019-10-02 09:09:31 +03002022 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01002023 }
2024
2025 return( 0 );
2026}
Simon Butcher76a5b222018-04-22 22:57:27 +01002027#endif /* MBEDTLS_CIPHER_MODE_CFB */
2028
2029#if defined(MBEDTLS_CIPHER_MODE_OFB)
2030/*
2031 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
2032 */
2033int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01002034 size_t length,
2035 size_t *iv_off,
2036 unsigned char iv[16],
2037 const unsigned char *input,
2038 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01002039{
Simon Butcherad4e4932018-04-29 00:43:47 +01002040 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01002041 size_t n;
2042
2043 AES_VALIDATE_RET( ctx != NULL );
2044 AES_VALIDATE_RET( iv_off != NULL );
2045 AES_VALIDATE_RET( iv != NULL );
2046 AES_VALIDATE_RET( input != NULL );
2047 AES_VALIDATE_RET( output != NULL );
2048
2049 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01002050
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01002051 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01002052 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2053
Simon Butcher76a5b222018-04-22 22:57:27 +01002054 while( length-- )
2055 {
2056 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002057 {
2058 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
2059 if( ret != 0 )
2060 goto exit;
2061 }
Simon Butcher76a5b222018-04-22 22:57:27 +01002062 *output++ = *input++ ^ iv[n];
2063
2064 n = ( n + 1 ) & 0x0F;
2065 }
2066
2067 *iv_off = n;
2068
Simon Butcherad4e4932018-04-29 00:43:47 +01002069exit:
2070 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002071}
2072#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002074#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002075/*
2076 * AES-CTR buffer encryption/decryption
2077 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002078int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002079 size_t length,
2080 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002081 unsigned char nonce_counter[16],
2082 unsigned char stream_block[16],
2083 const unsigned char *input,
2084 unsigned char *output )
2085{
Paul Bakker369e14b2012-04-18 14:16:09 +00002086 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002087 size_t n;
2088
2089 AES_VALIDATE_RET( ctx != NULL );
2090 AES_VALIDATE_RET( nc_off != NULL );
2091 AES_VALIDATE_RET( nonce_counter != NULL );
2092 AES_VALIDATE_RET( stream_block != NULL );
2093 AES_VALIDATE_RET( input != NULL );
2094 AES_VALIDATE_RET( output != NULL );
2095
2096 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002097
Arto Kinnunen75439012019-12-03 14:12:10 +02002098 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002099 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2100
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002101 while( length-- )
2102 {
2103 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105
Paul Bakker369e14b2012-04-18 14:16:09 +00002106 for( i = 16; i > 0; i-- )
2107 if( ++nonce_counter[i - 1] != 0 )
2108 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002109 }
2110 c = *input++;
2111 *output++ = (unsigned char)( c ^ stream_block[n] );
2112
Paul Bakker66d5d072014-06-17 16:39:18 +02002113 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002114 }
2115
2116 *nc_off = n;
2117
2118 return( 0 );
2119}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002120#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002122#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002125/*
2126 * AES test vectors from:
2127 *
2128 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2129 */
2130static const unsigned char aes_test_ecb_dec[3][16] =
2131{
2132 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2133 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2134 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2135 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2136 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2137 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2138};
2139
2140static const unsigned char aes_test_ecb_enc[3][16] =
2141{
2142 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2143 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2144 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2145 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2146 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2147 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2148};
2149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002150#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002151static const unsigned char aes_test_cbc_dec[3][16] =
2152{
2153 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2154 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2155 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2156 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2157 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2158 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2159};
2160
2161static const unsigned char aes_test_cbc_enc[3][16] =
2162{
2163 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2164 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2165 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2166 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2167 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2168 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2169};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002170#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002171
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002172#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002173/*
2174 * AES-CFB128 test vectors from:
2175 *
2176 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2177 */
2178static const unsigned char aes_test_cfb128_key[3][32] =
2179{
2180 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2181 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2182 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2183 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2184 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2185 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2186 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2187 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2188 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2189};
2190
2191static const unsigned char aes_test_cfb128_iv[16] =
2192{
2193 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2194 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2195};
2196
2197static const unsigned char aes_test_cfb128_pt[64] =
2198{
2199 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2200 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2201 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2202 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2203 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2204 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2205 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2206 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2207};
2208
2209static const unsigned char aes_test_cfb128_ct[3][64] =
2210{
2211 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2212 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2213 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2214 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2215 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2216 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2217 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2218 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2219 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2220 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2221 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2222 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2223 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2224 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2225 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2226 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2227 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2228 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2229 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2230 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2231 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2232 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2233 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2234 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2235};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002237
Simon Butcherad4e4932018-04-29 00:43:47 +01002238#if defined(MBEDTLS_CIPHER_MODE_OFB)
2239/*
2240 * AES-OFB test vectors from:
2241 *
Simon Butcher5db13622018-06-04 22:11:25 +01002242 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002243 */
2244static const unsigned char aes_test_ofb_key[3][32] =
2245{
2246 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2247 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2248 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2249 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2250 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2251 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2252 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2253 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2254 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2255};
2256
2257static const unsigned char aes_test_ofb_iv[16] =
2258{
2259 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2260 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2261};
2262
2263static const unsigned char aes_test_ofb_pt[64] =
2264{
2265 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2266 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2267 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2268 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2269 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2270 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2271 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2272 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2273};
2274
2275static const unsigned char aes_test_ofb_ct[3][64] =
2276{
2277 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2278 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2279 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2280 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2281 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2282 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2283 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2284 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2285 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2286 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2287 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2288 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2289 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2290 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2291 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2292 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2293 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2294 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2295 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2296 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2297 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2298 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2299 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2300 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2301};
2302#endif /* MBEDTLS_CIPHER_MODE_OFB */
2303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002304#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002305/*
2306 * AES-CTR test vectors from:
2307 *
2308 * http://www.faqs.org/rfcs/rfc3686.html
2309 */
2310
2311static const unsigned char aes_test_ctr_key[3][16] =
2312{
2313 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2314 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2315 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2316 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2317 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2318 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2319};
2320
2321static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2322{
2323 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2325 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2326 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2327 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2328 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2329};
2330
2331static const unsigned char aes_test_ctr_pt[3][48] =
2332{
2333 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2334 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2335
2336 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2337 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2338 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2339 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2340
2341 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2342 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2343 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2344 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2345 0x20, 0x21, 0x22, 0x23 }
2346};
2347
2348static const unsigned char aes_test_ctr_ct[3][48] =
2349{
2350 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2351 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2352 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2353 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2354 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2355 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2356 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2357 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2358 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2359 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2360 0x25, 0xB2, 0x07, 0x2F }
2361};
2362
2363static const int aes_test_ctr_len[3] =
2364 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002365#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002366
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002367#if defined(MBEDTLS_CIPHER_MODE_XTS)
2368/*
2369 * AES-XTS test vectors from:
2370 *
2371 * IEEE P1619/D16 Annex B
2372 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2373 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2374 */
2375static const unsigned char aes_test_xts_key[][32] =
2376{
2377 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2381 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2382 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2383 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2384 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2385 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2386 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2387 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2388 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2389};
2390
2391static const unsigned char aes_test_xts_pt32[][32] =
2392{
2393 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2397 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2398 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2399 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2400 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2401 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2402 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2403 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2404 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2405};
2406
2407static const unsigned char aes_test_xts_ct32[][32] =
2408{
2409 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2410 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2411 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2412 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2413 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2414 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2415 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2416 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2417 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2418 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2419 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2420 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2421};
2422
2423static const unsigned char aes_test_xts_data_unit[][16] =
2424{
2425 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2427 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2429 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2431};
2432
2433#endif /* MBEDTLS_CIPHER_MODE_XTS */
2434
Paul Bakker5121ce52009-01-03 21:22:43 +00002435/*
2436 * Checkup routine
2437 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002438int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002439{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002440 int ret = 0, i, j, u, mode;
2441 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 unsigned char key[32];
2443 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002444 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002445#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002446 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002447#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002448#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002449 unsigned char prv[16];
2450#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002451#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2452 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002453 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002454#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002455#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002456 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002457#endif
2458#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002459 unsigned char nonce_counter[16];
2460 unsigned char stream_block[16];
2461#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002462 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002463
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002464 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002465 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002466
2467 /*
2468 * ECB mode
2469 */
2470 for( i = 0; i < 6; i++ )
2471 {
2472 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002473 keybits = 128 + u * 64;
2474 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002475
2476 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002477 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2478 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002479
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002480#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2481 if( keybits > 128 )
2482 {
2483 mbedtls_printf( "skipped\n" );
2484 continue;
2485 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002486#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2487
2488#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2489 if( mode == MBEDTLS_AES_DECRYPT )
2490 {
2491 mbedtls_printf( "skipped\n" );
2492 continue;
2493 }
2494#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002495
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002496 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002497
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002498 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002499 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002500 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2501 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002502 }
2503 else
2504 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002505 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2506 aes_tests = aes_test_ecb_enc[u];
2507 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002508
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002509 /*
2510 * AES-192 is an optional feature that may be unavailable when
2511 * there is an alternative underlying implementation i.e. when
2512 * MBEDTLS_AES_ALT is defined.
2513 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002514 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002515 {
2516 mbedtls_printf( "skipped\n" );
2517 continue;
2518 }
2519 else if( ret != 0 )
2520 {
2521 goto exit;
2522 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002523
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002524 for( j = 0; j < 10000; j++ )
2525 {
2526 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2527 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002528 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002529 }
2530
2531 if( memcmp( buf, aes_tests, 16 ) != 0 )
2532 {
2533 ret = 1;
2534 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002535 }
2536
2537 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002538 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002539 }
2540
2541 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002542 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002543
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002544#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002545 /*
2546 * CBC mode
2547 */
2548 for( i = 0; i < 6; i++ )
2549 {
2550 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002551 keybits = 128 + u * 64;
2552 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002553
2554 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002555 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2556 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002557
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002558#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2559 if( keybits > 128 )
2560 {
2561 mbedtls_printf( "skipped\n" );
2562 continue;
2563 }
2564#endif
2565
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002566#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2567 if( mode == MBEDTLS_AES_DECRYPT )
2568 {
2569 mbedtls_printf( "skipped\n" );
2570 continue;
2571 }
2572#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2573
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002574 memset( iv , 0, 16 );
2575 memset( prv, 0, 16 );
2576 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002577
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002578 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002579 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002580 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2581 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002582 }
2583 else
2584 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002585 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2586 aes_tests = aes_test_cbc_enc[u];
2587 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002588
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002589 /*
2590 * AES-192 is an optional feature that may be unavailable when
2591 * there is an alternative underlying implementation i.e. when
2592 * MBEDTLS_AES_ALT is defined.
2593 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002594 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002595 {
2596 mbedtls_printf( "skipped\n" );
2597 continue;
2598 }
2599 else if( ret != 0 )
2600 {
2601 goto exit;
2602 }
2603
2604 for( j = 0; j < 10000; j++ )
2605 {
2606 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002607 {
2608 unsigned char tmp[16];
2609
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002610 memcpy( tmp, prv, 16 );
2611 memcpy( prv, buf, 16 );
2612 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002613 }
2614
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002615 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2616 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002617 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002618
2619 }
2620
2621 if( memcmp( buf, aes_tests, 16 ) != 0 )
2622 {
2623 ret = 1;
2624 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002625 }
2626
2627 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002628 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002629 }
2630
2631 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002632 mbedtls_printf( "\n" );
2633#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002635#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002636 /*
2637 * CFB128 mode
2638 */
2639 for( i = 0; i < 6; i++ )
2640 {
2641 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002642 keybits = 128 + u * 64;
2643 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002644
2645 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002646 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2647 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002648
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002649#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2650 if( keybits > 128 )
2651 {
2652 mbedtls_printf( "skipped\n" );
2653 continue;
2654 }
2655#endif
2656
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002657#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2658 if( mode == MBEDTLS_AES_DECRYPT )
2659 {
2660 mbedtls_printf( "skipped\n" );
2661 continue;
2662 }
2663#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2664
Paul Bakker5121ce52009-01-03 21:22:43 +00002665 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002666 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002667
2668 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002669 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002670 /*
2671 * AES-192 is an optional feature that may be unavailable when
2672 * there is an alternative underlying implementation i.e. when
2673 * MBEDTLS_AES_ALT is defined.
2674 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002675 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002676 {
2677 mbedtls_printf( "skipped\n" );
2678 continue;
2679 }
2680 else if( ret != 0 )
2681 {
2682 goto exit;
2683 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002684
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002685 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002686 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002687 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002688 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002689 }
2690 else
2691 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002692 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002693 aes_tests = aes_test_cfb128_ct[u];
2694 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002695
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002696 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2697 if( ret != 0 )
2698 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002699
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002700 if( memcmp( buf, aes_tests, 64 ) != 0 )
2701 {
2702 ret = 1;
2703 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002704 }
2705
2706 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002707 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002708 }
2709
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002710 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002711 mbedtls_printf( "\n" );
2712#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002713
Simon Butcherad4e4932018-04-29 00:43:47 +01002714#if defined(MBEDTLS_CIPHER_MODE_OFB)
2715 /*
2716 * OFB mode
2717 */
2718 for( i = 0; i < 6; i++ )
2719 {
2720 u = i >> 1;
2721 keybits = 128 + u * 64;
2722 mode = i & 1;
2723
2724 if( verbose != 0 )
2725 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2726 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2727
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002728#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2729 if( keybits > 128 )
2730 {
2731 mbedtls_printf( "skipped\n" );
2732 continue;
2733 }
2734#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002735
2736#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2737 if( mode == MBEDTLS_AES_DECRYPT )
2738 {
2739 mbedtls_printf( "skipped\n" );
2740 continue;
2741 }
2742#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2743
Simon Butcherad4e4932018-04-29 00:43:47 +01002744 memcpy( iv, aes_test_ofb_iv, 16 );
2745 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2746
2747 offset = 0;
2748 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2749 /*
2750 * AES-192 is an optional feature that may be unavailable when
2751 * there is an alternative underlying implementation i.e. when
2752 * MBEDTLS_AES_ALT is defined.
2753 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002754 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002755 {
2756 mbedtls_printf( "skipped\n" );
2757 continue;
2758 }
2759 else if( ret != 0 )
2760 {
2761 goto exit;
2762 }
2763
2764 if( mode == MBEDTLS_AES_DECRYPT )
2765 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002766 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002767 aes_tests = aes_test_ofb_pt;
2768 }
2769 else
2770 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002771 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002772 aes_tests = aes_test_ofb_ct[u];
2773 }
2774
2775 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2776 if( ret != 0 )
2777 goto exit;
2778
2779 if( memcmp( buf, aes_tests, 64 ) != 0 )
2780 {
2781 ret = 1;
2782 goto exit;
2783 }
2784
2785 if( verbose != 0 )
2786 mbedtls_printf( "passed\n" );
2787 }
2788
2789 if( verbose != 0 )
2790 mbedtls_printf( "\n" );
2791#endif /* MBEDTLS_CIPHER_MODE_OFB */
2792
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002793#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002794 /*
2795 * CTR mode
2796 */
2797 for( i = 0; i < 6; i++ )
2798 {
2799 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002800 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002801
2802 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002803 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002804 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002805
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002806#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2807 if( keybits > 128 )
2808 {
2809 mbedtls_printf( "skipped\n" );
2810 continue;
2811 }
2812#endif
2813
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002814#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2815 if( mode == MBEDTLS_AES_DECRYPT )
2816 {
2817 mbedtls_printf( "skipped\n" );
2818 continue;
2819 }
2820#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2821
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002822 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2823 memcpy( key, aes_test_ctr_key[u], 16 );
2824
2825 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002826 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2827 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002828
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002829 len = aes_test_ctr_len[u];
2830
2831 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002832 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002833 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002834 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002835 }
2836 else
2837 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002838 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002839 aes_tests = aes_test_ctr_ct[u];
2840 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002841
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002842 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2843 stream_block, buf, buf );
2844 if( ret != 0 )
2845 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002846
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002847 if( memcmp( buf, aes_tests, len ) != 0 )
2848 {
2849 ret = 1;
2850 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002851 }
2852
2853 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002854 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002855 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002856
2857 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002858 mbedtls_printf( "\n" );
2859#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002860
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002861#if defined(MBEDTLS_CIPHER_MODE_XTS)
2862 {
2863 static const int num_tests =
2864 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2865 mbedtls_aes_xts_context ctx_xts;
2866
2867 /*
2868 * XTS mode
2869 */
2870 mbedtls_aes_xts_init( &ctx_xts );
2871
2872 for( i = 0; i < num_tests << 1; i++ )
2873 {
2874 const unsigned char *data_unit;
2875 u = i >> 1;
2876 mode = i & 1;
2877
2878 if( verbose != 0 )
2879 mbedtls_printf( " AES-XTS-128 (%s): ",
2880 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2881
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002882#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2883 if( mode == MBEDTLS_AES_DECRYPT )
2884 {
2885 mbedtls_printf( "skipped\n" );
2886 continue;
2887 }
2888#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2889
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002890 memset( key, 0, sizeof( key ) );
2891 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002892 data_unit = aes_test_xts_data_unit[u];
2893
2894 len = sizeof( *aes_test_xts_ct32 );
2895
2896 if( mode == MBEDTLS_AES_DECRYPT )
2897 {
2898 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2899 if( ret != 0)
2900 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002901 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002902 aes_tests = aes_test_xts_pt32[u];
2903 }
2904 else
2905 {
2906 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2907 if( ret != 0)
2908 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002909 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002910 aes_tests = aes_test_xts_ct32[u];
2911 }
2912
2913
2914 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2915 buf, buf );
2916 if( ret != 0 )
2917 goto exit;
2918
2919 if( memcmp( buf, aes_tests, len ) != 0 )
2920 {
2921 ret = 1;
2922 goto exit;
2923 }
2924
2925 if( verbose != 0 )
2926 mbedtls_printf( "passed\n" );
2927 }
2928
2929 if( verbose != 0 )
2930 mbedtls_printf( "\n" );
2931
2932 mbedtls_aes_xts_free( &ctx_xts );
2933 }
2934#endif /* MBEDTLS_CIPHER_MODE_XTS */
2935
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002936 ret = 0;
2937
2938exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002939 if( ret != 0 && verbose != 0 )
2940 mbedtls_printf( "failed\n" );
2941
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002942 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002943
2944 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002945}
2946
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002947#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002948
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002949#endif /* MBEDTLS_AES_C */