blob: 800517295d46b1e1a6b037f7ce895e23564f4fda [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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_SELF_TEST)
49#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#else
Rich Evans00ab4702015-02-06 13:43:58 +000052#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#define mbedtls_printf printf
54#endif /* MBEDTLS_PLATFORM_C */
55#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010059/* Parameter validation macros based on platform_util.h */
60#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010061 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010062#define AES_VALIDATE( cond ) \
63 MBEDTLS_INTERNAL_VALIDATE( cond )
64
Paul Bakker5121ce52009-01-03 21:22:43 +000065/*
66 * 32-bit integer manipulation macros (little endian)
67 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef GET_UINT32_LE
69#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000071 (n) = ( (uint32_t) (b)[(i) ] ) \
72 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
73 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
74 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
76#endif
77
Paul Bakker5c2364c2012-10-01 14:41:15 +000078#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000079#define PUT_UINT32_LE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
82 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
83 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
84 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000085}
86#endif
87
Andrzej Kurek9539f832020-08-10 15:58:13 -040088#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
89static uint32_t mbedtls_hash( const void *data, size_t data_len_bytes )
90{
91 uint32_t result = 0;
92 size_t i;
93 /* data_len_bytes - only multiples of 4 are considered, rest is truncated */
94 for( i = 0; i < data_len_bytes >> 2; i++ )
95 {
96 result ^= ( (uint32_t*) data )[i];
97 }
98 return result;
99}
100#endif
Arto Kinnunen172836a2019-11-28 13:34:13 +0200101/*
102 * Data structure for AES round data
103 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200104typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +0200105 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +0200106 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200107} aes_r_data_t;
108
109#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200110/* Number of additional AES dummy rounds added for SCA countermeasures */
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200111#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +0200112#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114#if defined(MBEDTLS_PADLOCK_C) && \
115 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000116static int aes_padlock_ace = -1;
117#endif
118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000120/*
121 * Forward S-box
122 */
123static const unsigned char FSb[256] =
124{
125 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
126 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
127 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
128 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
129 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
130 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
131 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
132 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
133 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
134 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
135 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
136 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
137 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
138 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
139 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
140 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
141 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
142 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
143 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
144 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
145 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
146 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
147 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
148 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
149 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
150 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
151 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
152 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
153 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
154 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
155 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
156 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
157};
158
159/*
160 * Forward tables
161 */
162#define FT \
163\
164 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
165 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
166 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
167 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
168 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
169 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
170 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
171 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
172 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
173 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
174 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
175 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
176 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
177 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
178 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
179 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
180 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
181 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
182 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
183 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
184 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
185 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
186 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
187 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
188 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
189 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
190 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
191 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
192 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
193 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
194 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
195 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
196 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
197 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
198 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
199 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
200 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
201 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
202 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
203 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
204 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
205 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
206 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
207 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
208 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
209 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
210 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
211 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
212 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
213 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
214 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
215 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
216 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
217 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
218 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
219 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
220 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
221 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
222 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
223 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
224 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
225 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
226 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
227 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
228
229#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000230static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000231#undef V
232
Hanno Beckerad049a92017-06-19 16:31:54 +0100233#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200234
Paul Bakker5121ce52009-01-03 21:22:43 +0000235#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000236static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000237#undef V
238
239#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000240static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000241#undef V
242
243#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000244static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000245#undef V
246
Hanno Becker177d3cf2017-06-07 15:52:48 +0100247#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200248
Paul Bakker5121ce52009-01-03 21:22:43 +0000249#undef FT
250
Arto Kinnunen14804442019-10-16 13:43:59 +0300251#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000252/*
253 * Reverse S-box
254 */
255static const unsigned char RSb[256] =
256{
257 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
258 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
259 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
260 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
261 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
262 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
263 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
264 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
265 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
266 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
267 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
268 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
269 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
270 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
271 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
272 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
273 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
274 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
275 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
276 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
277 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
278 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
279 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
280 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
281 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
282 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
283 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
284 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
285 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
286 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
287 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
288 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
289};
Arto Kinnunen14804442019-10-16 13:43:59 +0300290#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000291
292/*
293 * Reverse tables
294 */
295#define RT \
296\
297 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
298 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
299 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
300 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
301 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
302 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
303 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
304 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
305 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
306 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
307 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
308 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
309 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
310 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
311 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
312 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
313 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
314 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
315 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
316 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
317 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
318 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
319 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
320 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
321 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
322 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
323 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
324 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
325 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
326 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
327 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
328 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
329 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
330 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
331 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
332 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
333 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
334 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
335 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
336 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
337 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
338 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
339 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
340 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
341 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
342 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
343 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
344 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
345 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
346 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
347 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
348 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
349 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
350 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
351 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
352 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
353 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
354 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
355 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
356 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
357 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
358 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
359 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
360 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
361
Arto Kinnunen14804442019-10-16 13:43:59 +0300362#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000363#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000364static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000365#undef V
366
Hanno Beckerad049a92017-06-19 16:31:54 +0100367#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200368
Paul Bakker5121ce52009-01-03 21:22:43 +0000369#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000370static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000371#undef V
372
373#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000374static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000375#undef V
376
377#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000379#undef V
380
Hanno Becker177d3cf2017-06-07 15:52:48 +0100381#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300382#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200383
Paul Bakker5121ce52009-01-03 21:22:43 +0000384#undef RT
385
386/*
387 * Round constants
388 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000389static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000390{
391 0x00000001, 0x00000002, 0x00000004, 0x00000008,
392 0x00000010, 0x00000020, 0x00000040, 0x00000080,
393 0x0000001B, 0x00000036
394};
395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000397
398/*
399 * Forward S-box & tables
400 */
401static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200402static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100403#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200404static uint32_t FT1[256];
405static uint32_t FT2[256];
406static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100407#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
409/*
410 * Reverse S-box & tables
411 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300412#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000413static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000414static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100415#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000416static uint32_t RT1[256];
417static uint32_t RT2[256];
418static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100419#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300420#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000421
422/*
423 * Round constants
424 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000425static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000426
427/*
428 * Tables generation code
429 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100430#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
431#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100432#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000433
434static int aes_init_done = 0;
435
436static void aes_gen_tables( void )
437{
438 int i, x, y, z;
439 int pow[256];
440 int log[256];
441
442 /*
443 * compute pow and log tables over GF(2^8)
444 */
445 for( i = 0, x = 1; i < 256; i++ )
446 {
447 pow[i] = x;
448 log[x] = i;
449 x = ( x ^ XTIME( x ) ) & 0xFF;
450 }
451
452 /*
453 * calculate the round constants
454 */
455 for( i = 0, x = 1; i < 10; i++ )
456 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000457 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000458 x = XTIME( x ) & 0xFF;
459 }
460
461 /*
462 * generate the forward and reverse S-boxes
463 */
464 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300465#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300467#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000468
469 for( i = 1; i < 256; i++ )
470 {
471 x = pow[255 - log[i]];
472
Paul Bakker66d5d072014-06-17 16:39:18 +0200473 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
474 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
475 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
476 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000477 x ^= y ^ 0x63;
478
479 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300480#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000481 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300482#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000483 }
484
485 /*
486 * generate the forward and reverse tables
487 */
488 for( i = 0; i < 256; i++ )
489 {
490 x = FSb[i];
491 y = XTIME( x ) & 0xFF;
492 z = ( y ^ x ) & 0xFF;
493
Paul Bakker5c2364c2012-10-01 14:41:15 +0000494 FT0[i] = ( (uint32_t) y ) ^
495 ( (uint32_t) x << 8 ) ^
496 ( (uint32_t) x << 16 ) ^
497 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000498
Hanno Beckerad049a92017-06-19 16:31:54 +0100499#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000500 FT1[i] = ROTL8( FT0[i] );
501 FT2[i] = ROTL8( FT1[i] );
502 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100503#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000504
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300505#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 x = RSb[i];
507
Paul Bakker5c2364c2012-10-01 14:41:15 +0000508 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
509 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
510 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
511 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Hanno Beckerad049a92017-06-19 16:31:54 +0100513#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000514 RT1[i] = ROTL8( RT0[i] );
515 RT2[i] = ROTL8( RT1[i] );
516 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100517#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300518#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000519 }
520}
521
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200522#undef ROTL8
523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000525
Arto Kinnunen172836a2019-11-28 13:34:13 +0200526/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200527 * Randomize positions for AES SCA countermeasures if AES countermeasures are
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200528 * enabled. If the countermeasures are not enabled then we fill the given table
529 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200530 *
531 * Dummy rounds are added as follows:
532 * 1. One dummy round added to the initial round key addition (executed in
533 * random order).
534 * 2. Random number of dummy rounds added as first and/or last AES calculation
535 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
536 *
537 * Description of the bytes in the table are as follows:
538 * - 2 bytes for initial round key addition
539 * - remaining bytes for AES calculation with real or dummy data
540 *
541 * Each byte indicates one AES calculation round:
542 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
543 * -bit 2 = offset for even/odd rounds
544 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200545 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200546 * Return Number of additional AES rounds
547 *
548 * Example of the control bytes:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200549 * R = real data in actual AES calculation round
550 * Ri = Real data in initial round key addition phase
551 * F = fake data in actual AES calculation round
552 * Fi = fake data in initial round key addition phase
553 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200554 * 1. No countermeasures enabled and AES-128, only real data (R) used:
555 * | Ri | R | R | R | R | R | R | R | R | R | R |
556 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200557 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200558 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200559 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
560 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200561 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200562#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200563static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200564{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200565 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200567 mbedtls_platform_memset( tbl, 0, tbl_len );
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400568 // get random from 0x0fff
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200569 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200570
571 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200573 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200574 tbl[i++] = 0x10; // dummy data
575 tbl[i++] = 0x00 | 0x03; // real data + stop marker
576 } else {
577 tbl[i++] = 0x00; // real data
578 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200579 }
580
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200581 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200582 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200583 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200584
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200585 // randomize positions for the dummy rounds
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400586 num = ( num & 0x0fff ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200587
588 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200591 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200593
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200594 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200595 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200596 {
597 tbl[j] = 0x10; // dummy data
598 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200599
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200600 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200601 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200602 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200603 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200604 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200605 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200606 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200607 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200608 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200609 is_even_pos = 0;
610 }
611 else
612 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200613 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200614 is_even_pos = 1;
615 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200616 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200617 }
618 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200619
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200620 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
621 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
622
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200623 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200624}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200625#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200626
Hanno Beckerad049a92017-06-19 16:31:54 +0100627#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200628
629#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
630#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
631#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
632
633#define AES_RT0(idx) RT0[idx]
634#define AES_RT1(idx) ROTL8( RT0[idx] )
635#define AES_RT2(idx) ROTL16( RT0[idx] )
636#define AES_RT3(idx) ROTL24( RT0[idx] )
637
638#define AES_FT0(idx) FT0[idx]
639#define AES_FT1(idx) ROTL8( FT0[idx] )
640#define AES_FT2(idx) ROTL16( FT0[idx] )
641#define AES_FT3(idx) ROTL24( FT0[idx] )
642
Hanno Becker177d3cf2017-06-07 15:52:48 +0100643#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200644
645#define AES_RT0(idx) RT0[idx]
646#define AES_RT1(idx) RT1[idx]
647#define AES_RT2(idx) RT2[idx]
648#define AES_RT3(idx) RT3[idx]
649
650#define AES_FT0(idx) FT0[idx]
651#define AES_FT1(idx) FT1[idx]
652#define AES_FT2(idx) FT2[idx]
653#define AES_FT3(idx) FT3[idx]
654
Hanno Becker177d3cf2017-06-07 15:52:48 +0100655#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200658{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100659 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000660
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200661 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200662}
663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200665{
666 if( ctx == NULL )
667 return;
668
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500669 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200670}
671
Jaeden Amero9366feb2018-05-29 18:55:17 +0100672#if defined(MBEDTLS_CIPHER_MODE_XTS)
673void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
674{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100675 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000676
Jaeden Amero9366feb2018-05-29 18:55:17 +0100677 mbedtls_aes_init( &ctx->crypt );
678 mbedtls_aes_init( &ctx->tweak );
679}
680
681void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
682{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100683 if( ctx == NULL )
684 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000685
Jaeden Amero9366feb2018-05-29 18:55:17 +0100686 mbedtls_aes_free( &ctx->crypt );
687 mbedtls_aes_free( &ctx->tweak );
688}
689#endif /* MBEDTLS_CIPHER_MODE_XTS */
690
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400691#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400692static void mbedtls_generate_fake_key( unsigned int keybits, mbedtls_aes_context *ctx )
693{
694 unsigned int qword;
695
696 for( qword = keybits >> 5; qword > 0; qword-- )
697 {
698 ctx->frk[ qword - 1 ] = mbedtls_platform_random_uint32();
699 }
700}
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400701#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Andrzej Kureke78775e2020-07-02 10:57:00 -0400702
Paul Bakker5121ce52009-01-03 21:22:43 +0000703/*
704 * AES key schedule (encryption)
705 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200706#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200708 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000709{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200710 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200711 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200712 volatile unsigned int i = 0;
713 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000714 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200715 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000716
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100717 AES_VALIDATE_RET( ctx != NULL );
718 AES_VALIDATE_RET( key != NULL );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400719 (void) ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000720
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200721 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000722 {
723 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300724#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000725 case 192: ctx->nr = 12; break;
726 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300727#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200728 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000729 }
730
Simon Butcher5201e412018-12-06 17:40:14 +0000731#if !defined(MBEDTLS_AES_ROM_TABLES)
732 if( aes_init_done == 0 )
733 {
734 aes_gen_tables();
735 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000736 }
737#endif
738
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000740 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100741 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000742
743 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000745 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000746#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000747 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400748#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400749 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400750#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100753 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200754 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100755#endif
756
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400757 /* Three least significant bits are truncated from keybits, which is
758 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400759 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200760 offset = mbedtls_platform_random_in_range( keybits >> 5 );
761
762 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000763 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200764 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200765 flow_ctrl++;
766 }
767
768 for( j = 0; j < offset; j++ )
769 {
770 GET_UINT32_LE( RK[j], key, j << 2 );
771 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000772 }
773
774 switch( ctx->nr )
775 {
776 case 10:
777
778 for( i = 0; i < 10; i++, RK += 4 )
779 {
780 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000781 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
782 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
783 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
784 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000785
786 RK[5] = RK[1] ^ RK[4];
787 RK[6] = RK[2] ^ RK[5];
788 RK[7] = RK[3] ^ RK[6];
789 }
790 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300791#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000792 case 12:
793
794 for( i = 0; i < 8; i++, RK += 6 )
795 {
796 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000797 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
798 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
799 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
800 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000801
802 RK[7] = RK[1] ^ RK[6];
803 RK[8] = RK[2] ^ RK[7];
804 RK[9] = RK[3] ^ RK[8];
805 RK[10] = RK[4] ^ RK[9];
806 RK[11] = RK[5] ^ RK[10];
807 }
808 break;
809
810 case 14:
811
812 for( i = 0; i < 7; i++, RK += 8 )
813 {
814 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000815 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
816 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
817 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
818 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000819
820 RK[9] = RK[1] ^ RK[8];
821 RK[10] = RK[2] ^ RK[9];
822 RK[11] = RK[3] ^ RK[10];
823
824 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000825 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
826 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
827 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
828 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000829
830 RK[13] = RK[5] ^ RK[12];
831 RK[14] = RK[6] ^ RK[13];
832 RK[15] = RK[7] ^ RK[14];
833 }
834 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300835#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000836 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000837
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200838 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200839 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200840#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
841 || ( ctx->nr == 12 && i == 8 )
842 || ( ctx->nr == 14 && i == 7 )
843#endif
844 ) )
845 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400846#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -0400847 ctx->hash = mbedtls_hash( ctx->rk, keybits >> 3 );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400848#endif
849 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200850 }
851
Andrzej Kurekca609372020-07-08 03:19:02 -0400852 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200853 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000854}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200855#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000856
857/*
858 * AES key schedule (decryption)
859 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200860#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200862 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000863{
Arto Kinnunen14804442019-10-16 13:43:59 +0300864#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
865 (void) ctx;
866 (void) key;
867 (void) keybits;
868
869 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
870#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200871 volatile unsigned int i = 0, j = 0;
872 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000874 uint32_t *RK;
875 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200876
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100877 AES_VALIDATE_RET( ctx != NULL );
878 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200880 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000881
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200882#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000883 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100884 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000885
886 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200887 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000888 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000889#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000890 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400891#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400892 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400893#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000894
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200895 /* Also checks keybits */
896 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200897 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000898
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200899 ctx->nr = cty.nr;
900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100902 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100903 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100905 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200906 i = 0;
907 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200908 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100909 }
910#endif
911
Paul Bakker5121ce52009-01-03 21:22:43 +0000912 SK = cty.rk + cty.nr * 4;
913
914 *RK++ = *SK++;
915 *RK++ = *SK++;
916 *RK++ = *SK++;
917 *RK++ = *SK++;
918
919 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
920 {
921 for( j = 0; j < 4; j++, SK++ )
922 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200923 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
924 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
925 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
926 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000927 }
928 }
929
930 *RK++ = *SK++;
931 *RK++ = *SK++;
932 *RK++ = *SK++;
933 *RK++ = *SK++;
934
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200935exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000937
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200938 if( ret != 0 )
939 {
940 return( ret );
941 }
942 else if( ( i == 0 ) && ( j == 4 ) )
943 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400944#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -0400945 ctx->hash = mbedtls_hash( ctx->rk, keybits >> 3 );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400946#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200947 return( ret );
948 }
949 else
950 {
951 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
952 }
953
Arto Kinnunen14804442019-10-16 13:43:59 +0300954#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000955}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100956
957#if defined(MBEDTLS_CIPHER_MODE_XTS)
958static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
959 unsigned int keybits,
960 const unsigned char **key1,
961 unsigned int *key1bits,
962 const unsigned char **key2,
963 unsigned int *key2bits )
964{
965 const unsigned int half_keybits = keybits / 2;
966 const unsigned int half_keybytes = half_keybits / 8;
967
968 switch( keybits )
969 {
970 case 256: break;
971 case 512: break;
972 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
973 }
974
975 *key1bits = half_keybits;
976 *key2bits = half_keybits;
977 *key1 = &key[0];
978 *key2 = &key[half_keybytes];
979
980 return 0;
981}
982
983int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
984 const unsigned char *key,
985 unsigned int keybits)
986{
987 int ret;
988 const unsigned char *key1, *key2;
989 unsigned int key1bits, key2bits;
990
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100991 AES_VALIDATE_RET( ctx != NULL );
992 AES_VALIDATE_RET( key != NULL );
993
Jaeden Amero9366feb2018-05-29 18:55:17 +0100994 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
995 &key2, &key2bits );
996 if( ret != 0 )
997 return( ret );
998
999 /* Set the tweak key. Always set tweak key for the encryption mode. */
1000 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1001 if( ret != 0 )
1002 return( ret );
1003
1004 /* Set crypt key for encryption. */
1005 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
1006}
1007
1008int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
1009 const unsigned char *key,
1010 unsigned int keybits)
1011{
1012 int ret;
1013 const unsigned char *key1, *key2;
1014 unsigned int key1bits, key2bits;
1015
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +01001016 AES_VALIDATE_RET( ctx != NULL );
1017 AES_VALIDATE_RET( key != NULL );
1018
Jaeden Amero9366feb2018-05-29 18:55:17 +01001019 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
1020 &key2, &key2bits );
1021 if( ret != 0 )
1022 return( ret );
1023
1024 /* Set the tweak key. Always set tweak key for encryption. */
1025 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1026 if( ret != 0 )
1027 return( ret );
1028
1029 /* Set crypt key for decryption. */
1030 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
1031}
1032#endif /* MBEDTLS_CIPHER_MODE_XTS */
1033
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001034#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001035
Paul Bakker5121ce52009-01-03 21:22:43 +00001036/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001037 * AES-ECB block encryption
1038 */
1039#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001040
Arto Kinnunen311ab592020-01-16 17:20:51 +02001041#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001042static uint32_t *aes_fround( uint32_t *R,
1043 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1044 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1045{
1046 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1047 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1048 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1049 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1050
1051 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1052 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1053 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1054 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1055
1056 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1057 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1058 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1059 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1060
1061 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1062 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1063 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1064 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1065
1066 return R;
1067}
1068
1069static void aes_fround_final( uint32_t *R,
1070 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1071 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1072{
1073 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1074 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1075 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1076 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1077
1078 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1079 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1080 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1081 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1082
1083 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1084 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1085 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1086 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1087
1088 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1089 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1090 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1091 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1092}
1093
Andres AGf5bf7182017-03-03 14:09:56 +00001094int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1095 const unsigned char input[16],
1096 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001097{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001098 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001099 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001100 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001101 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001102 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001103 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001104 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001105 // control bytes for AES calculation rounds,
1106 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1107 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001108
Andrzej Kurekfba59212020-08-07 21:02:25 -04001109#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1110 unsigned key_bytes = 0;
Andrzej Kurek9539f832020-08-10 15:58:13 -04001111 uint32_t check_hash = 0;
Andrzej Kurekfba59212020-08-07 21:02:25 -04001112 switch( ctx->nr )
1113 {
1114 case 10: key_bytes = 16; break;
1115#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1116 case 12: key_bytes = 24; break;
1117 case 14: key_bytes = 32; break;
1118#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1119 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1120 }
Andrzej Kurek9539f832020-08-10 15:58:13 -04001121 check_hash = mbedtls_hash( ctx->rk, key_bytes );
Andrzej Kurekfba59212020-08-07 21:02:25 -04001122#endif
1123
Arto Kinnunen172836a2019-11-28 13:34:13 +02001124 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001125 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001126
Arto Kinnunen311ab592020-01-16 17:20:51 +02001127 aes_data_table[0] = &aes_data_real;
1128 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001129
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001130 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001131 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1132 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001133 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001134
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001135 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001136 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001137
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001138 // SCA countermeasure, randomize secret data location by initializing it in
1139 // a random order and writing randomized fake data between the real data
1140 // writes.
1141 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001142 i = offset;
1143 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001144 {
1145 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001146 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001147 flow_control++;
1148 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001149
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001150 tindex = 0;
1151 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001152 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001153 // Get pointer to the real or fake data
1154 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1155 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001156
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001157 // initial round key addition
1158 for( i = 0; i < 4; i++ )
1159 {
1160 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1161 }
1162 tindex++;
1163 flow_control++;
1164 } while( stop_mark == 0 );
1165
1166 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1167 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001168 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001169 // Get pointer to the real or fake data
1170 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1171 offset = round_ctrl_table[tindex] & 0x04;
1172 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001173
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001174 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1175 &aes_data_ptr->xy_values[0 + offset],
1176 &aes_data_ptr->xy_values[1 + offset],
1177 &aes_data_ptr->xy_values[2 + offset],
1178 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001179 aes_data_ptr->xy_values[4 - offset],
1180 aes_data_ptr->xy_values[5 - offset],
1181 aes_data_ptr->xy_values[6 - offset],
1182 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001183 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001184 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001185 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001186
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001187 // Calculate final AES round + dummy rounds
1188 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001189 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001190 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1191 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001192 aes_fround_final( aes_data_ptr->rk_ptr,
1193 &aes_data_ptr->xy_values[0],
1194 &aes_data_ptr->xy_values[1],
1195 &aes_data_ptr->xy_values[2],
1196 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001197 aes_data_ptr->xy_values[4],
1198 aes_data_ptr->xy_values[5],
1199 aes_data_ptr->xy_values[6],
1200 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001201 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001202 tindex++;
1203 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001204
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001205 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001206 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001207
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001208 // SCA countermeasure, randomize secret data location by writing to it in
1209 // a random order.
1210 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001211 i = offset;
1212 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001213 {
1214 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1215 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001216 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001217
Andrzej Kurekfba59212020-08-07 21:02:25 -04001218 /* Double negation is used to silence an "extraneous parentheses" warning */
1219 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1220#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -04001221 && check_hash == ctx->hash
Andrzej Kurekfba59212020-08-07 21:02:25 -04001222#endif
1223 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001224 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001225#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1226 mbedtls_platform_random_delay();
Andrzej Kurek9539f832020-08-10 15:58:13 -04001227 if( mbedtls_hash( ctx->rk, key_bytes ) == ctx->hash )
Andrzej Kurekfba59212020-08-07 21:02:25 -04001228#endif
1229 {
1230 return 0;
1231 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001232 }
1233
Andrzej Kurekca609372020-07-08 03:19:02 -04001234 // Clear the output in case of a FI
1235 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001236 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001237}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001238
1239#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1240
1241#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1242 do \
1243 { \
1244 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1245 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1246 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1247 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1248 \
1249 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1250 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1251 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1252 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1253 \
1254 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1255 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1256 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1257 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1258 \
1259 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1260 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1261 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1262 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1263 } while( 0 )
1264
1265int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1266 const unsigned char input[16],
1267 unsigned char output[16] )
1268{
1269 int i;
1270 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1271
1272 RK = ctx->rk;
1273
1274 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1275 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1276 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1277 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1278
1279 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1280 {
1281 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1282 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1283 }
1284
1285 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1286
1287 X0 = *RK++ ^ \
1288 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1289 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1290 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1291 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1292
1293 X1 = *RK++ ^ \
1294 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1295 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1296 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1297 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1298
1299 X2 = *RK++ ^ \
1300 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1301 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1302 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1303 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1304
1305 X3 = *RK++ ^ \
1306 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1307 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1308 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1309 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1310
1311 PUT_UINT32_LE( X0, output, 0 );
1312 PUT_UINT32_LE( X1, output, 4 );
1313 PUT_UINT32_LE( X2, output, 8 );
1314 PUT_UINT32_LE( X3, output, 12 );
1315
Andrzej Kureka8405442019-11-12 03:34:03 -05001316 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1317 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1318 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1319 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1320
1321 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1322 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1323 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1324 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1325
1326 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1327
Arto Kinnunen311ab592020-01-16 17:20:51 +02001328 return( 0 );
1329}
1330#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001331#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1332
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001333#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001334void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1335 const unsigned char input[16],
1336 unsigned char output[16] )
1337{
1338 mbedtls_internal_aes_encrypt( ctx, input, output );
1339}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001340#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001341
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001342/*
1343 * AES-ECB block decryption
1344 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001345
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001346#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001347#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001348
Arto Kinnunen311ab592020-01-16 17:20:51 +02001349#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001350static uint32_t *aes_rround( uint32_t *R,
1351 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1352 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1353{
1354 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1355 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1356 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1357 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1358
1359 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1360 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1361 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1362 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1363
1364 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1365 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1366 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1367 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1368
1369 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1370 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1371 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1372 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1373 return R;
1374}
1375
1376static void aes_rround_final( uint32_t *R,
1377 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1378 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1379{
1380 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1381 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1382 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1383 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1384
1385 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1386 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1387 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1388 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1389
1390 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1391 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1392 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1393 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1394
1395 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1396 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1397 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1398 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1399}
1400
Andres AGf5bf7182017-03-03 14:09:56 +00001401int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1402 const unsigned char input[16],
1403 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001404{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001405 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001406 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001407 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001408 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001409 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001410 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001411 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001412 // control bytes for AES calculation rounds,
1413 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1414 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001415
Andrzej Kurekfba59212020-08-07 21:02:25 -04001416#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1417 unsigned key_bytes = 0;
Andrzej Kurek9539f832020-08-10 15:58:13 -04001418 uint32_t check_hash = 0;
Andrzej Kurekfba59212020-08-07 21:02:25 -04001419 switch( ctx->nr )
1420 {
1421 case 10: key_bytes = 16; break;
1422#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1423 case 12: key_bytes = 24; break;
1424 case 14: key_bytes = 32; break;
1425#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1426 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1427 }
Andrzej Kurek9539f832020-08-10 15:58:13 -04001428 check_hash = mbedtls_hash( ctx->rk, key_bytes );
Andrzej Kurekfba59212020-08-07 21:02:25 -04001429#endif
1430
Arto Kinnunen172836a2019-11-28 13:34:13 +02001431 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001432 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001433
Arto Kinnunen311ab592020-01-16 17:20:51 +02001434 aes_data_table[0] = &aes_data_real;
1435 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001436
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001437 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001438 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001439 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001440 flow_control = dummy_rounds;
1441
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001442 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001443 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001444
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001445 // SCA countermeasure, randomize secret data location by initializing it in
1446 // a random order and writing randomized fake data between the real data
1447 // writes.
1448 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001449 i = offset;
1450 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001451 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001452 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001453 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001454 flow_control++;
1455 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001456
1457 tindex = 0;
1458 do
1459 {
1460 // Get pointer to the real or fake data
1461 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1462 stop_mark = round_ctrl_table[tindex] & 0x03;
1463
1464 // initial round key addition
1465 for( i = 0; i < 4; i++ )
1466 {
1467 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1468 }
1469 tindex++;
1470 flow_control++;
1471 } while( stop_mark == 0 );
1472
1473 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1474 do
1475 {
1476 // Get pointer to the real or fake data
1477 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1478 offset = round_ctrl_table[tindex] & 0x04;
1479 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001480
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001481 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1482 &aes_data_ptr->xy_values[0 + offset],
1483 &aes_data_ptr->xy_values[1 + offset],
1484 &aes_data_ptr->xy_values[2 + offset],
1485 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001486 aes_data_ptr->xy_values[4 - offset],
1487 aes_data_ptr->xy_values[5 - offset],
1488 aes_data_ptr->xy_values[6 - offset],
1489 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001490 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001491 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001492 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001493
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001494 // Calculate final AES round + dummy rounds
1495 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001496 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001497 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1498 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001499 aes_rround_final( aes_data_ptr->rk_ptr,
1500 &aes_data_ptr->xy_values[0],
1501 &aes_data_ptr->xy_values[1],
1502 &aes_data_ptr->xy_values[2],
1503 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001504 aes_data_ptr->xy_values[4],
1505 aes_data_ptr->xy_values[5],
1506 aes_data_ptr->xy_values[6],
1507 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001508 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001509 tindex++;
1510 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001511
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001512 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001513 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001514
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001515 // SCA countermeasure, randomize secret data location by writing to it in
1516 // a random order.
1517 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001518 i = offset;
1519 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001520 {
1521 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001522 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001523 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001524
Andrzej Kurekfba59212020-08-07 21:02:25 -04001525 /* Double negation is used to silence an "extraneous parentheses" warning */
1526 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1527#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -04001528 && check_hash == ctx->hash
Andrzej Kurekfba59212020-08-07 21:02:25 -04001529#endif
1530 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001531 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001532#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1533 mbedtls_platform_random_delay();
Andrzej Kurek9539f832020-08-10 15:58:13 -04001534 if( mbedtls_hash( ctx->rk, key_bytes ) == ctx->hash )
Andrzej Kurekfba59212020-08-07 21:02:25 -04001535#endif
1536 {
1537 return 0;
1538 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001539 }
1540
Andrzej Kurekca609372020-07-08 03:19:02 -04001541 // Clear the output in case of a FI
1542 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001543 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001544}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001545
1546#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1547
1548#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1549 do \
1550 { \
1551 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1552 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1553 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1554 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1555 \
1556 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1557 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1558 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1559 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1560 \
1561 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1562 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1563 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1564 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1565 \
1566 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1567 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1568 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1569 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1570 } while( 0 )
1571
1572int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1573 const unsigned char input[16],
1574 unsigned char output[16] )
1575{
1576 int i;
1577 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1578
1579 RK = ctx->rk;
1580
1581 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1582 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1583 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1584 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1585
1586 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1587 {
1588 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1589 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1590 }
1591
1592 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1593
1594 X0 = *RK++ ^ \
1595 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1596 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1597 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1598 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1599
1600 X1 = *RK++ ^ \
1601 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1602 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1603 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1604 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1605
1606 X2 = *RK++ ^ \
1607 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1608 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1609 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1610 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1611
1612 X3 = *RK++ ^ \
1613 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1614 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1615 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1616 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1617
1618 PUT_UINT32_LE( X0, output, 0 );
1619 PUT_UINT32_LE( X1, output, 4 );
1620 PUT_UINT32_LE( X2, output, 8 );
1621 PUT_UINT32_LE( X3, output, 12 );
1622
Andrzej Kureka8405442019-11-12 03:34:03 -05001623 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1624 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1625 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1626 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1627
1628 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1629 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1630 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1631 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1632
1633 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1634
Arto Kinnunen311ab592020-01-16 17:20:51 +02001635 return( 0 );
1636}
1637#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1638
Arto Kinnunen14804442019-10-16 13:43:59 +03001639#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001640#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1641
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001642#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001643void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1644 const unsigned char input[16],
1645 unsigned char output[16] )
1646{
Arto Kinnunen14804442019-10-16 13:43:59 +03001647#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1648 (void) ctx;
1649 (void) input;
1650 (void) output;
1651#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001652 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001653#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001654}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001655#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001656
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001657/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001658 * AES-ECB block encryption/decryption
1659 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001660int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001661 int mode,
1662 const unsigned char input[16],
1663 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001664{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001665 AES_VALIDATE_RET( ctx != NULL );
1666 AES_VALIDATE_RET( input != NULL );
1667 AES_VALIDATE_RET( output != NULL );
1668 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1669 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001670 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001673 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001675#endif
1676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001677#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001678 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001679 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001680 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001681 return( 0 );
1682
1683 // If padlock data misaligned, we just fall back to
1684 // unaccelerated mode
1685 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001686 }
1687#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001688
Arto Kinnunen14804442019-10-16 13:43:59 +03001689#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1690 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1691#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001693 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001694 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001695 else
Andres AGf5bf7182017-03-03 14:09:56 +00001696 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001697#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001698}
1699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001700#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001701/*
1702 * AES-CBC buffer encryption/decryption
1703 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001704int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001705 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001706 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001707 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001708 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001709 unsigned char *output )
1710{
1711 int i;
1712 unsigned char temp[16];
1713
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001714 AES_VALIDATE_RET( ctx != NULL );
1715 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1716 mode == MBEDTLS_AES_DECRYPT );
1717 AES_VALIDATE_RET( iv != NULL );
1718 AES_VALIDATE_RET( input != NULL );
1719 AES_VALIDATE_RET( output != NULL );
1720
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001721 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001722 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001724#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001725 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001726 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001727 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001728 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001729
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001730 // If padlock data misaligned, we just fall back to
1731 // unaccelerated mode
1732 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001733 }
1734#endif
1735
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001736 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001737 {
1738 while( length > 0 )
1739 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001740 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001741 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001742
1743 for( i = 0; i < 16; i++ )
1744 output[i] = (unsigned char)( output[i] ^ iv[i] );
1745
Teppo Järvelin91d79382019-10-02 09:09:31 +03001746 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001747
1748 input += 16;
1749 output += 16;
1750 length -= 16;
1751 }
1752 }
1753 else
1754 {
1755 while( length > 0 )
1756 {
1757 for( i = 0; i < 16; i++ )
1758 output[i] = (unsigned char)( input[i] ^ iv[i] );
1759
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001760 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001761 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001762
1763 input += 16;
1764 output += 16;
1765 length -= 16;
1766 }
1767 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001768
1769 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001770}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001771#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001772
Aorimn5f778012016-06-09 23:22:58 +02001773#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001774
1775/* Endianess with 64 bits values */
1776#ifndef GET_UINT64_LE
1777#define GET_UINT64_LE(n,b,i) \
1778{ \
1779 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1780 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1781 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1782 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1783 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1784 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1785 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1786 | ( (uint64_t) (b)[(i) ] ); \
1787}
1788#endif
1789
1790#ifndef PUT_UINT64_LE
1791#define PUT_UINT64_LE(n,b,i) \
1792{ \
1793 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1794 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1795 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1796 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1797 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1798 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1799 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1800 (b)[(i) ] = (unsigned char) ( (n) ); \
1801}
1802#endif
1803
1804typedef unsigned char mbedtls_be128[16];
1805
1806/*
1807 * GF(2^128) multiplication function
1808 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001809 * This function multiplies a field element by x in the polynomial field
1810 * representation. It uses 64-bit word operations to gain speed but compensates
1811 * for machine endianess and hence works correctly on both big and little
1812 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001813 */
1814static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001815 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001816{
1817 uint64_t a, b, ra, rb;
1818
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001819 GET_UINT64_LE( a, x, 0 );
1820 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001821
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001822 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1823 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001824
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001825 PUT_UINT64_LE( ra, r, 0 );
1826 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001827}
1828
Aorimn5f778012016-06-09 23:22:58 +02001829/*
1830 * AES-XTS buffer encryption/decryption
1831 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001832int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1833 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001834 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001835 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001836 const unsigned char *input,
1837 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001838{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001839 int ret;
1840 size_t blocks = length / 16;
1841 size_t leftover = length % 16;
1842 unsigned char tweak[16];
1843 unsigned char prev_tweak[16];
1844 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001845
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001846 AES_VALIDATE_RET( ctx != NULL );
1847 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1848 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001849 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001850 AES_VALIDATE_RET( input != NULL );
1851 AES_VALIDATE_RET( output != NULL );
1852
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001853 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001854 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001855 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001856
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001857 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001858 if( length > ( 1 << 20 ) * 16 )
1859 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001860
Jaeden Amerod82cd862018-04-28 15:02:45 +01001861 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001862 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1863 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001864 if( ret != 0 )
1865 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001866
Jaeden Amerod82cd862018-04-28 15:02:45 +01001867 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001868 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001869 size_t i;
1870
1871 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1872 {
1873 /* We are on the last block in a decrypt operation that has
1874 * leftover bytes, so we need to use the next tweak for this block,
1875 * and this tweak for the lefover bytes. Save the current tweak for
1876 * the leftovers and then update the current tweak for use on this,
1877 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001878 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001879 mbedtls_gf128mul_x_ble( tweak, tweak );
1880 }
1881
1882 for( i = 0; i < 16; i++ )
1883 tmp[i] = input[i] ^ tweak[i];
1884
1885 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1886 if( ret != 0 )
1887 return( ret );
1888
1889 for( i = 0; i < 16; i++ )
1890 output[i] = tmp[i] ^ tweak[i];
1891
1892 /* Update the tweak for the next block. */
1893 mbedtls_gf128mul_x_ble( tweak, tweak );
1894
1895 output += 16;
1896 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001897 }
1898
Jaeden Amerod82cd862018-04-28 15:02:45 +01001899 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001900 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001901 /* If we are on the leftover bytes in a decrypt operation, we need to
1902 * use the previous tweak for these bytes (as saved in prev_tweak). */
1903 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001904
Jaeden Amerod82cd862018-04-28 15:02:45 +01001905 /* We are now on the final part of the data unit, which doesn't divide
1906 * evenly by 16. It's time for ciphertext stealing. */
1907 size_t i;
1908 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001909
Jaeden Amerod82cd862018-04-28 15:02:45 +01001910 /* Copy ciphertext bytes from the previous block to our output for each
1911 * byte of cyphertext we won't steal. At the same time, copy the
1912 * remainder of the input for this final round (since the loop bounds
1913 * are the same). */
1914 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001915 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001916 output[i] = prev_output[i];
1917 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001918 }
Aorimn5f778012016-06-09 23:22:58 +02001919
Jaeden Amerod82cd862018-04-28 15:02:45 +01001920 /* Copy ciphertext bytes from the previous block for input in this
1921 * round. */
1922 for( ; i < 16; i++ )
1923 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001924
Jaeden Amerod82cd862018-04-28 15:02:45 +01001925 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1926 if( ret != 0 )
1927 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001928
Jaeden Amerod82cd862018-04-28 15:02:45 +01001929 /* Write the result back to the previous block, overriding the previous
1930 * output we copied. */
1931 for( i = 0; i < 16; i++ )
1932 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001933 }
1934
1935 return( 0 );
1936}
1937#endif /* MBEDTLS_CIPHER_MODE_XTS */
1938
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001939#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001940/*
1941 * AES-CFB128 buffer encryption/decryption
1942 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001943int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001944 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001945 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001946 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001947 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001948 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001949 unsigned char *output )
1950{
Paul Bakker27fdf462011-06-09 13:55:13 +00001951 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001952 size_t n;
1953
1954 AES_VALIDATE_RET( ctx != NULL );
1955 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1956 mode == MBEDTLS_AES_DECRYPT );
1957 AES_VALIDATE_RET( iv_off != NULL );
1958 AES_VALIDATE_RET( iv != NULL );
1959 AES_VALIDATE_RET( input != NULL );
1960 AES_VALIDATE_RET( output != NULL );
1961
1962 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001963
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001964 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001965 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001967 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001968 {
1969 while( length-- )
1970 {
1971 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001972 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001973
1974 c = *input++;
1975 *output++ = (unsigned char)( c ^ iv[n] );
1976 iv[n] = (unsigned char) c;
1977
Paul Bakker66d5d072014-06-17 16:39:18 +02001978 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001979 }
1980 }
1981 else
1982 {
1983 while( length-- )
1984 {
1985 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001986 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001987
1988 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1989
Paul Bakker66d5d072014-06-17 16:39:18 +02001990 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001991 }
1992 }
1993
1994 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001995
1996 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001997}
Paul Bakker556efba2014-01-24 15:38:12 +01001998
1999/*
2000 * AES-CFB8 buffer encryption/decryption
2001 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002002int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01002003 int mode,
2004 size_t length,
2005 unsigned char iv[16],
2006 const unsigned char *input,
2007 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01002008{
2009 unsigned char c;
2010 unsigned char ov[17];
2011
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01002012 AES_VALIDATE_RET( ctx != NULL );
2013 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
2014 mode == MBEDTLS_AES_DECRYPT );
2015 AES_VALIDATE_RET( iv != NULL );
2016 AES_VALIDATE_RET( input != NULL );
2017 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01002018 while( length-- )
2019 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03002020 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002021 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01002022
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002023 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002024 ov[16] = *input;
2025
2026 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
2027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002028 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002029 ov[16] = c;
2030
Teppo Järvelin91d79382019-10-02 09:09:31 +03002031 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01002032 }
2033
2034 return( 0 );
2035}
Simon Butcher76a5b222018-04-22 22:57:27 +01002036#endif /* MBEDTLS_CIPHER_MODE_CFB */
2037
2038#if defined(MBEDTLS_CIPHER_MODE_OFB)
2039/*
2040 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
2041 */
2042int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01002043 size_t length,
2044 size_t *iv_off,
2045 unsigned char iv[16],
2046 const unsigned char *input,
2047 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01002048{
Simon Butcherad4e4932018-04-29 00:43:47 +01002049 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01002050 size_t n;
2051
2052 AES_VALIDATE_RET( ctx != NULL );
2053 AES_VALIDATE_RET( iv_off != NULL );
2054 AES_VALIDATE_RET( iv != NULL );
2055 AES_VALIDATE_RET( input != NULL );
2056 AES_VALIDATE_RET( output != NULL );
2057
2058 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01002059
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01002060 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01002061 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2062
Simon Butcher76a5b222018-04-22 22:57:27 +01002063 while( length-- )
2064 {
2065 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002066 {
2067 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
2068 if( ret != 0 )
2069 goto exit;
2070 }
Simon Butcher76a5b222018-04-22 22:57:27 +01002071 *output++ = *input++ ^ iv[n];
2072
2073 n = ( n + 1 ) & 0x0F;
2074 }
2075
2076 *iv_off = n;
2077
Simon Butcherad4e4932018-04-29 00:43:47 +01002078exit:
2079 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002080}
2081#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002083#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002084/*
2085 * AES-CTR buffer encryption/decryption
2086 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002087int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002088 size_t length,
2089 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002090 unsigned char nonce_counter[16],
2091 unsigned char stream_block[16],
2092 const unsigned char *input,
2093 unsigned char *output )
2094{
Paul Bakker369e14b2012-04-18 14:16:09 +00002095 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002096 size_t n;
2097
2098 AES_VALIDATE_RET( ctx != NULL );
2099 AES_VALIDATE_RET( nc_off != NULL );
2100 AES_VALIDATE_RET( nonce_counter != NULL );
2101 AES_VALIDATE_RET( stream_block != NULL );
2102 AES_VALIDATE_RET( input != NULL );
2103 AES_VALIDATE_RET( output != NULL );
2104
2105 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002106
Arto Kinnunen75439012019-12-03 14:12:10 +02002107 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002108 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2109
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002110 while( length-- )
2111 {
2112 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002113 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002114
Paul Bakker369e14b2012-04-18 14:16:09 +00002115 for( i = 16; i > 0; i-- )
2116 if( ++nonce_counter[i - 1] != 0 )
2117 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002118 }
2119 c = *input++;
2120 *output++ = (unsigned char)( c ^ stream_block[n] );
2121
Paul Bakker66d5d072014-06-17 16:39:18 +02002122 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002123 }
2124
2125 *nc_off = n;
2126
2127 return( 0 );
2128}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002129#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002130
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002131#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002133#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002134/*
2135 * AES test vectors from:
2136 *
2137 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2138 */
2139static const unsigned char aes_test_ecb_dec[3][16] =
2140{
2141 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2142 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2143 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2144 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2145 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2146 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2147};
2148
2149static const unsigned char aes_test_ecb_enc[3][16] =
2150{
2151 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2152 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2153 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2154 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2155 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2156 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2157};
2158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002159#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002160static const unsigned char aes_test_cbc_dec[3][16] =
2161{
2162 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2163 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2164 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2165 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2166 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2167 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2168};
2169
2170static const unsigned char aes_test_cbc_enc[3][16] =
2171{
2172 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2173 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2174 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2175 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2176 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2177 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2178};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002179#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002181#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002182/*
2183 * AES-CFB128 test vectors from:
2184 *
2185 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2186 */
2187static const unsigned char aes_test_cfb128_key[3][32] =
2188{
2189 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2190 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2191 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2192 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2193 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2194 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2195 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2196 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2197 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2198};
2199
2200static const unsigned char aes_test_cfb128_iv[16] =
2201{
2202 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2203 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2204};
2205
2206static const unsigned char aes_test_cfb128_pt[64] =
2207{
2208 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2209 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2210 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2211 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2212 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2213 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2214 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2215 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2216};
2217
2218static const unsigned char aes_test_cfb128_ct[3][64] =
2219{
2220 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2221 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2222 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2223 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2224 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2225 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2226 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2227 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2228 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2229 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2230 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2231 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2232 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2233 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2234 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2235 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2236 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2237 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2238 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2239 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2240 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2241 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2242 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2243 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2244};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002246
Simon Butcherad4e4932018-04-29 00:43:47 +01002247#if defined(MBEDTLS_CIPHER_MODE_OFB)
2248/*
2249 * AES-OFB test vectors from:
2250 *
Simon Butcher5db13622018-06-04 22:11:25 +01002251 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002252 */
2253static const unsigned char aes_test_ofb_key[3][32] =
2254{
2255 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2256 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2257 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2258 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2259 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2260 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2261 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2262 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2263 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2264};
2265
2266static const unsigned char aes_test_ofb_iv[16] =
2267{
2268 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2269 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2270};
2271
2272static const unsigned char aes_test_ofb_pt[64] =
2273{
2274 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2275 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2276 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2277 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2278 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2279 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2280 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2281 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2282};
2283
2284static const unsigned char aes_test_ofb_ct[3][64] =
2285{
2286 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2287 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2288 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2289 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2290 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2291 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2292 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2293 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2294 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2295 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2296 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2297 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2298 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2299 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2300 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2301 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2302 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2303 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2304 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2305 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2306 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2307 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2308 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2309 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2310};
2311#endif /* MBEDTLS_CIPHER_MODE_OFB */
2312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002313#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002314/*
2315 * AES-CTR test vectors from:
2316 *
2317 * http://www.faqs.org/rfcs/rfc3686.html
2318 */
2319
2320static const unsigned char aes_test_ctr_key[3][16] =
2321{
2322 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2323 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2324 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2325 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2326 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2327 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2328};
2329
2330static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2331{
2332 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2334 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2335 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2336 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2337 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2338};
2339
2340static const unsigned char aes_test_ctr_pt[3][48] =
2341{
2342 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2343 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2344
2345 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2346 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2347 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2348 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2349
2350 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2351 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2352 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2353 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2354 0x20, 0x21, 0x22, 0x23 }
2355};
2356
2357static const unsigned char aes_test_ctr_ct[3][48] =
2358{
2359 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2360 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2361 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2362 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2363 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2364 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2365 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2366 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2367 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2368 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2369 0x25, 0xB2, 0x07, 0x2F }
2370};
2371
2372static const int aes_test_ctr_len[3] =
2373 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002374#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002375
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002376#if defined(MBEDTLS_CIPHER_MODE_XTS)
2377/*
2378 * AES-XTS test vectors from:
2379 *
2380 * IEEE P1619/D16 Annex B
2381 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2382 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2383 */
2384static const unsigned char aes_test_xts_key[][32] =
2385{
2386 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2390 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2391 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2392 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2393 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2394 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2395 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2396 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2397 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2398};
2399
2400static const unsigned char aes_test_xts_pt32[][32] =
2401{
2402 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2406 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2407 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2408 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2409 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2410 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2411 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2412 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2413 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2414};
2415
2416static const unsigned char aes_test_xts_ct32[][32] =
2417{
2418 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2419 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2420 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2421 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2422 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2423 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2424 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2425 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2426 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2427 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2428 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2429 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2430};
2431
2432static const unsigned char aes_test_xts_data_unit[][16] =
2433{
2434 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2436 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2438 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2440};
2441
2442#endif /* MBEDTLS_CIPHER_MODE_XTS */
2443
Paul Bakker5121ce52009-01-03 21:22:43 +00002444/*
2445 * Checkup routine
2446 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002447int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002448{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002449 int ret = 0, i, j, u, mode;
2450 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002451 unsigned char key[32];
2452 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002453 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002454#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002455 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002456#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002457#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002458 unsigned char prv[16];
2459#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002460#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2461 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002462 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002463#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002464#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002465 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002466#endif
2467#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002468 unsigned char nonce_counter[16];
2469 unsigned char stream_block[16];
2470#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002471 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002472
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002473 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002474 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002475
2476 /*
2477 * ECB mode
2478 */
2479 for( i = 0; i < 6; i++ )
2480 {
2481 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002482 keybits = 128 + u * 64;
2483 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002484
2485 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002486 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2487 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002488
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002489#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2490 if( keybits > 128 )
2491 {
2492 mbedtls_printf( "skipped\n" );
2493 continue;
2494 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002495#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2496
2497#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2498 if( mode == MBEDTLS_AES_DECRYPT )
2499 {
2500 mbedtls_printf( "skipped\n" );
2501 continue;
2502 }
2503#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002504
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002505 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002506
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002507 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002508 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002509 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2510 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002511 }
2512 else
2513 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002514 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2515 aes_tests = aes_test_ecb_enc[u];
2516 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002517
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002518 /*
2519 * AES-192 is an optional feature that may be unavailable when
2520 * there is an alternative underlying implementation i.e. when
2521 * MBEDTLS_AES_ALT is defined.
2522 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002523 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002524 {
2525 mbedtls_printf( "skipped\n" );
2526 continue;
2527 }
2528 else if( ret != 0 )
2529 {
2530 goto exit;
2531 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002532
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002533 for( j = 0; j < 10000; j++ )
2534 {
2535 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2536 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002537 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002538 }
2539
2540 if( memcmp( buf, aes_tests, 16 ) != 0 )
2541 {
2542 ret = 1;
2543 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002544 }
2545
2546 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002547 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002548 }
2549
2550 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002551 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002553#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002554 /*
2555 * CBC mode
2556 */
2557 for( i = 0; i < 6; i++ )
2558 {
2559 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002560 keybits = 128 + u * 64;
2561 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002562
2563 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002564 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2565 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002566
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002567#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2568 if( keybits > 128 )
2569 {
2570 mbedtls_printf( "skipped\n" );
2571 continue;
2572 }
2573#endif
2574
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002575#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2576 if( mode == MBEDTLS_AES_DECRYPT )
2577 {
2578 mbedtls_printf( "skipped\n" );
2579 continue;
2580 }
2581#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2582
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002583 memset( iv , 0, 16 );
2584 memset( prv, 0, 16 );
2585 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002586
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002587 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002588 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002589 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2590 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002591 }
2592 else
2593 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002594 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2595 aes_tests = aes_test_cbc_enc[u];
2596 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002597
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002598 /*
2599 * AES-192 is an optional feature that may be unavailable when
2600 * there is an alternative underlying implementation i.e. when
2601 * MBEDTLS_AES_ALT is defined.
2602 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002603 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002604 {
2605 mbedtls_printf( "skipped\n" );
2606 continue;
2607 }
2608 else if( ret != 0 )
2609 {
2610 goto exit;
2611 }
2612
2613 for( j = 0; j < 10000; j++ )
2614 {
2615 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002616 {
2617 unsigned char tmp[16];
2618
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002619 memcpy( tmp, prv, 16 );
2620 memcpy( prv, buf, 16 );
2621 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002622 }
2623
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002624 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2625 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002626 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002627
2628 }
2629
2630 if( memcmp( buf, aes_tests, 16 ) != 0 )
2631 {
2632 ret = 1;
2633 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002634 }
2635
2636 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002637 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002638 }
2639
2640 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641 mbedtls_printf( "\n" );
2642#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002644#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002645 /*
2646 * CFB128 mode
2647 */
2648 for( i = 0; i < 6; i++ )
2649 {
2650 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002651 keybits = 128 + u * 64;
2652 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002653
2654 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002655 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2656 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002657
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002658#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2659 if( keybits > 128 )
2660 {
2661 mbedtls_printf( "skipped\n" );
2662 continue;
2663 }
2664#endif
2665
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002666#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2667 if( mode == MBEDTLS_AES_DECRYPT )
2668 {
2669 mbedtls_printf( "skipped\n" );
2670 continue;
2671 }
2672#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2673
Paul Bakker5121ce52009-01-03 21:22:43 +00002674 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002675 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002676
2677 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002678 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002679 /*
2680 * AES-192 is an optional feature that may be unavailable when
2681 * there is an alternative underlying implementation i.e. when
2682 * MBEDTLS_AES_ALT is defined.
2683 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002684 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002685 {
2686 mbedtls_printf( "skipped\n" );
2687 continue;
2688 }
2689 else if( ret != 0 )
2690 {
2691 goto exit;
2692 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002693
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002694 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002695 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002696 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002697 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002698 }
2699 else
2700 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002701 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002702 aes_tests = aes_test_cfb128_ct[u];
2703 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002704
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002705 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2706 if( ret != 0 )
2707 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002708
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002709 if( memcmp( buf, aes_tests, 64 ) != 0 )
2710 {
2711 ret = 1;
2712 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002713 }
2714
2715 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002716 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002717 }
2718
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002719 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002720 mbedtls_printf( "\n" );
2721#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002722
Simon Butcherad4e4932018-04-29 00:43:47 +01002723#if defined(MBEDTLS_CIPHER_MODE_OFB)
2724 /*
2725 * OFB mode
2726 */
2727 for( i = 0; i < 6; i++ )
2728 {
2729 u = i >> 1;
2730 keybits = 128 + u * 64;
2731 mode = i & 1;
2732
2733 if( verbose != 0 )
2734 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2735 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2736
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002737#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2738 if( keybits > 128 )
2739 {
2740 mbedtls_printf( "skipped\n" );
2741 continue;
2742 }
2743#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002744
2745#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2746 if( mode == MBEDTLS_AES_DECRYPT )
2747 {
2748 mbedtls_printf( "skipped\n" );
2749 continue;
2750 }
2751#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2752
Simon Butcherad4e4932018-04-29 00:43:47 +01002753 memcpy( iv, aes_test_ofb_iv, 16 );
2754 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2755
2756 offset = 0;
2757 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2758 /*
2759 * AES-192 is an optional feature that may be unavailable when
2760 * there is an alternative underlying implementation i.e. when
2761 * MBEDTLS_AES_ALT is defined.
2762 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002763 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002764 {
2765 mbedtls_printf( "skipped\n" );
2766 continue;
2767 }
2768 else if( ret != 0 )
2769 {
2770 goto exit;
2771 }
2772
2773 if( mode == MBEDTLS_AES_DECRYPT )
2774 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002775 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002776 aes_tests = aes_test_ofb_pt;
2777 }
2778 else
2779 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002780 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002781 aes_tests = aes_test_ofb_ct[u];
2782 }
2783
2784 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2785 if( ret != 0 )
2786 goto exit;
2787
2788 if( memcmp( buf, aes_tests, 64 ) != 0 )
2789 {
2790 ret = 1;
2791 goto exit;
2792 }
2793
2794 if( verbose != 0 )
2795 mbedtls_printf( "passed\n" );
2796 }
2797
2798 if( verbose != 0 )
2799 mbedtls_printf( "\n" );
2800#endif /* MBEDTLS_CIPHER_MODE_OFB */
2801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002802#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002803 /*
2804 * CTR mode
2805 */
2806 for( i = 0; i < 6; i++ )
2807 {
2808 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002809 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002810
2811 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002812 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002813 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002814
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002815#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2816 if( keybits > 128 )
2817 {
2818 mbedtls_printf( "skipped\n" );
2819 continue;
2820 }
2821#endif
2822
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002823#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2824 if( mode == MBEDTLS_AES_DECRYPT )
2825 {
2826 mbedtls_printf( "skipped\n" );
2827 continue;
2828 }
2829#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2830
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002831 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2832 memcpy( key, aes_test_ctr_key[u], 16 );
2833
2834 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002835 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2836 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002837
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002838 len = aes_test_ctr_len[u];
2839
2840 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002841 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002842 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002843 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002844 }
2845 else
2846 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002847 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002848 aes_tests = aes_test_ctr_ct[u];
2849 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002850
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002851 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2852 stream_block, buf, buf );
2853 if( ret != 0 )
2854 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002855
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002856 if( memcmp( buf, aes_tests, len ) != 0 )
2857 {
2858 ret = 1;
2859 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002860 }
2861
2862 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002863 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002864 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002865
2866 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002867 mbedtls_printf( "\n" );
2868#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002869
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002870#if defined(MBEDTLS_CIPHER_MODE_XTS)
2871 {
2872 static const int num_tests =
2873 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2874 mbedtls_aes_xts_context ctx_xts;
2875
2876 /*
2877 * XTS mode
2878 */
2879 mbedtls_aes_xts_init( &ctx_xts );
2880
2881 for( i = 0; i < num_tests << 1; i++ )
2882 {
2883 const unsigned char *data_unit;
2884 u = i >> 1;
2885 mode = i & 1;
2886
2887 if( verbose != 0 )
2888 mbedtls_printf( " AES-XTS-128 (%s): ",
2889 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2890
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002891#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2892 if( mode == MBEDTLS_AES_DECRYPT )
2893 {
2894 mbedtls_printf( "skipped\n" );
2895 continue;
2896 }
2897#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2898
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002899 memset( key, 0, sizeof( key ) );
2900 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002901 data_unit = aes_test_xts_data_unit[u];
2902
2903 len = sizeof( *aes_test_xts_ct32 );
2904
2905 if( mode == MBEDTLS_AES_DECRYPT )
2906 {
2907 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2908 if( ret != 0)
2909 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002910 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002911 aes_tests = aes_test_xts_pt32[u];
2912 }
2913 else
2914 {
2915 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2916 if( ret != 0)
2917 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002918 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002919 aes_tests = aes_test_xts_ct32[u];
2920 }
2921
2922
2923 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2924 buf, buf );
2925 if( ret != 0 )
2926 goto exit;
2927
2928 if( memcmp( buf, aes_tests, len ) != 0 )
2929 {
2930 ret = 1;
2931 goto exit;
2932 }
2933
2934 if( verbose != 0 )
2935 mbedtls_printf( "passed\n" );
2936 }
2937
2938 if( verbose != 0 )
2939 mbedtls_printf( "\n" );
2940
2941 mbedtls_aes_xts_free( &ctx_xts );
2942 }
2943#endif /* MBEDTLS_CIPHER_MODE_XTS */
2944
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002945 ret = 0;
2946
2947exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002948 if( ret != 0 && verbose != 0 )
2949 mbedtls_printf( "failed\n" );
2950
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002951 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002952
2953 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002954}
2955
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002956#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002957
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002958#endif /* MBEDTLS_AES_C */