blob: cbedabc2497105734e96f5103ad34d907f5272d5 [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
Arto Kinnunen172836a2019-11-28 13:34:13 +020088/*
89 * Data structure for AES round data
90 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020091typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020092 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020093 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020094} aes_r_data_t;
95
96#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
97/* Number of additional AES calculation rounds added for SCA CM */
Arto Kinnunen98c93af2020-01-14 13:31:03 +020098#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +020099#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100#define AES_SCA_CM_ROUNDS 0
101#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200103#if defined(MBEDTLS_PADLOCK_C) && \
104 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000105static int aes_padlock_ace = -1;
106#endif
107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000109/*
110 * Forward S-box
111 */
112static const unsigned char FSb[256] =
113{
114 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
115 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
116 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
117 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
118 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
119 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
120 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
121 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
122 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
123 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
124 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
125 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
126 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
127 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
128 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
129 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
130 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
131 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
132 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
133 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
134 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
135 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
136 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
137 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
138 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
139 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
140 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
141 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
142 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
143 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
144 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
145 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
146};
147
148/*
149 * Forward tables
150 */
151#define FT \
152\
153 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
154 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
155 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
156 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
157 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
158 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
159 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
160 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
161 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
162 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
163 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
164 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
165 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
166 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
167 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
168 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
169 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
170 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
171 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
172 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
173 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
174 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
175 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
176 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
177 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
178 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
179 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
180 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
181 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
182 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
183 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
184 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
185 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
186 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
187 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
188 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
189 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
190 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
191 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
192 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
193 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
194 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
195 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
196 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
197 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
198 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
199 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
200 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
201 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
202 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
203 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
204 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
205 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
206 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
207 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
208 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
209 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
210 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
211 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
212 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
213 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
214 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
215 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
216 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
217
218#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000219static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000220#undef V
221
Hanno Beckerad049a92017-06-19 16:31:54 +0100222#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200223
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000225static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000226#undef V
227
228#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000229static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000230#undef V
231
232#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000233static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000234#undef V
235
Hanno Becker177d3cf2017-06-07 15:52:48 +0100236#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200237
Paul Bakker5121ce52009-01-03 21:22:43 +0000238#undef FT
239
Arto Kinnunen14804442019-10-16 13:43:59 +0300240#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000241/*
242 * Reverse S-box
243 */
244static const unsigned char RSb[256] =
245{
246 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
247 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
248 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
249 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
250 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
251 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
252 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
253 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
254 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
255 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
256 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
257 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
258 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
259 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
260 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
261 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
262 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
263 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
264 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
265 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
266 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
267 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
268 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
269 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
270 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
271 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
272 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
273 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
274 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
275 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
276 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
277 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
278};
Arto Kinnunen14804442019-10-16 13:43:59 +0300279#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000280
281/*
282 * Reverse tables
283 */
284#define RT \
285\
286 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
287 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
288 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
289 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
290 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
291 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
292 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
293 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
294 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
295 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
296 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
297 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
298 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
299 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
300 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
301 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
302 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
303 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
304 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
305 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
306 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
307 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
308 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
309 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
310 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
311 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
312 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
313 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
314 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
315 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
316 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
317 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
318 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
319 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
320 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
321 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
322 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
323 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
324 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
325 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
326 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
327 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
328 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
329 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
330 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
331 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
332 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
333 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
334 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
335 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
336 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
337 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
338 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
339 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
340 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
341 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
342 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
343 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
344 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
345 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
346 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
347 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
348 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
349 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
350
Arto Kinnunen14804442019-10-16 13:43:59 +0300351#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000354#undef V
355
Hanno Beckerad049a92017-06-19 16:31:54 +0100356#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000359static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000360#undef V
361
362#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000363static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000364#undef V
365
366#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000367static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000368#undef V
369
Hanno Becker177d3cf2017-06-07 15:52:48 +0100370#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300371#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200372
Paul Bakker5121ce52009-01-03 21:22:43 +0000373#undef RT
374
375/*
376 * Round constants
377 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000379{
380 0x00000001, 0x00000002, 0x00000004, 0x00000008,
381 0x00000010, 0x00000020, 0x00000040, 0x00000080,
382 0x0000001B, 0x00000036
383};
384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000386
387/*
388 * Forward S-box & tables
389 */
390static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100392#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200393static uint32_t FT1[256];
394static uint32_t FT2[256];
395static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100396#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000397
398/*
399 * Reverse S-box & tables
400 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300401#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000402static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100404#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000405static uint32_t RT1[256];
406static uint32_t RT2[256];
407static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100408#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300409#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
411/*
412 * Round constants
413 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000414static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
416/*
417 * Tables generation code
418 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100419#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
420#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100421#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423static int aes_init_done = 0;
424
425static void aes_gen_tables( void )
426{
427 int i, x, y, z;
428 int pow[256];
429 int log[256];
430
431 /*
432 * compute pow and log tables over GF(2^8)
433 */
434 for( i = 0, x = 1; i < 256; i++ )
435 {
436 pow[i] = x;
437 log[x] = i;
438 x = ( x ^ XTIME( x ) ) & 0xFF;
439 }
440
441 /*
442 * calculate the round constants
443 */
444 for( i = 0, x = 1; i < 10; i++ )
445 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000446 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000447 x = XTIME( x ) & 0xFF;
448 }
449
450 /*
451 * generate the forward and reverse S-boxes
452 */
453 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000455 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300456#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000457
458 for( i = 1; i < 256; i++ )
459 {
460 x = pow[255 - log[i]];
461
Paul Bakker66d5d072014-06-17 16:39:18 +0200462 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
464 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
465 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 x ^= y ^ 0x63;
467
468 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300471#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000472 }
473
474 /*
475 * generate the forward and reverse tables
476 */
477 for( i = 0; i < 256; i++ )
478 {
479 x = FSb[i];
480 y = XTIME( x ) & 0xFF;
481 z = ( y ^ x ) & 0xFF;
482
Paul Bakker5c2364c2012-10-01 14:41:15 +0000483 FT0[i] = ( (uint32_t) y ) ^
484 ( (uint32_t) x << 8 ) ^
485 ( (uint32_t) x << 16 ) ^
486 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000487
Hanno Beckerad049a92017-06-19 16:31:54 +0100488#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000489 FT1[i] = ROTL8( FT0[i] );
490 FT2[i] = ROTL8( FT1[i] );
491 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100492#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000493
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300494#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000495 x = RSb[i];
496
Paul Bakker5c2364c2012-10-01 14:41:15 +0000497 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
498 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
499 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
500 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000501
Hanno Beckerad049a92017-06-19 16:31:54 +0100502#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000503 RT1[i] = ROTL8( RT0[i] );
504 RT2[i] = ROTL8( RT1[i] );
505 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100506#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300507#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000508 }
509}
510
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200511#undef ROTL8
512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000514
Arto Kinnunen172836a2019-11-28 13:34:13 +0200515/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200516 * Randomize positions for AES SCA countermeasures if AES countermeasures are
517 * enabled. If countermeasures are not enabled then fill given table with real
518 * data values.
519 *
520 * Dummy rounds are added as follows:
521 * 1. One dummy round added to the initial round key addition (executed in
522 * random order).
523 * 2. Random number of dummy rounds added as first and/or last AES calculation
524 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
525 *
526 * Description of the bytes in the table are as follows:
527 * - 2 bytes for initial round key addition
528 * - remaining bytes for AES calculation with real or dummy data
529 *
530 * Each byte indicates one AES calculation round:
531 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
532 * -bit 2 = offset for even/odd rounds
533 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200534 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200535 * Return Number of additional AES rounds
536 *
537 * Example of the control bytes:
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200538 * 1. No countermeasures enabled and AES-128, only real data (R) used:
539 * | Ri | R | R | R | R | R | R | R | R | R | R |
540 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200541 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200542 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
543 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
544 * |0x10|0x03 |0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200545 */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200546static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200547{
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200548 int i = 0, j = 0, is_even_pos, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200549#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen172836a2019-11-28 13:34:13 +0200550 int num;
551#endif
552
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200553 mbedtls_platform_memset( tbl, 0, tbl_len );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200554
555#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200556 num = mbedtls_platform_random_in_range( 0x1f );
557
558 // Randomize execution order of initial round key addition
559 if ( ( num & 0x10 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200560 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561 tbl[i++] = 0x10; // dummy data
562 tbl[i++] = 0x00 | 0x03; // real data + stop marker
563 } else {
564 tbl[i++] = 0x00; // real data
565 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200568 // Randomize AES rounds
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200569 dummy_rounds = AES_SCA_CM_ROUNDS - ( num & 0x01 );
570 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
571 num = num % ( dummy_rounds + 1 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200572
573 // add dummy rounds to the start (if needed)
574 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200575 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200577 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578
579 // add dummy rounds to the last, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200580 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200581 {
582 tbl[j] = 0x10; // dummy data
583 }
584#else /* AES_SCA_CM_ROUNDS != 0 */
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200585 dummy_rounds = 0;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200586 tbl[i++] = 0x03; // real data + stop marker for the round key addition
Arto Kinnunen172836a2019-11-28 13:34:13 +0200587#endif /* AES_SCA_CM_ROUNDS != 0 */
588
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200591 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200593 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200595 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200597 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200598 is_even_pos = 0;
599 }
600 else
601 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200602 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200603 is_even_pos = 1;
604 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200605 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200606 }
607 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200608
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200609 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
610 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
611
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200612 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200613}
614
Hanno Beckerad049a92017-06-19 16:31:54 +0100615#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200616
617#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
618#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
619#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
620
621#define AES_RT0(idx) RT0[idx]
622#define AES_RT1(idx) ROTL8( RT0[idx] )
623#define AES_RT2(idx) ROTL16( RT0[idx] )
624#define AES_RT3(idx) ROTL24( RT0[idx] )
625
626#define AES_FT0(idx) FT0[idx]
627#define AES_FT1(idx) ROTL8( FT0[idx] )
628#define AES_FT2(idx) ROTL16( FT0[idx] )
629#define AES_FT3(idx) ROTL24( FT0[idx] )
630
Hanno Becker177d3cf2017-06-07 15:52:48 +0100631#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200632
633#define AES_RT0(idx) RT0[idx]
634#define AES_RT1(idx) RT1[idx]
635#define AES_RT2(idx) RT2[idx]
636#define AES_RT3(idx) RT3[idx]
637
638#define AES_FT0(idx) FT0[idx]
639#define AES_FT1(idx) FT1[idx]
640#define AES_FT2(idx) FT2[idx]
641#define AES_FT3(idx) FT3[idx]
642
Hanno Becker177d3cf2017-06-07 15:52:48 +0100643#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200644
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200646{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100647 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000648
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200649 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200650}
651
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200652void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200653{
654 if( ctx == NULL )
655 return;
656
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500657 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200658}
659
Jaeden Amero9366feb2018-05-29 18:55:17 +0100660#if defined(MBEDTLS_CIPHER_MODE_XTS)
661void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
662{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100663 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000664
Jaeden Amero9366feb2018-05-29 18:55:17 +0100665 mbedtls_aes_init( &ctx->crypt );
666 mbedtls_aes_init( &ctx->tweak );
667}
668
669void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
670{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100671 if( ctx == NULL )
672 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000673
Jaeden Amero9366feb2018-05-29 18:55:17 +0100674 mbedtls_aes_free( &ctx->crypt );
675 mbedtls_aes_free( &ctx->tweak );
676}
677#endif /* MBEDTLS_CIPHER_MODE_XTS */
678
Paul Bakker5121ce52009-01-03 21:22:43 +0000679/*
680 * AES key schedule (encryption)
681 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200682#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200684 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000685{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200686 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200687 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200688 volatile unsigned int i = 0;
689 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000690 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200691 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000692
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100693 AES_VALIDATE_RET( ctx != NULL );
694 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000695
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200696 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000697 {
698 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300699#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000700 case 192: ctx->nr = 12; break;
701 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300702#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200703 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000704 }
705
Simon Butcher5201e412018-12-06 17:40:14 +0000706#if !defined(MBEDTLS_AES_ROM_TABLES)
707 if( aes_init_done == 0 )
708 {
709 aes_gen_tables();
710 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000711 }
712#endif
713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000715 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100716 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000717
718 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000720 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000721#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000722 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200724#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100725 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200726 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100727#endif
728
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200729 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
730 offset = mbedtls_platform_random_in_range( keybits >> 5 );
731
732 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000733 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200734 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200735 flow_ctrl++;
736 }
737
738 for( j = 0; j < offset; j++ )
739 {
740 GET_UINT32_LE( RK[j], key, j << 2 );
741 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000742 }
743
744 switch( ctx->nr )
745 {
746 case 10:
747
748 for( i = 0; i < 10; i++, RK += 4 )
749 {
750 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000751 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
752 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
753 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
754 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000755
756 RK[5] = RK[1] ^ RK[4];
757 RK[6] = RK[2] ^ RK[5];
758 RK[7] = RK[3] ^ RK[6];
759 }
760 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300761#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000762 case 12:
763
764 for( i = 0; i < 8; i++, RK += 6 )
765 {
766 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000767 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
768 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
769 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
770 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000771
772 RK[7] = RK[1] ^ RK[6];
773 RK[8] = RK[2] ^ RK[7];
774 RK[9] = RK[3] ^ RK[8];
775 RK[10] = RK[4] ^ RK[9];
776 RK[11] = RK[5] ^ RK[10];
777 }
778 break;
779
780 case 14:
781
782 for( i = 0; i < 7; i++, RK += 8 )
783 {
784 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000785 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
786 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
787 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
788 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000789
790 RK[9] = RK[1] ^ RK[8];
791 RK[10] = RK[2] ^ RK[9];
792 RK[11] = RK[3] ^ RK[10];
793
794 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000795 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
796 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
797 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
798 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000799
800 RK[13] = RK[5] ^ RK[12];
801 RK[14] = RK[6] ^ RK[13];
802 RK[15] = RK[7] ^ RK[14];
803 }
804 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300805#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000806 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000807
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200808 ret = 0;
809
810 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200811 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200812#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
813 || ( ctx->nr == 12 && i == 8 )
814 || ( ctx->nr == 14 && i == 7 )
815#endif
816 ) )
817 {
818 return ret;
819 }
820
821 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000822}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200823#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000824
825/*
826 * AES key schedule (decryption)
827 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200828#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200829int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200830 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000831{
Arto Kinnunen14804442019-10-16 13:43:59 +0300832#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
833 (void) ctx;
834 (void) key;
835 (void) keybits;
836
837 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
838#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200839 volatile unsigned int i = 0, j = 0;
840 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000842 uint32_t *RK;
843 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200844
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100845 AES_VALIDATE_RET( ctx != NULL );
846 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000847
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000851 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100852 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000853
854 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000856 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000857#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000858 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000859
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200860 /* Also checks keybits */
861 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200862 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000863
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200864 ctx->nr = cty.nr;
865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100867 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100868 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100870 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200871 i = 0;
872 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200873 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100874 }
875#endif
876
Paul Bakker5121ce52009-01-03 21:22:43 +0000877 SK = cty.rk + cty.nr * 4;
878
879 *RK++ = *SK++;
880 *RK++ = *SK++;
881 *RK++ = *SK++;
882 *RK++ = *SK++;
883
884 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
885 {
886 for( j = 0; j < 4; j++, SK++ )
887 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200888 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
889 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
890 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
891 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000892 }
893 }
894
895 *RK++ = *SK++;
896 *RK++ = *SK++;
897 *RK++ = *SK++;
898 *RK++ = *SK++;
899
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200900exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000902
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200903 if( ret != 0 )
904 {
905 return( ret );
906 }
907 else if( ( i == 0 ) && ( j == 4 ) )
908 {
909 return( ret );
910 }
911 else
912 {
913 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
914 }
915
Arto Kinnunen14804442019-10-16 13:43:59 +0300916#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000917}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100918
919#if defined(MBEDTLS_CIPHER_MODE_XTS)
920static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
921 unsigned int keybits,
922 const unsigned char **key1,
923 unsigned int *key1bits,
924 const unsigned char **key2,
925 unsigned int *key2bits )
926{
927 const unsigned int half_keybits = keybits / 2;
928 const unsigned int half_keybytes = half_keybits / 8;
929
930 switch( keybits )
931 {
932 case 256: break;
933 case 512: break;
934 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
935 }
936
937 *key1bits = half_keybits;
938 *key2bits = half_keybits;
939 *key1 = &key[0];
940 *key2 = &key[half_keybytes];
941
942 return 0;
943}
944
945int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
946 const unsigned char *key,
947 unsigned int keybits)
948{
949 int ret;
950 const unsigned char *key1, *key2;
951 unsigned int key1bits, key2bits;
952
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100953 AES_VALIDATE_RET( ctx != NULL );
954 AES_VALIDATE_RET( key != NULL );
955
Jaeden Amero9366feb2018-05-29 18:55:17 +0100956 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
957 &key2, &key2bits );
958 if( ret != 0 )
959 return( ret );
960
961 /* Set the tweak key. Always set tweak key for the encryption mode. */
962 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
963 if( ret != 0 )
964 return( ret );
965
966 /* Set crypt key for encryption. */
967 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
968}
969
970int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
971 const unsigned char *key,
972 unsigned int keybits)
973{
974 int ret;
975 const unsigned char *key1, *key2;
976 unsigned int key1bits, key2bits;
977
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100978 AES_VALIDATE_RET( ctx != NULL );
979 AES_VALIDATE_RET( key != NULL );
980
Jaeden Amero9366feb2018-05-29 18:55:17 +0100981 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
982 &key2, &key2bits );
983 if( ret != 0 )
984 return( ret );
985
986 /* Set the tweak key. Always set tweak key for encryption. */
987 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
988 if( ret != 0 )
989 return( ret );
990
991 /* Set crypt key for decryption. */
992 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
993}
994#endif /* MBEDTLS_CIPHER_MODE_XTS */
995
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200996#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000997
Paul Bakker5121ce52009-01-03 21:22:43 +0000998/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200999 * AES-ECB block encryption
1000 */
1001#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001002
1003static uint32_t *aes_fround( uint32_t *R,
1004 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1005 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1006{
1007 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1008 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1009 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1010 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1011
1012 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1013 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1014 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1015 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1016
1017 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1018 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1019 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1020 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1021
1022 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1023 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1024 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1025 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1026
1027 return R;
1028}
1029
1030static void aes_fround_final( uint32_t *R,
1031 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1032 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1033{
1034 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1035 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1036 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1037 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1038
1039 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1040 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1041 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1042 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1043
1044 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1045 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1046 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1047 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1048
1049 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1050 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1051 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1052 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1053}
1054
Andres AGf5bf7182017-03-03 14:09:56 +00001055int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1056 const unsigned char input[16],
1057 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001058{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001059 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001060 aes_r_data_t aes_data_real; // real data
1061#if AES_SCA_CM_ROUNDS != 0
1062 aes_r_data_t aes_data_fake; // fake data
1063#endif /* AES_SCA_CM_ROUNDS != 0 */
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001064 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001065 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001066 int round_ctrl_table_len = ctx->nr + 1;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001067 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001068 // control bytes for AES calculation rounds,
1069 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1070 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001071
Arto Kinnunen172836a2019-11-28 13:34:13 +02001072 aes_data_real.rk_ptr = ctx->rk;
1073 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001074
Arto Kinnunen172836a2019-11-28 13:34:13 +02001075#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001076 round_ctrl_table_len += ( AES_SCA_CM_ROUNDS + 1 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001077 aes_data_table[1] = &aes_data_fake;
1078 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001079 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001080 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001081#endif
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001082
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001083 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001084 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table, round_ctrl_table_len );
1085 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001086
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001087 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1088 offset = mbedtls_platform_random_in_range( 4 );
1089
1090 for( i = offset; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001091 {
1092 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001093 }
1094
1095 for( i = 0; i < offset; i++ )
1096 {
1097 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
1098 }
1099
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001100 tindex = 0;
1101 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001102 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001103 // Get pointer to the real or fake data
1104 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1105 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001106
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001107 // initial round key addition
1108 for( i = 0; i < 4; i++ )
1109 {
1110 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1111 }
1112 tindex++;
1113 flow_control++;
1114 } while( stop_mark == 0 );
1115
1116 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1117 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001118 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001119 // Get pointer to the real or fake data
1120 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1121 offset = round_ctrl_table[tindex] & 0x04;
1122 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001123
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001124 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1125 &aes_data_ptr->xy_values[0 + offset],
1126 &aes_data_ptr->xy_values[1 + offset],
1127 &aes_data_ptr->xy_values[2 + offset],
1128 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001129 aes_data_ptr->xy_values[4 - offset],
1130 aes_data_ptr->xy_values[5 - offset],
1131 aes_data_ptr->xy_values[6 - offset],
1132 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001133 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001134 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001135 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001136
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001137 // Calculate final AES round + dummy rounds
1138 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001139 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001140 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1141 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001142 aes_fround_final( aes_data_ptr->rk_ptr,
1143 &aes_data_ptr->xy_values[0],
1144 &aes_data_ptr->xy_values[1],
1145 &aes_data_ptr->xy_values[2],
1146 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001147 aes_data_ptr->xy_values[4],
1148 aes_data_ptr->xy_values[5],
1149 aes_data_ptr->xy_values[6],
1150 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001151 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001152 tindex++;
1153 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001154
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001155 mbedtls_platform_memset( output, 0, 16 );
1156 offset = mbedtls_platform_random_in_range( 4 );
1157
1158 for( i = offset; i < 4; i++ )
1159 {
1160 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1161 flow_control++;
1162 }
1163
1164 for( i = 0; i < offset; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001165 {
1166 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001167 flow_control++;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001168 }
Andres AGf5bf7182017-03-03 14:09:56 +00001169
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001170 if( flow_control == tindex + dummy_rounds + 4 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001171 {
1172 /* Validate control path due possible fault injection */
1173 return 0;
1174 }
1175
1176 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001177}
1178#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1179
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001180#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001181void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1182 const unsigned char input[16],
1183 unsigned char output[16] )
1184{
1185 mbedtls_internal_aes_encrypt( ctx, input, output );
1186}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001187#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001188
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001189/*
1190 * AES-ECB block decryption
1191 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001192
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001193#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001194#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001195
1196static uint32_t *aes_rround( uint32_t *R,
1197 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1198 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1199{
1200 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1201 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1202 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1203 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1204
1205 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1206 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1207 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1208 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1209
1210 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1211 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1212 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1213 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1214
1215 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1216 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1217 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1218 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1219 return R;
1220}
1221
1222static void aes_rround_final( uint32_t *R,
1223 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1224 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1225{
1226 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1227 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1228 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1229 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1230
1231 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1232 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1233 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1234 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1235
1236 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1237 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1238 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1239 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1240
1241 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1242 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1243 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1244 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1245}
1246
Andres AGf5bf7182017-03-03 14:09:56 +00001247int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1248 const unsigned char input[16],
1249 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001250{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001251 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001252 aes_r_data_t aes_data_real; // real data
1253#if AES_SCA_CM_ROUNDS != 0
1254 aes_r_data_t aes_data_fake; // fake data
1255#endif /* AES_SCA_CM_ROUNDS != 0 */
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001256 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001257 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001258 int round_ctrl_table_len = ctx->nr + 1;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001259 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001260 // control bytes for AES calculation rounds,
1261 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1262 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001263
Arto Kinnunen172836a2019-11-28 13:34:13 +02001264 aes_data_real.rk_ptr = ctx->rk;
1265 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001266
Arto Kinnunen172836a2019-11-28 13:34:13 +02001267#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001268 round_ctrl_table_len += ( AES_SCA_CM_ROUNDS + 1 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001269 aes_data_table[1] = &aes_data_fake;
1270 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001271 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001272 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
1273#endif
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001274
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001275 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001276 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001277 round_ctrl_table_len );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001278
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001279 flow_control = dummy_rounds;
1280
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001281 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1282 offset = mbedtls_platform_random_in_range( 4 );
1283
1284 for( i = offset; i < 4; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001285 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001286 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001287 }
1288
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001289 for( i = 0; i < offset; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001290 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001291 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
1292 }
1293
1294 tindex = 0;
1295 do
1296 {
1297 // Get pointer to the real or fake data
1298 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1299 stop_mark = round_ctrl_table[tindex] & 0x03;
1300
1301 // initial round key addition
1302 for( i = 0; i < 4; i++ )
1303 {
1304 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1305 }
1306 tindex++;
1307 flow_control++;
1308 } while( stop_mark == 0 );
1309
1310 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1311 do
1312 {
1313 // Get pointer to the real or fake data
1314 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1315 offset = round_ctrl_table[tindex] & 0x04;
1316 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001317
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001318 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1319 &aes_data_ptr->xy_values[0 + offset],
1320 &aes_data_ptr->xy_values[1 + offset],
1321 &aes_data_ptr->xy_values[2 + offset],
1322 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001323 aes_data_ptr->xy_values[4 - offset],
1324 aes_data_ptr->xy_values[5 - offset],
1325 aes_data_ptr->xy_values[6 - offset],
1326 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001327 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001328 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001329 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001330
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001331 // Calculate final AES round + dummy rounds
1332 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001333 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001334 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1335 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001336 aes_rround_final( aes_data_ptr->rk_ptr,
1337 &aes_data_ptr->xy_values[0],
1338 &aes_data_ptr->xy_values[1],
1339 &aes_data_ptr->xy_values[2],
1340 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001341 aes_data_ptr->xy_values[4],
1342 aes_data_ptr->xy_values[5],
1343 aes_data_ptr->xy_values[6],
1344 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001345 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001346 tindex++;
1347 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001348
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001349 mbedtls_platform_memset( output, 0, 16 );
1350 offset = mbedtls_platform_random_in_range( 4 );
1351
1352 for( i = offset; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001353 {
1354 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001355 flow_control++;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001356 }
Andres AGf5bf7182017-03-03 14:09:56 +00001357
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001358 for( i = 0; i < offset; i++ )
1359 {
1360 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1361 flow_control++;
1362 }
1363
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001364 if( flow_control == tindex + dummy_rounds + 4 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001365 {
1366 /* Validate control path due possible fault injection */
1367 return 0;
1368 }
1369
1370 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001371}
Arto Kinnunen14804442019-10-16 13:43:59 +03001372#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001373#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1374
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001375#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001376void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1377 const unsigned char input[16],
1378 unsigned char output[16] )
1379{
Arto Kinnunen14804442019-10-16 13:43:59 +03001380#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1381 (void) ctx;
1382 (void) input;
1383 (void) output;
1384#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001385 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001386#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001387}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001388#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001389
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001390/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001391 * AES-ECB block encryption/decryption
1392 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001394 int mode,
1395 const unsigned char input[16],
1396 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001397{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001398 AES_VALIDATE_RET( ctx != NULL );
1399 AES_VALIDATE_RET( input != NULL );
1400 AES_VALIDATE_RET( output != NULL );
1401 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1402 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001403 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001405#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001406 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001407 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001408#endif
1409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001410#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001411 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001412 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001414 return( 0 );
1415
1416 // If padlock data misaligned, we just fall back to
1417 // unaccelerated mode
1418 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001419 }
1420#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001421
Arto Kinnunen14804442019-10-16 13:43:59 +03001422#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1423 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1424#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001425
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001426 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001427 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001428 else
Andres AGf5bf7182017-03-03 14:09:56 +00001429 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001430#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001431}
1432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001434/*
1435 * AES-CBC buffer encryption/decryption
1436 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001438 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001439 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001440 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001441 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001442 unsigned char *output )
1443{
1444 int i;
1445 unsigned char temp[16];
1446
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001447 AES_VALIDATE_RET( ctx != NULL );
1448 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1449 mode == MBEDTLS_AES_DECRYPT );
1450 AES_VALIDATE_RET( iv != NULL );
1451 AES_VALIDATE_RET( input != NULL );
1452 AES_VALIDATE_RET( output != NULL );
1453
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001454 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001458 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001459 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001461 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001462
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001463 // If padlock data misaligned, we just fall back to
1464 // unaccelerated mode
1465 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001466 }
1467#endif
1468
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001470 {
1471 while( length > 0 )
1472 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001473 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001474 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001475
1476 for( i = 0; i < 16; i++ )
1477 output[i] = (unsigned char)( output[i] ^ iv[i] );
1478
Teppo Järvelin91d79382019-10-02 09:09:31 +03001479 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001480
1481 input += 16;
1482 output += 16;
1483 length -= 16;
1484 }
1485 }
1486 else
1487 {
1488 while( length > 0 )
1489 {
1490 for( i = 0; i < 16; i++ )
1491 output[i] = (unsigned char)( input[i] ^ iv[i] );
1492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001494 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001495
1496 input += 16;
1497 output += 16;
1498 length -= 16;
1499 }
1500 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001501
1502 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001503}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001504#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001505
Aorimn5f778012016-06-09 23:22:58 +02001506#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001507
1508/* Endianess with 64 bits values */
1509#ifndef GET_UINT64_LE
1510#define GET_UINT64_LE(n,b,i) \
1511{ \
1512 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1513 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1514 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1515 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1516 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1517 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1518 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1519 | ( (uint64_t) (b)[(i) ] ); \
1520}
1521#endif
1522
1523#ifndef PUT_UINT64_LE
1524#define PUT_UINT64_LE(n,b,i) \
1525{ \
1526 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1527 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1528 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1529 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1530 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1531 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1532 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1533 (b)[(i) ] = (unsigned char) ( (n) ); \
1534}
1535#endif
1536
1537typedef unsigned char mbedtls_be128[16];
1538
1539/*
1540 * GF(2^128) multiplication function
1541 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001542 * This function multiplies a field element by x in the polynomial field
1543 * representation. It uses 64-bit word operations to gain speed but compensates
1544 * for machine endianess and hence works correctly on both big and little
1545 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001546 */
1547static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001548 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001549{
1550 uint64_t a, b, ra, rb;
1551
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001552 GET_UINT64_LE( a, x, 0 );
1553 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001554
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001555 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1556 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001557
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001558 PUT_UINT64_LE( ra, r, 0 );
1559 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001560}
1561
Aorimn5f778012016-06-09 23:22:58 +02001562/*
1563 * AES-XTS buffer encryption/decryption
1564 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001565int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1566 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001567 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001568 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001569 const unsigned char *input,
1570 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001571{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001572 int ret;
1573 size_t blocks = length / 16;
1574 size_t leftover = length % 16;
1575 unsigned char tweak[16];
1576 unsigned char prev_tweak[16];
1577 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001578
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001579 AES_VALIDATE_RET( ctx != NULL );
1580 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1581 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001582 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001583 AES_VALIDATE_RET( input != NULL );
1584 AES_VALIDATE_RET( output != NULL );
1585
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001586 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001587 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001588 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001589
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001590 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001591 if( length > ( 1 << 20 ) * 16 )
1592 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001593
Jaeden Amerod82cd862018-04-28 15:02:45 +01001594 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001595 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1596 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001597 if( ret != 0 )
1598 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001599
Jaeden Amerod82cd862018-04-28 15:02:45 +01001600 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001601 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001602 size_t i;
1603
1604 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1605 {
1606 /* We are on the last block in a decrypt operation that has
1607 * leftover bytes, so we need to use the next tweak for this block,
1608 * and this tweak for the lefover bytes. Save the current tweak for
1609 * the leftovers and then update the current tweak for use on this,
1610 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001611 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001612 mbedtls_gf128mul_x_ble( tweak, tweak );
1613 }
1614
1615 for( i = 0; i < 16; i++ )
1616 tmp[i] = input[i] ^ tweak[i];
1617
1618 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1619 if( ret != 0 )
1620 return( ret );
1621
1622 for( i = 0; i < 16; i++ )
1623 output[i] = tmp[i] ^ tweak[i];
1624
1625 /* Update the tweak for the next block. */
1626 mbedtls_gf128mul_x_ble( tweak, tweak );
1627
1628 output += 16;
1629 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001630 }
1631
Jaeden Amerod82cd862018-04-28 15:02:45 +01001632 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001633 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001634 /* If we are on the leftover bytes in a decrypt operation, we need to
1635 * use the previous tweak for these bytes (as saved in prev_tweak). */
1636 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001637
Jaeden Amerod82cd862018-04-28 15:02:45 +01001638 /* We are now on the final part of the data unit, which doesn't divide
1639 * evenly by 16. It's time for ciphertext stealing. */
1640 size_t i;
1641 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001642
Jaeden Amerod82cd862018-04-28 15:02:45 +01001643 /* Copy ciphertext bytes from the previous block to our output for each
1644 * byte of cyphertext we won't steal. At the same time, copy the
1645 * remainder of the input for this final round (since the loop bounds
1646 * are the same). */
1647 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001648 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001649 output[i] = prev_output[i];
1650 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001651 }
Aorimn5f778012016-06-09 23:22:58 +02001652
Jaeden Amerod82cd862018-04-28 15:02:45 +01001653 /* Copy ciphertext bytes from the previous block for input in this
1654 * round. */
1655 for( ; i < 16; i++ )
1656 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001657
Jaeden Amerod82cd862018-04-28 15:02:45 +01001658 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1659 if( ret != 0 )
1660 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001661
Jaeden Amerod82cd862018-04-28 15:02:45 +01001662 /* Write the result back to the previous block, overriding the previous
1663 * output we copied. */
1664 for( i = 0; i < 16; i++ )
1665 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001666 }
1667
1668 return( 0 );
1669}
1670#endif /* MBEDTLS_CIPHER_MODE_XTS */
1671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001673/*
1674 * AES-CFB128 buffer encryption/decryption
1675 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001676int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001677 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001678 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001679 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001680 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001681 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001682 unsigned char *output )
1683{
Paul Bakker27fdf462011-06-09 13:55:13 +00001684 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001685 size_t n;
1686
1687 AES_VALIDATE_RET( ctx != NULL );
1688 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1689 mode == MBEDTLS_AES_DECRYPT );
1690 AES_VALIDATE_RET( iv_off != NULL );
1691 AES_VALIDATE_RET( iv != NULL );
1692 AES_VALIDATE_RET( input != NULL );
1693 AES_VALIDATE_RET( output != NULL );
1694
1695 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001696
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001697 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001698 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001700 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001701 {
1702 while( length-- )
1703 {
1704 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001705 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001706
1707 c = *input++;
1708 *output++ = (unsigned char)( c ^ iv[n] );
1709 iv[n] = (unsigned char) c;
1710
Paul Bakker66d5d072014-06-17 16:39:18 +02001711 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001712 }
1713 }
1714 else
1715 {
1716 while( length-- )
1717 {
1718 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001719 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001720
1721 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1722
Paul Bakker66d5d072014-06-17 16:39:18 +02001723 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001724 }
1725 }
1726
1727 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001728
1729 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001730}
Paul Bakker556efba2014-01-24 15:38:12 +01001731
1732/*
1733 * AES-CFB8 buffer encryption/decryption
1734 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001735int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001736 int mode,
1737 size_t length,
1738 unsigned char iv[16],
1739 const unsigned char *input,
1740 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001741{
1742 unsigned char c;
1743 unsigned char ov[17];
1744
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001745 AES_VALIDATE_RET( ctx != NULL );
1746 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1747 mode == MBEDTLS_AES_DECRYPT );
1748 AES_VALIDATE_RET( iv != NULL );
1749 AES_VALIDATE_RET( input != NULL );
1750 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001751 while( length-- )
1752 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001753 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001754 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001755
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001756 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001757 ov[16] = *input;
1758
1759 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001761 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001762 ov[16] = c;
1763
Teppo Järvelin91d79382019-10-02 09:09:31 +03001764 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001765 }
1766
1767 return( 0 );
1768}
Simon Butcher76a5b222018-04-22 22:57:27 +01001769#endif /* MBEDTLS_CIPHER_MODE_CFB */
1770
1771#if defined(MBEDTLS_CIPHER_MODE_OFB)
1772/*
1773 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1774 */
1775int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001776 size_t length,
1777 size_t *iv_off,
1778 unsigned char iv[16],
1779 const unsigned char *input,
1780 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001781{
Simon Butcherad4e4932018-04-29 00:43:47 +01001782 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001783 size_t n;
1784
1785 AES_VALIDATE_RET( ctx != NULL );
1786 AES_VALIDATE_RET( iv_off != NULL );
1787 AES_VALIDATE_RET( iv != NULL );
1788 AES_VALIDATE_RET( input != NULL );
1789 AES_VALIDATE_RET( output != NULL );
1790
1791 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001792
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001793 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001794 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1795
Simon Butcher76a5b222018-04-22 22:57:27 +01001796 while( length-- )
1797 {
1798 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001799 {
1800 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1801 if( ret != 0 )
1802 goto exit;
1803 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001804 *output++ = *input++ ^ iv[n];
1805
1806 n = ( n + 1 ) & 0x0F;
1807 }
1808
1809 *iv_off = n;
1810
Simon Butcherad4e4932018-04-29 00:43:47 +01001811exit:
1812 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001813}
1814#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001815
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001816#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001817/*
1818 * AES-CTR buffer encryption/decryption
1819 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001820int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001821 size_t length,
1822 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001823 unsigned char nonce_counter[16],
1824 unsigned char stream_block[16],
1825 const unsigned char *input,
1826 unsigned char *output )
1827{
Paul Bakker369e14b2012-04-18 14:16:09 +00001828 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001829 size_t n;
1830
1831 AES_VALIDATE_RET( ctx != NULL );
1832 AES_VALIDATE_RET( nc_off != NULL );
1833 AES_VALIDATE_RET( nonce_counter != NULL );
1834 AES_VALIDATE_RET( stream_block != NULL );
1835 AES_VALIDATE_RET( input != NULL );
1836 AES_VALIDATE_RET( output != NULL );
1837
1838 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001839
Arto Kinnunen75439012019-12-03 14:12:10 +02001840 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001841 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1842
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001843 while( length-- )
1844 {
1845 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001846 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001847
Paul Bakker369e14b2012-04-18 14:16:09 +00001848 for( i = 16; i > 0; i-- )
1849 if( ++nonce_counter[i - 1] != 0 )
1850 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001851 }
1852 c = *input++;
1853 *output++ = (unsigned char)( c ^ stream_block[n] );
1854
Paul Bakker66d5d072014-06-17 16:39:18 +02001855 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001856 }
1857
1858 *nc_off = n;
1859
1860 return( 0 );
1861}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001862#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001866#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001867/*
1868 * AES test vectors from:
1869 *
1870 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1871 */
1872static const unsigned char aes_test_ecb_dec[3][16] =
1873{
1874 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1875 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1876 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1877 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1878 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1879 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1880};
1881
1882static const unsigned char aes_test_ecb_enc[3][16] =
1883{
1884 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1885 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1886 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1887 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1888 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1889 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1890};
1891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001892#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001893static const unsigned char aes_test_cbc_dec[3][16] =
1894{
1895 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1896 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1897 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1898 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1899 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1900 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1901};
1902
1903static const unsigned char aes_test_cbc_enc[3][16] =
1904{
1905 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1906 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1907 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1908 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1909 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1910 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1911};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001912#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001913
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001914#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001915/*
1916 * AES-CFB128 test vectors from:
1917 *
1918 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1919 */
1920static const unsigned char aes_test_cfb128_key[3][32] =
1921{
1922 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1923 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1924 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1925 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1926 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1927 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1928 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1929 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1930 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1931};
1932
1933static const unsigned char aes_test_cfb128_iv[16] =
1934{
1935 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1936 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1937};
1938
1939static const unsigned char aes_test_cfb128_pt[64] =
1940{
1941 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1942 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1943 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1944 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1945 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1946 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1947 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1948 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1949};
1950
1951static const unsigned char aes_test_cfb128_ct[3][64] =
1952{
1953 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1954 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1955 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1956 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1957 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1958 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1959 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1960 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1961 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1962 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1963 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1964 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1965 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1966 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1967 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1968 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1969 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1970 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1971 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1972 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1973 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1974 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1975 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1976 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1977};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001978#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001979
Simon Butcherad4e4932018-04-29 00:43:47 +01001980#if defined(MBEDTLS_CIPHER_MODE_OFB)
1981/*
1982 * AES-OFB test vectors from:
1983 *
Simon Butcher5db13622018-06-04 22:11:25 +01001984 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001985 */
1986static const unsigned char aes_test_ofb_key[3][32] =
1987{
1988 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1989 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1990 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1991 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1992 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1993 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1994 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1995 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1996 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1997};
1998
1999static const unsigned char aes_test_ofb_iv[16] =
2000{
2001 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2002 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2003};
2004
2005static const unsigned char aes_test_ofb_pt[64] =
2006{
2007 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2008 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2009 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2010 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2011 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2012 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2013 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2014 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2015};
2016
2017static const unsigned char aes_test_ofb_ct[3][64] =
2018{
2019 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2020 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2021 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2022 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2023 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2024 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2025 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2026 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2027 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2028 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2029 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2030 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2031 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2032 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2033 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2034 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2035 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2036 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2037 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2038 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2039 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2040 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2041 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2042 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2043};
2044#endif /* MBEDTLS_CIPHER_MODE_OFB */
2045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002046#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002047/*
2048 * AES-CTR test vectors from:
2049 *
2050 * http://www.faqs.org/rfcs/rfc3686.html
2051 */
2052
2053static const unsigned char aes_test_ctr_key[3][16] =
2054{
2055 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2056 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2057 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2058 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2059 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2060 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2061};
2062
2063static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2064{
2065 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2067 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2068 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2069 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2070 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2071};
2072
2073static const unsigned char aes_test_ctr_pt[3][48] =
2074{
2075 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2076 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2077
2078 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2079 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2080 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2081 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2082
2083 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2084 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2085 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2086 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2087 0x20, 0x21, 0x22, 0x23 }
2088};
2089
2090static const unsigned char aes_test_ctr_ct[3][48] =
2091{
2092 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2093 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2094 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2095 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2096 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2097 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2098 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2099 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2100 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2101 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2102 0x25, 0xB2, 0x07, 0x2F }
2103};
2104
2105static const int aes_test_ctr_len[3] =
2106 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002107#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002108
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002109#if defined(MBEDTLS_CIPHER_MODE_XTS)
2110/*
2111 * AES-XTS test vectors from:
2112 *
2113 * IEEE P1619/D16 Annex B
2114 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2115 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2116 */
2117static const unsigned char aes_test_xts_key[][32] =
2118{
2119 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2123 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2124 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2125 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2126 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2127 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2128 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2129 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2130 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2131};
2132
2133static const unsigned char aes_test_xts_pt32[][32] =
2134{
2135 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2139 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2140 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2141 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2142 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2143 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2144 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2145 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2146 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2147};
2148
2149static const unsigned char aes_test_xts_ct32[][32] =
2150{
2151 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2152 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2153 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2154 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2155 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2156 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2157 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2158 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2159 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2160 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2161 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2162 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2163};
2164
2165static const unsigned char aes_test_xts_data_unit[][16] =
2166{
2167 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2169 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2171 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2173};
2174
2175#endif /* MBEDTLS_CIPHER_MODE_XTS */
2176
Paul Bakker5121ce52009-01-03 21:22:43 +00002177/*
2178 * Checkup routine
2179 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002180int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002181{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002182 int ret = 0, i, j, u, mode;
2183 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002184 unsigned char key[32];
2185 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002186 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002187#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002188 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002189#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002190#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002191 unsigned char prv[16];
2192#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002193#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2194 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002195 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002196#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002197#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002198 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002199#endif
2200#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002201 unsigned char nonce_counter[16];
2202 unsigned char stream_block[16];
2203#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002204 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002205
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002206 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002207 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002208
2209 /*
2210 * ECB mode
2211 */
2212 for( i = 0; i < 6; i++ )
2213 {
2214 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002215 keybits = 128 + u * 64;
2216 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002217
2218 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002219 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2220 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002221
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002222#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2223 if( keybits > 128 )
2224 {
2225 mbedtls_printf( "skipped\n" );
2226 continue;
2227 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002228#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2229
2230#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2231 if( mode == MBEDTLS_AES_DECRYPT )
2232 {
2233 mbedtls_printf( "skipped\n" );
2234 continue;
2235 }
2236#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002237
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002238 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002239
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002240 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002241 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002242 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2243 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002244 }
2245 else
2246 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002247 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2248 aes_tests = aes_test_ecb_enc[u];
2249 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002250
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002251 /*
2252 * AES-192 is an optional feature that may be unavailable when
2253 * there is an alternative underlying implementation i.e. when
2254 * MBEDTLS_AES_ALT is defined.
2255 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002256 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002257 {
2258 mbedtls_printf( "skipped\n" );
2259 continue;
2260 }
2261 else if( ret != 0 )
2262 {
2263 goto exit;
2264 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002265
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002266 for( j = 0; j < 10000; j++ )
2267 {
2268 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2269 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002270 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002271 }
2272
2273 if( memcmp( buf, aes_tests, 16 ) != 0 )
2274 {
2275 ret = 1;
2276 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002277 }
2278
2279 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002280 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002281 }
2282
2283 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002286#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002287 /*
2288 * CBC mode
2289 */
2290 for( i = 0; i < 6; i++ )
2291 {
2292 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002293 keybits = 128 + u * 64;
2294 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002295
2296 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002297 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2298 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002299
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002300#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2301 if( keybits > 128 )
2302 {
2303 mbedtls_printf( "skipped\n" );
2304 continue;
2305 }
2306#endif
2307
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002308#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2309 if( mode == MBEDTLS_AES_DECRYPT )
2310 {
2311 mbedtls_printf( "skipped\n" );
2312 continue;
2313 }
2314#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2315
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002316 memset( iv , 0, 16 );
2317 memset( prv, 0, 16 );
2318 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002319
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002320 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002321 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002322 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2323 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002324 }
2325 else
2326 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002327 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2328 aes_tests = aes_test_cbc_enc[u];
2329 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002330
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002331 /*
2332 * AES-192 is an optional feature that may be unavailable when
2333 * there is an alternative underlying implementation i.e. when
2334 * MBEDTLS_AES_ALT is defined.
2335 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002336 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002337 {
2338 mbedtls_printf( "skipped\n" );
2339 continue;
2340 }
2341 else if( ret != 0 )
2342 {
2343 goto exit;
2344 }
2345
2346 for( j = 0; j < 10000; j++ )
2347 {
2348 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002349 {
2350 unsigned char tmp[16];
2351
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002352 memcpy( tmp, prv, 16 );
2353 memcpy( prv, buf, 16 );
2354 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002355 }
2356
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002357 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2358 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002359 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002360
2361 }
2362
2363 if( memcmp( buf, aes_tests, 16 ) != 0 )
2364 {
2365 ret = 1;
2366 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002367 }
2368
2369 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002370 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002371 }
2372
2373 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002374 mbedtls_printf( "\n" );
2375#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002377#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002378 /*
2379 * CFB128 mode
2380 */
2381 for( i = 0; i < 6; i++ )
2382 {
2383 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002384 keybits = 128 + u * 64;
2385 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002386
2387 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002388 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2389 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002390
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002391#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2392 if( keybits > 128 )
2393 {
2394 mbedtls_printf( "skipped\n" );
2395 continue;
2396 }
2397#endif
2398
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002399#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2400 if( mode == MBEDTLS_AES_DECRYPT )
2401 {
2402 mbedtls_printf( "skipped\n" );
2403 continue;
2404 }
2405#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2406
Paul Bakker5121ce52009-01-03 21:22:43 +00002407 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002408 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
2410 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002411 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002412 /*
2413 * AES-192 is an optional feature that may be unavailable when
2414 * there is an alternative underlying implementation i.e. when
2415 * MBEDTLS_AES_ALT is defined.
2416 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002417 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002418 {
2419 mbedtls_printf( "skipped\n" );
2420 continue;
2421 }
2422 else if( ret != 0 )
2423 {
2424 goto exit;
2425 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002427 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002429 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002430 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002431 }
2432 else
2433 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002434 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002435 aes_tests = aes_test_cfb128_ct[u];
2436 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002437
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002438 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2439 if( ret != 0 )
2440 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002441
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002442 if( memcmp( buf, aes_tests, 64 ) != 0 )
2443 {
2444 ret = 1;
2445 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002446 }
2447
2448 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002449 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002450 }
2451
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002452 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002453 mbedtls_printf( "\n" );
2454#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002455
Simon Butcherad4e4932018-04-29 00:43:47 +01002456#if defined(MBEDTLS_CIPHER_MODE_OFB)
2457 /*
2458 * OFB mode
2459 */
2460 for( i = 0; i < 6; i++ )
2461 {
2462 u = i >> 1;
2463 keybits = 128 + u * 64;
2464 mode = i & 1;
2465
2466 if( verbose != 0 )
2467 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2468 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2469
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002470#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2471 if( keybits > 128 )
2472 {
2473 mbedtls_printf( "skipped\n" );
2474 continue;
2475 }
2476#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002477
2478#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2479 if( mode == MBEDTLS_AES_DECRYPT )
2480 {
2481 mbedtls_printf( "skipped\n" );
2482 continue;
2483 }
2484#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2485
Simon Butcherad4e4932018-04-29 00:43:47 +01002486 memcpy( iv, aes_test_ofb_iv, 16 );
2487 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2488
2489 offset = 0;
2490 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2491 /*
2492 * AES-192 is an optional feature that may be unavailable when
2493 * there is an alternative underlying implementation i.e. when
2494 * MBEDTLS_AES_ALT is defined.
2495 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002496 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002497 {
2498 mbedtls_printf( "skipped\n" );
2499 continue;
2500 }
2501 else if( ret != 0 )
2502 {
2503 goto exit;
2504 }
2505
2506 if( mode == MBEDTLS_AES_DECRYPT )
2507 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002508 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002509 aes_tests = aes_test_ofb_pt;
2510 }
2511 else
2512 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002513 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002514 aes_tests = aes_test_ofb_ct[u];
2515 }
2516
2517 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2518 if( ret != 0 )
2519 goto exit;
2520
2521 if( memcmp( buf, aes_tests, 64 ) != 0 )
2522 {
2523 ret = 1;
2524 goto exit;
2525 }
2526
2527 if( verbose != 0 )
2528 mbedtls_printf( "passed\n" );
2529 }
2530
2531 if( verbose != 0 )
2532 mbedtls_printf( "\n" );
2533#endif /* MBEDTLS_CIPHER_MODE_OFB */
2534
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002535#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002536 /*
2537 * CTR mode
2538 */
2539 for( i = 0; i < 6; i++ )
2540 {
2541 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002542 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002543
2544 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002545 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002546 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002547
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002548#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2549 if( keybits > 128 )
2550 {
2551 mbedtls_printf( "skipped\n" );
2552 continue;
2553 }
2554#endif
2555
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002556#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2557 if( mode == MBEDTLS_AES_DECRYPT )
2558 {
2559 mbedtls_printf( "skipped\n" );
2560 continue;
2561 }
2562#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2563
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002564 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2565 memcpy( key, aes_test_ctr_key[u], 16 );
2566
2567 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002568 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2569 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002570
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002571 len = aes_test_ctr_len[u];
2572
2573 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002574 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002575 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002576 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002577 }
2578 else
2579 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002580 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002581 aes_tests = aes_test_ctr_ct[u];
2582 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002583
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002584 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2585 stream_block, buf, buf );
2586 if( ret != 0 )
2587 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002588
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002589 if( memcmp( buf, aes_tests, len ) != 0 )
2590 {
2591 ret = 1;
2592 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002593 }
2594
2595 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002596 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002597 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002598
2599 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600 mbedtls_printf( "\n" );
2601#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002602
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002603#if defined(MBEDTLS_CIPHER_MODE_XTS)
2604 {
2605 static const int num_tests =
2606 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2607 mbedtls_aes_xts_context ctx_xts;
2608
2609 /*
2610 * XTS mode
2611 */
2612 mbedtls_aes_xts_init( &ctx_xts );
2613
2614 for( i = 0; i < num_tests << 1; i++ )
2615 {
2616 const unsigned char *data_unit;
2617 u = i >> 1;
2618 mode = i & 1;
2619
2620 if( verbose != 0 )
2621 mbedtls_printf( " AES-XTS-128 (%s): ",
2622 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2623
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002624#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2625 if( mode == MBEDTLS_AES_DECRYPT )
2626 {
2627 mbedtls_printf( "skipped\n" );
2628 continue;
2629 }
2630#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2631
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002632 memset( key, 0, sizeof( key ) );
2633 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002634 data_unit = aes_test_xts_data_unit[u];
2635
2636 len = sizeof( *aes_test_xts_ct32 );
2637
2638 if( mode == MBEDTLS_AES_DECRYPT )
2639 {
2640 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2641 if( ret != 0)
2642 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002643 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002644 aes_tests = aes_test_xts_pt32[u];
2645 }
2646 else
2647 {
2648 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2649 if( ret != 0)
2650 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002651 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002652 aes_tests = aes_test_xts_ct32[u];
2653 }
2654
2655
2656 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2657 buf, buf );
2658 if( ret != 0 )
2659 goto exit;
2660
2661 if( memcmp( buf, aes_tests, len ) != 0 )
2662 {
2663 ret = 1;
2664 goto exit;
2665 }
2666
2667 if( verbose != 0 )
2668 mbedtls_printf( "passed\n" );
2669 }
2670
2671 if( verbose != 0 )
2672 mbedtls_printf( "\n" );
2673
2674 mbedtls_aes_xts_free( &ctx_xts );
2675 }
2676#endif /* MBEDTLS_CIPHER_MODE_XTS */
2677
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002678 ret = 0;
2679
2680exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002681 if( ret != 0 && verbose != 0 )
2682 mbedtls_printf( "failed\n" );
2683
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002684 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002685
2686 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002687}
2688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002689#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002691#endif /* MBEDTLS_AES_C */