blob: 1712157593efb95488e9aa2beac9e9479d0c1bec [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#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101#if defined(MBEDTLS_PADLOCK_C) && \
102 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000103static int aes_padlock_ace = -1;
104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000107/*
108 * Forward S-box
109 */
110static const unsigned char FSb[256] =
111{
112 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
113 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
114 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
115 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
116 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
117 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
118 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
119 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
120 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
121 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
122 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
123 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
124 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
125 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
126 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
127 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
128 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
129 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
130 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
131 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
132 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
133 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
134 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
135 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
136 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
137 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
138 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
139 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
140 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
141 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
142 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
143 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
144};
145
146/*
147 * Forward tables
148 */
149#define FT \
150\
151 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
152 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
153 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
154 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
155 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
156 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
157 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
158 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
159 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
160 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
161 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
162 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
163 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
164 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
165 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
166 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
167 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
168 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
169 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
170 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
171 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
172 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
173 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
174 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
175 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
176 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
177 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
178 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
179 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
180 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
181 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
182 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
183 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
184 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
185 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
186 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
187 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
188 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
189 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
190 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
191 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
192 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
193 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
194 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
195 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
196 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
197 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
198 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
199 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
200 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
201 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
202 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
203 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
204 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
205 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
206 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
207 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
208 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
209 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
210 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
211 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
212 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
213 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
214 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
215
216#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000217static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000218#undef V
219
Hanno Beckerad049a92017-06-19 16:31:54 +0100220#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200221
Paul Bakker5121ce52009-01-03 21:22:43 +0000222#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000223static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#undef V
225
226#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000227static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000228#undef V
229
230#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000231static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000232#undef V
233
Hanno Becker177d3cf2017-06-07 15:52:48 +0100234#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200235
Paul Bakker5121ce52009-01-03 21:22:43 +0000236#undef FT
237
Arto Kinnunen14804442019-10-16 13:43:59 +0300238#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000239/*
240 * Reverse S-box
241 */
242static const unsigned char RSb[256] =
243{
244 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
245 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
246 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
247 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
248 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
249 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
250 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
251 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
252 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
253 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
254 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
255 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
256 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
257 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
258 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
259 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
260 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
261 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
262 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
263 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
264 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
265 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
266 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
267 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
268 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
269 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
270 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
271 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
272 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
273 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
274 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
275 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
276};
Arto Kinnunen14804442019-10-16 13:43:59 +0300277#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
279/*
280 * Reverse tables
281 */
282#define RT \
283\
284 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
285 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
286 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
287 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
288 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
289 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
290 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
291 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
292 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
293 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
294 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
295 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
296 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
297 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
298 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
299 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
300 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
301 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
302 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
303 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
304 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
305 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
306 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
307 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
308 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
309 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
310 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
311 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
312 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
313 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
314 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
315 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
316 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
317 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
318 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
319 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
320 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
321 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
322 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
323 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
324 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
325 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
326 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
327 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
328 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
329 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
330 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
331 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
332 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
333 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
334 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
335 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
336 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
337 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
338 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
339 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
340 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
341 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
342 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
343 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
344 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
345 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
346 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
347 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
348
Arto Kinnunen14804442019-10-16 13:43:59 +0300349#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000350#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000351static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#undef V
353
Hanno Beckerad049a92017-06-19 16:31:54 +0100354#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#undef V
359
360#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000362#undef V
363
364#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000365static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000366#undef V
367
Hanno Becker177d3cf2017-06-07 15:52:48 +0100368#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300369#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200370
Paul Bakker5121ce52009-01-03 21:22:43 +0000371#undef RT
372
373/*
374 * Round constants
375 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000376static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
378 0x00000001, 0x00000002, 0x00000004, 0x00000008,
379 0x00000010, 0x00000020, 0x00000040, 0x00000080,
380 0x0000001B, 0x00000036
381};
382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385/*
386 * Forward S-box & tables
387 */
388static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200389static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100390#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT1[256];
392static uint32_t FT2[256];
393static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100394#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
396/*
397 * Reverse S-box & tables
398 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300399#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000400static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100402#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT1[256];
404static uint32_t RT2[256];
405static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100406#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300407#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
409/*
410 * Round constants
411 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000412static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000413
414/*
415 * Tables generation code
416 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100417#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
418#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100419#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
421static int aes_init_done = 0;
422
423static void aes_gen_tables( void )
424{
425 int i, x, y, z;
426 int pow[256];
427 int log[256];
428
429 /*
430 * compute pow and log tables over GF(2^8)
431 */
432 for( i = 0, x = 1; i < 256; i++ )
433 {
434 pow[i] = x;
435 log[x] = i;
436 x = ( x ^ XTIME( x ) ) & 0xFF;
437 }
438
439 /*
440 * calculate the round constants
441 */
442 for( i = 0, x = 1; i < 10; i++ )
443 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000444 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 x = XTIME( x ) & 0xFF;
446 }
447
448 /*
449 * generate the forward and reverse S-boxes
450 */
451 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300452#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000455
456 for( i = 1; i < 256; i++ )
457 {
458 x = pow[255 - log[i]];
459
Paul Bakker66d5d072014-06-17 16:39:18 +0200460 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
461 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
462 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 x ^= y ^ 0x63;
465
466 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300467#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 }
471
472 /*
473 * generate the forward and reverse tables
474 */
475 for( i = 0; i < 256; i++ )
476 {
477 x = FSb[i];
478 y = XTIME( x ) & 0xFF;
479 z = ( y ^ x ) & 0xFF;
480
Paul Bakker5c2364c2012-10-01 14:41:15 +0000481 FT0[i] = ( (uint32_t) y ) ^
482 ( (uint32_t) x << 8 ) ^
483 ( (uint32_t) x << 16 ) ^
484 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
Hanno Beckerad049a92017-06-19 16:31:54 +0100486#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 FT1[i] = ROTL8( FT0[i] );
488 FT2[i] = ROTL8( FT1[i] );
489 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100490#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300492#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000493 x = RSb[i];
494
Paul Bakker5c2364c2012-10-01 14:41:15 +0000495 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
496 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
497 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
498 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
Hanno Beckerad049a92017-06-19 16:31:54 +0100500#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000501 RT1[i] = ROTL8( RT0[i] );
502 RT2[i] = ROTL8( RT1[i] );
503 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100504#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300505#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 }
507}
508
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200509#undef ROTL8
510
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Arto Kinnunen172836a2019-11-28 13:34:13 +0200513/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200514 * Randomize positions for AES SCA countermeasures if AES countermeasures are
515 * enabled. If countermeasures are not enabled then fill given table with real
516 * data values.
517 *
518 * Dummy rounds are added as follows:
519 * 1. One dummy round added to the initial round key addition (executed in
520 * random order).
521 * 2. Random number of dummy rounds added as first and/or last AES calculation
522 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
523 *
524 * Description of the bytes in the table are as follows:
525 * - 2 bytes for initial round key addition
526 * - remaining bytes for AES calculation with real or dummy data
527 *
528 * Each byte indicates one AES calculation round:
529 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
530 * -bit 2 = offset for even/odd rounds
531 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200532 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200533 * Return Number of additional AES rounds
534 *
535 * Example of the control bytes:
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200536 * 1. No countermeasures enabled and AES-128, only real data (R) used:
537 * | Ri | R | R | R | R | R | R | R | R | R | R |
538 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200539 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200540 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
541 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
542 * |0x10|0x03 |0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200543 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200544#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200545static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200546{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200547 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200548
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200549 mbedtls_platform_memset( tbl, 0, tbl_len );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200550 // get random from 0xfff (each byte will be used separately)
551 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200552
553 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200554 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200555 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200556 tbl[i++] = 0x10; // dummy data
557 tbl[i++] = 0x00 | 0x03; // real data + stop marker
558 } else {
559 tbl[i++] = 0x00; // real data
560 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200561 }
562
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200563 // Randomize number of dummy AES rounds
564 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num >> 8 ) & 0x01 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200565 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200566
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200567 // randomize positions for the dummy rounds
568 num = ( num & 0x00f ) % ( dummy_rounds + 1 );
569
570 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200571 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200572 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200573 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200574 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200575
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200576 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200577 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578 {
579 tbl[j] = 0x10; // dummy data
580 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200581
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200582 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200583 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200584 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200585 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200586 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200587 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200588 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200589 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200590 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200591 is_even_pos = 0;
592 }
593 else
594 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200595 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 is_even_pos = 1;
597 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200598 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200599 }
600 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200601
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200602 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
603 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
604
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200605 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200606}
Arto Kinnunen311ab592020-01-16 17:20:51 +0200607#endif /*MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200608
Hanno Beckerad049a92017-06-19 16:31:54 +0100609#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200610
611#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
612#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
613#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
614
615#define AES_RT0(idx) RT0[idx]
616#define AES_RT1(idx) ROTL8( RT0[idx] )
617#define AES_RT2(idx) ROTL16( RT0[idx] )
618#define AES_RT3(idx) ROTL24( RT0[idx] )
619
620#define AES_FT0(idx) FT0[idx]
621#define AES_FT1(idx) ROTL8( FT0[idx] )
622#define AES_FT2(idx) ROTL16( FT0[idx] )
623#define AES_FT3(idx) ROTL24( FT0[idx] )
624
Hanno Becker177d3cf2017-06-07 15:52:48 +0100625#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200626
627#define AES_RT0(idx) RT0[idx]
628#define AES_RT1(idx) RT1[idx]
629#define AES_RT2(idx) RT2[idx]
630#define AES_RT3(idx) RT3[idx]
631
632#define AES_FT0(idx) FT0[idx]
633#define AES_FT1(idx) FT1[idx]
634#define AES_FT2(idx) FT2[idx]
635#define AES_FT3(idx) FT3[idx]
636
Hanno Becker177d3cf2017-06-07 15:52:48 +0100637#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200638
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200640{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100641 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000642
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200643 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200644}
645
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200647{
648 if( ctx == NULL )
649 return;
650
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500651 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200652}
653
Jaeden Amero9366feb2018-05-29 18:55:17 +0100654#if defined(MBEDTLS_CIPHER_MODE_XTS)
655void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
656{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100657 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000658
Jaeden Amero9366feb2018-05-29 18:55:17 +0100659 mbedtls_aes_init( &ctx->crypt );
660 mbedtls_aes_init( &ctx->tweak );
661}
662
663void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
664{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100665 if( ctx == NULL )
666 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000667
Jaeden Amero9366feb2018-05-29 18:55:17 +0100668 mbedtls_aes_free( &ctx->crypt );
669 mbedtls_aes_free( &ctx->tweak );
670}
671#endif /* MBEDTLS_CIPHER_MODE_XTS */
672
Paul Bakker5121ce52009-01-03 21:22:43 +0000673/*
674 * AES key schedule (encryption)
675 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200676#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200678 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000679{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200680 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200681 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200682 volatile unsigned int i = 0;
683 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000684 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200685 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000686
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100687 AES_VALIDATE_RET( ctx != NULL );
688 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000689
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200690 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000691 {
692 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300693#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000694 case 192: ctx->nr = 12; break;
695 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300696#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000698 }
699
Simon Butcher5201e412018-12-06 17:40:14 +0000700#if !defined(MBEDTLS_AES_ROM_TABLES)
701 if( aes_init_done == 0 )
702 {
703 aes_gen_tables();
704 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000705 }
706#endif
707
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200708#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000709 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100710 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000711
712 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000714 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000715#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000716 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100719 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200720 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100721#endif
722
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200723 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
724 offset = mbedtls_platform_random_in_range( keybits >> 5 );
725
726 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000727 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200728 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200729 flow_ctrl++;
730 }
731
732 for( j = 0; j < offset; j++ )
733 {
734 GET_UINT32_LE( RK[j], key, j << 2 );
735 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000736 }
737
738 switch( ctx->nr )
739 {
740 case 10:
741
742 for( i = 0; i < 10; i++, RK += 4 )
743 {
744 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000745 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
746 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
747 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
748 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000749
750 RK[5] = RK[1] ^ RK[4];
751 RK[6] = RK[2] ^ RK[5];
752 RK[7] = RK[3] ^ RK[6];
753 }
754 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300755#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000756 case 12:
757
758 for( i = 0; i < 8; i++, RK += 6 )
759 {
760 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000761 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
762 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
763 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
764 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000765
766 RK[7] = RK[1] ^ RK[6];
767 RK[8] = RK[2] ^ RK[7];
768 RK[9] = RK[3] ^ RK[8];
769 RK[10] = RK[4] ^ RK[9];
770 RK[11] = RK[5] ^ RK[10];
771 }
772 break;
773
774 case 14:
775
776 for( i = 0; i < 7; i++, RK += 8 )
777 {
778 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000779 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
780 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
781 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
782 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000783
784 RK[9] = RK[1] ^ RK[8];
785 RK[10] = RK[2] ^ RK[9];
786 RK[11] = RK[3] ^ RK[10];
787
788 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000789 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
790 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
791 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
792 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000793
794 RK[13] = RK[5] ^ RK[12];
795 RK[14] = RK[6] ^ RK[13];
796 RK[15] = RK[7] ^ RK[14];
797 }
798 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300799#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000800 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000801
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200802 ret = 0;
803
804 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200805 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200806#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
807 || ( ctx->nr == 12 && i == 8 )
808 || ( ctx->nr == 14 && i == 7 )
809#endif
810 ) )
811 {
812 return ret;
813 }
814
815 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000816}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200817#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000818
819/*
820 * AES key schedule (decryption)
821 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200822#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200824 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000825{
Arto Kinnunen14804442019-10-16 13:43:59 +0300826#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
827 (void) ctx;
828 (void) key;
829 (void) keybits;
830
831 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
832#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200833 volatile unsigned int i = 0, j = 0;
834 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200835 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000836 uint32_t *RK;
837 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200838
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100839 AES_VALIDATE_RET( ctx != NULL );
840 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000843
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000845 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100846 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000847
848 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000850 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000851#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000852 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000853
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200854 /* Also checks keybits */
855 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200856 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000857
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200858 ctx->nr = cty.nr;
859
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100861 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100862 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100864 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200865 i = 0;
866 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200867 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100868 }
869#endif
870
Paul Bakker5121ce52009-01-03 21:22:43 +0000871 SK = cty.rk + cty.nr * 4;
872
873 *RK++ = *SK++;
874 *RK++ = *SK++;
875 *RK++ = *SK++;
876 *RK++ = *SK++;
877
878 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
879 {
880 for( j = 0; j < 4; j++, SK++ )
881 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200882 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
883 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
884 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
885 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000886 }
887 }
888
889 *RK++ = *SK++;
890 *RK++ = *SK++;
891 *RK++ = *SK++;
892 *RK++ = *SK++;
893
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200894exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000896
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200897 if( ret != 0 )
898 {
899 return( ret );
900 }
901 else if( ( i == 0 ) && ( j == 4 ) )
902 {
903 return( ret );
904 }
905 else
906 {
907 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
908 }
909
Arto Kinnunen14804442019-10-16 13:43:59 +0300910#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000911}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100912
913#if defined(MBEDTLS_CIPHER_MODE_XTS)
914static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
915 unsigned int keybits,
916 const unsigned char **key1,
917 unsigned int *key1bits,
918 const unsigned char **key2,
919 unsigned int *key2bits )
920{
921 const unsigned int half_keybits = keybits / 2;
922 const unsigned int half_keybytes = half_keybits / 8;
923
924 switch( keybits )
925 {
926 case 256: break;
927 case 512: break;
928 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
929 }
930
931 *key1bits = half_keybits;
932 *key2bits = half_keybits;
933 *key1 = &key[0];
934 *key2 = &key[half_keybytes];
935
936 return 0;
937}
938
939int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
940 const unsigned char *key,
941 unsigned int keybits)
942{
943 int ret;
944 const unsigned char *key1, *key2;
945 unsigned int key1bits, key2bits;
946
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100947 AES_VALIDATE_RET( ctx != NULL );
948 AES_VALIDATE_RET( key != NULL );
949
Jaeden Amero9366feb2018-05-29 18:55:17 +0100950 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
951 &key2, &key2bits );
952 if( ret != 0 )
953 return( ret );
954
955 /* Set the tweak key. Always set tweak key for the encryption mode. */
956 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
957 if( ret != 0 )
958 return( ret );
959
960 /* Set crypt key for encryption. */
961 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
962}
963
964int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
965 const unsigned char *key,
966 unsigned int keybits)
967{
968 int ret;
969 const unsigned char *key1, *key2;
970 unsigned int key1bits, key2bits;
971
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100972 AES_VALIDATE_RET( ctx != NULL );
973 AES_VALIDATE_RET( key != NULL );
974
Jaeden Amero9366feb2018-05-29 18:55:17 +0100975 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
976 &key2, &key2bits );
977 if( ret != 0 )
978 return( ret );
979
980 /* Set the tweak key. Always set tweak key for encryption. */
981 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
982 if( ret != 0 )
983 return( ret );
984
985 /* Set crypt key for decryption. */
986 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
987}
988#endif /* MBEDTLS_CIPHER_MODE_XTS */
989
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200990#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000991
Paul Bakker5121ce52009-01-03 21:22:43 +0000992/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200993 * AES-ECB block encryption
994 */
995#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +0200996
Arto Kinnunen311ab592020-01-16 17:20:51 +0200997#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +0200998static uint32_t *aes_fround( uint32_t *R,
999 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1000 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1001{
1002 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1003 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1004 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1005 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1006
1007 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1008 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1009 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1010 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1011
1012 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1013 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1014 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1015 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1016
1017 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1018 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1019 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1020 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1021
1022 return R;
1023}
1024
1025static void aes_fround_final( uint32_t *R,
1026 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1027 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1028{
1029 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1030 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1031 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1032 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1033
1034 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1035 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1036 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1037 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1038
1039 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1040 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1041 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1042 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1043
1044 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1045 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1046 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1047 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1048}
1049
Andres AGf5bf7182017-03-03 14:09:56 +00001050int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1051 const unsigned char input[16],
1052 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001053{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001054 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001055 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001056 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001057 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001058 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001059 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001060 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001061 // control bytes for AES calculation rounds,
1062 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1063 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001064
Arto Kinnunen172836a2019-11-28 13:34:13 +02001065 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001066 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001067 aes_data_table[0] = &aes_data_real;
1068 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001069
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001070 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001071 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1072 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001073 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001074
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001075 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1076 offset = mbedtls_platform_random_in_range( 4 );
1077
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001078 i = offset;
1079 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001080 {
1081 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001082 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001083 flow_control++;
1084 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001085
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001086 tindex = 0;
1087 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001088 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001089 // Get pointer to the real or fake data
1090 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1091 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001092
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001093 // initial round key addition
1094 for( i = 0; i < 4; i++ )
1095 {
1096 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1097 }
1098 tindex++;
1099 flow_control++;
1100 } while( stop_mark == 0 );
1101
1102 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1103 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001104 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001105 // Get pointer to the real or fake data
1106 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1107 offset = round_ctrl_table[tindex] & 0x04;
1108 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001109
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001110 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1111 &aes_data_ptr->xy_values[0 + offset],
1112 &aes_data_ptr->xy_values[1 + offset],
1113 &aes_data_ptr->xy_values[2 + offset],
1114 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001115 aes_data_ptr->xy_values[4 - offset],
1116 aes_data_ptr->xy_values[5 - offset],
1117 aes_data_ptr->xy_values[6 - offset],
1118 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001119 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001120 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001121 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001122
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001123 // Calculate final AES round + dummy rounds
1124 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001125 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001126 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1127 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001128 aes_fround_final( aes_data_ptr->rk_ptr,
1129 &aes_data_ptr->xy_values[0],
1130 &aes_data_ptr->xy_values[1],
1131 &aes_data_ptr->xy_values[2],
1132 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001133 aes_data_ptr->xy_values[4],
1134 aes_data_ptr->xy_values[5],
1135 aes_data_ptr->xy_values[6],
1136 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001137 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001138 tindex++;
1139 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001140
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001141 mbedtls_platform_memset( output, 0, 16 );
1142 offset = mbedtls_platform_random_in_range( 4 );
1143
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001144 i = offset;
1145 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001146 {
1147 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1148 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001149 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001150
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001151 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001152 {
1153 /* Validate control path due possible fault injection */
1154 return 0;
1155 }
1156
1157 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001158}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001159
1160#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1161
1162#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1163 do \
1164 { \
1165 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1166 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1167 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1168 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1169 \
1170 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1171 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1172 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1173 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1174 \
1175 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1176 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1177 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1178 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1179 \
1180 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1181 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1182 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1183 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1184 } while( 0 )
1185
1186int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1187 const unsigned char input[16],
1188 unsigned char output[16] )
1189{
1190 int i;
1191 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1192
1193 RK = ctx->rk;
1194
1195 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1196 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1197 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1198 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1199
1200 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1201 {
1202 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1203 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1204 }
1205
1206 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1207
1208 X0 = *RK++ ^ \
1209 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1210 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1211 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1212 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1213
1214 X1 = *RK++ ^ \
1215 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1216 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1217 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1218 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1219
1220 X2 = *RK++ ^ \
1221 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1222 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1223 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1224 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1225
1226 X3 = *RK++ ^ \
1227 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1228 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1229 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1230 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1231
1232 PUT_UINT32_LE( X0, output, 0 );
1233 PUT_UINT32_LE( X1, output, 4 );
1234 PUT_UINT32_LE( X2, output, 8 );
1235 PUT_UINT32_LE( X3, output, 12 );
1236
1237 return( 0 );
1238}
1239#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001240#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1241
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001242#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001243void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1244 const unsigned char input[16],
1245 unsigned char output[16] )
1246{
1247 mbedtls_internal_aes_encrypt( ctx, input, output );
1248}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001249#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001250
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001251/*
1252 * AES-ECB block decryption
1253 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001254
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001255#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001256#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001257
Arto Kinnunen311ab592020-01-16 17:20:51 +02001258#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001259static uint32_t *aes_rround( uint32_t *R,
1260 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1261 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1262{
1263 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1264 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1265 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1266 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1267
1268 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1269 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1270 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1271 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1272
1273 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1274 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1275 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1276 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1277
1278 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1279 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1280 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1281 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1282 return R;
1283}
1284
1285static void aes_rround_final( uint32_t *R,
1286 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1287 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1288{
1289 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1290 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1291 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1292 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1293
1294 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1295 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1296 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1297 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1298
1299 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1300 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1301 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1302 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1303
1304 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1305 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1306 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1307 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1308}
1309
Andres AGf5bf7182017-03-03 14:09:56 +00001310int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1311 const unsigned char input[16],
1312 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001313{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001314 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001315 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001316 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001317 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001318 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001319 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001320 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001321 // control bytes for AES calculation rounds,
1322 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1323 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001324
Arto Kinnunen172836a2019-11-28 13:34:13 +02001325 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001326 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001327 aes_data_table[0] = &aes_data_real;
1328 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001329
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001330 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001331 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001332 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001333 flow_control = dummy_rounds;
1334
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001335 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1336 offset = mbedtls_platform_random_in_range( 4 );
1337
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001338 i = offset;
1339 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001340 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001341 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001342 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001343 flow_control++;
1344 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001345
1346 tindex = 0;
1347 do
1348 {
1349 // Get pointer to the real or fake data
1350 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1351 stop_mark = round_ctrl_table[tindex] & 0x03;
1352
1353 // initial round key addition
1354 for( i = 0; i < 4; i++ )
1355 {
1356 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1357 }
1358 tindex++;
1359 flow_control++;
1360 } while( stop_mark == 0 );
1361
1362 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1363 do
1364 {
1365 // Get pointer to the real or fake data
1366 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1367 offset = round_ctrl_table[tindex] & 0x04;
1368 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001369
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001370 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1371 &aes_data_ptr->xy_values[0 + offset],
1372 &aes_data_ptr->xy_values[1 + offset],
1373 &aes_data_ptr->xy_values[2 + offset],
1374 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001375 aes_data_ptr->xy_values[4 - offset],
1376 aes_data_ptr->xy_values[5 - offset],
1377 aes_data_ptr->xy_values[6 - offset],
1378 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001379 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001380 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001381 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001382
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001383 // Calculate final AES round + dummy rounds
1384 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001385 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001386 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1387 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001388 aes_rround_final( aes_data_ptr->rk_ptr,
1389 &aes_data_ptr->xy_values[0],
1390 &aes_data_ptr->xy_values[1],
1391 &aes_data_ptr->xy_values[2],
1392 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001393 aes_data_ptr->xy_values[4],
1394 aes_data_ptr->xy_values[5],
1395 aes_data_ptr->xy_values[6],
1396 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001397 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001398 tindex++;
1399 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001400
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001401 mbedtls_platform_memset( output, 0, 16 );
1402 offset = mbedtls_platform_random_in_range( 4 );
1403
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001404 i = offset;
1405 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001406 {
1407 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001408 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001409 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001410
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001411 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001412 {
1413 /* Validate control path due possible fault injection */
1414 return 0;
1415 }
1416
1417 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001418}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001419
1420#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1421
1422#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1423 do \
1424 { \
1425 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1426 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1427 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1428 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1429 \
1430 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1431 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1432 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1433 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1434 \
1435 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1436 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1437 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1438 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1439 \
1440 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1441 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1442 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1443 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1444 } while( 0 )
1445
1446int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1447 const unsigned char input[16],
1448 unsigned char output[16] )
1449{
1450 int i;
1451 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1452
1453 RK = ctx->rk;
1454
1455 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1456 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1457 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1458 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1459
1460 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1461 {
1462 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1463 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1464 }
1465
1466 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1467
1468 X0 = *RK++ ^ \
1469 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1470 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1471 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1472 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1473
1474 X1 = *RK++ ^ \
1475 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1476 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1477 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1478 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1479
1480 X2 = *RK++ ^ \
1481 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1482 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1483 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1484 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1485
1486 X3 = *RK++ ^ \
1487 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1488 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1489 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1490 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1491
1492 PUT_UINT32_LE( X0, output, 0 );
1493 PUT_UINT32_LE( X1, output, 4 );
1494 PUT_UINT32_LE( X2, output, 8 );
1495 PUT_UINT32_LE( X3, output, 12 );
1496
1497 return( 0 );
1498}
1499#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1500
Arto Kinnunen14804442019-10-16 13:43:59 +03001501#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001502#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1503
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001504#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001505void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1506 const unsigned char input[16],
1507 unsigned char output[16] )
1508{
Arto Kinnunen14804442019-10-16 13:43:59 +03001509#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1510 (void) ctx;
1511 (void) input;
1512 (void) output;
1513#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001514 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001515#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001516}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001517#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001518
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001519/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001520 * AES-ECB block encryption/decryption
1521 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001523 int mode,
1524 const unsigned char input[16],
1525 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001526{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001527 AES_VALIDATE_RET( ctx != NULL );
1528 AES_VALIDATE_RET( input != NULL );
1529 AES_VALIDATE_RET( output != NULL );
1530 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1531 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001532 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001533
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001534#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001535 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001536 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001537#endif
1538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001539#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001540 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001541 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001542 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001543 return( 0 );
1544
1545 // If padlock data misaligned, we just fall back to
1546 // unaccelerated mode
1547 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001548 }
1549#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001550
Arto Kinnunen14804442019-10-16 13:43:59 +03001551#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1552 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1553#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001554
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001555 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001556 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001557 else
Andres AGf5bf7182017-03-03 14:09:56 +00001558 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001559#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001560}
1561
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001562#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001563/*
1564 * AES-CBC buffer encryption/decryption
1565 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001566int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001567 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001568 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001569 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001570 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001571 unsigned char *output )
1572{
1573 int i;
1574 unsigned char temp[16];
1575
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001576 AES_VALIDATE_RET( ctx != NULL );
1577 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1578 mode == MBEDTLS_AES_DECRYPT );
1579 AES_VALIDATE_RET( iv != NULL );
1580 AES_VALIDATE_RET( input != NULL );
1581 AES_VALIDATE_RET( output != NULL );
1582
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001583 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001584 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001585
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001586#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001587 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001588 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001589 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001590 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001591
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001592 // If padlock data misaligned, we just fall back to
1593 // unaccelerated mode
1594 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001595 }
1596#endif
1597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001598 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001599 {
1600 while( length > 0 )
1601 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001602 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001603 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001604
1605 for( i = 0; i < 16; i++ )
1606 output[i] = (unsigned char)( output[i] ^ iv[i] );
1607
Teppo Järvelin91d79382019-10-02 09:09:31 +03001608 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001609
1610 input += 16;
1611 output += 16;
1612 length -= 16;
1613 }
1614 }
1615 else
1616 {
1617 while( length > 0 )
1618 {
1619 for( i = 0; i < 16; i++ )
1620 output[i] = (unsigned char)( input[i] ^ iv[i] );
1621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001622 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001623 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001624
1625 input += 16;
1626 output += 16;
1627 length -= 16;
1628 }
1629 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001630
1631 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001632}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001633#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001634
Aorimn5f778012016-06-09 23:22:58 +02001635#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001636
1637/* Endianess with 64 bits values */
1638#ifndef GET_UINT64_LE
1639#define GET_UINT64_LE(n,b,i) \
1640{ \
1641 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1642 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1643 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1644 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1645 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1646 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1647 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1648 | ( (uint64_t) (b)[(i) ] ); \
1649}
1650#endif
1651
1652#ifndef PUT_UINT64_LE
1653#define PUT_UINT64_LE(n,b,i) \
1654{ \
1655 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1656 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1657 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1658 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1659 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1660 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1661 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1662 (b)[(i) ] = (unsigned char) ( (n) ); \
1663}
1664#endif
1665
1666typedef unsigned char mbedtls_be128[16];
1667
1668/*
1669 * GF(2^128) multiplication function
1670 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001671 * This function multiplies a field element by x in the polynomial field
1672 * representation. It uses 64-bit word operations to gain speed but compensates
1673 * for machine endianess and hence works correctly on both big and little
1674 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001675 */
1676static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001677 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001678{
1679 uint64_t a, b, ra, rb;
1680
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001681 GET_UINT64_LE( a, x, 0 );
1682 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001683
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001684 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1685 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001686
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001687 PUT_UINT64_LE( ra, r, 0 );
1688 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001689}
1690
Aorimn5f778012016-06-09 23:22:58 +02001691/*
1692 * AES-XTS buffer encryption/decryption
1693 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001694int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1695 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001696 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001697 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001698 const unsigned char *input,
1699 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001700{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001701 int ret;
1702 size_t blocks = length / 16;
1703 size_t leftover = length % 16;
1704 unsigned char tweak[16];
1705 unsigned char prev_tweak[16];
1706 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001707
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001708 AES_VALIDATE_RET( ctx != NULL );
1709 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1710 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001711 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001712 AES_VALIDATE_RET( input != NULL );
1713 AES_VALIDATE_RET( output != NULL );
1714
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001715 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001716 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001717 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001718
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001719 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001720 if( length > ( 1 << 20 ) * 16 )
1721 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001722
Jaeden Amerod82cd862018-04-28 15:02:45 +01001723 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001724 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1725 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001726 if( ret != 0 )
1727 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001728
Jaeden Amerod82cd862018-04-28 15:02:45 +01001729 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001730 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001731 size_t i;
1732
1733 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1734 {
1735 /* We are on the last block in a decrypt operation that has
1736 * leftover bytes, so we need to use the next tweak for this block,
1737 * and this tweak for the lefover bytes. Save the current tweak for
1738 * the leftovers and then update the current tweak for use on this,
1739 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001740 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001741 mbedtls_gf128mul_x_ble( tweak, tweak );
1742 }
1743
1744 for( i = 0; i < 16; i++ )
1745 tmp[i] = input[i] ^ tweak[i];
1746
1747 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1748 if( ret != 0 )
1749 return( ret );
1750
1751 for( i = 0; i < 16; i++ )
1752 output[i] = tmp[i] ^ tweak[i];
1753
1754 /* Update the tweak for the next block. */
1755 mbedtls_gf128mul_x_ble( tweak, tweak );
1756
1757 output += 16;
1758 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001759 }
1760
Jaeden Amerod82cd862018-04-28 15:02:45 +01001761 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001762 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001763 /* If we are on the leftover bytes in a decrypt operation, we need to
1764 * use the previous tweak for these bytes (as saved in prev_tweak). */
1765 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001766
Jaeden Amerod82cd862018-04-28 15:02:45 +01001767 /* We are now on the final part of the data unit, which doesn't divide
1768 * evenly by 16. It's time for ciphertext stealing. */
1769 size_t i;
1770 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001771
Jaeden Amerod82cd862018-04-28 15:02:45 +01001772 /* Copy ciphertext bytes from the previous block to our output for each
1773 * byte of cyphertext we won't steal. At the same time, copy the
1774 * remainder of the input for this final round (since the loop bounds
1775 * are the same). */
1776 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001777 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001778 output[i] = prev_output[i];
1779 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001780 }
Aorimn5f778012016-06-09 23:22:58 +02001781
Jaeden Amerod82cd862018-04-28 15:02:45 +01001782 /* Copy ciphertext bytes from the previous block for input in this
1783 * round. */
1784 for( ; i < 16; i++ )
1785 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001786
Jaeden Amerod82cd862018-04-28 15:02:45 +01001787 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1788 if( ret != 0 )
1789 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001790
Jaeden Amerod82cd862018-04-28 15:02:45 +01001791 /* Write the result back to the previous block, overriding the previous
1792 * output we copied. */
1793 for( i = 0; i < 16; i++ )
1794 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001795 }
1796
1797 return( 0 );
1798}
1799#endif /* MBEDTLS_CIPHER_MODE_XTS */
1800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001802/*
1803 * AES-CFB128 buffer encryption/decryption
1804 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001805int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001806 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001807 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001808 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001809 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001810 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001811 unsigned char *output )
1812{
Paul Bakker27fdf462011-06-09 13:55:13 +00001813 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001814 size_t n;
1815
1816 AES_VALIDATE_RET( ctx != NULL );
1817 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1818 mode == MBEDTLS_AES_DECRYPT );
1819 AES_VALIDATE_RET( iv_off != NULL );
1820 AES_VALIDATE_RET( iv != NULL );
1821 AES_VALIDATE_RET( input != NULL );
1822 AES_VALIDATE_RET( output != NULL );
1823
1824 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001825
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001826 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001827 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1828
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001829 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001830 {
1831 while( length-- )
1832 {
1833 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001834 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001835
1836 c = *input++;
1837 *output++ = (unsigned char)( c ^ iv[n] );
1838 iv[n] = (unsigned char) c;
1839
Paul Bakker66d5d072014-06-17 16:39:18 +02001840 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001841 }
1842 }
1843 else
1844 {
1845 while( length-- )
1846 {
1847 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001848 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001849
1850 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1851
Paul Bakker66d5d072014-06-17 16:39:18 +02001852 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001853 }
1854 }
1855
1856 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001857
1858 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001859}
Paul Bakker556efba2014-01-24 15:38:12 +01001860
1861/*
1862 * AES-CFB8 buffer encryption/decryption
1863 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001865 int mode,
1866 size_t length,
1867 unsigned char iv[16],
1868 const unsigned char *input,
1869 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001870{
1871 unsigned char c;
1872 unsigned char ov[17];
1873
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001874 AES_VALIDATE_RET( ctx != NULL );
1875 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1876 mode == MBEDTLS_AES_DECRYPT );
1877 AES_VALIDATE_RET( iv != NULL );
1878 AES_VALIDATE_RET( input != NULL );
1879 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001880 while( length-- )
1881 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001882 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001883 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001884
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001885 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001886 ov[16] = *input;
1887
1888 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1889
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001890 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001891 ov[16] = c;
1892
Teppo Järvelin91d79382019-10-02 09:09:31 +03001893 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001894 }
1895
1896 return( 0 );
1897}
Simon Butcher76a5b222018-04-22 22:57:27 +01001898#endif /* MBEDTLS_CIPHER_MODE_CFB */
1899
1900#if defined(MBEDTLS_CIPHER_MODE_OFB)
1901/*
1902 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1903 */
1904int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001905 size_t length,
1906 size_t *iv_off,
1907 unsigned char iv[16],
1908 const unsigned char *input,
1909 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001910{
Simon Butcherad4e4932018-04-29 00:43:47 +01001911 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001912 size_t n;
1913
1914 AES_VALIDATE_RET( ctx != NULL );
1915 AES_VALIDATE_RET( iv_off != NULL );
1916 AES_VALIDATE_RET( iv != NULL );
1917 AES_VALIDATE_RET( input != NULL );
1918 AES_VALIDATE_RET( output != NULL );
1919
1920 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001921
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001922 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001923 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1924
Simon Butcher76a5b222018-04-22 22:57:27 +01001925 while( length-- )
1926 {
1927 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001928 {
1929 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1930 if( ret != 0 )
1931 goto exit;
1932 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001933 *output++ = *input++ ^ iv[n];
1934
1935 n = ( n + 1 ) & 0x0F;
1936 }
1937
1938 *iv_off = n;
1939
Simon Butcherad4e4932018-04-29 00:43:47 +01001940exit:
1941 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001942}
1943#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001945#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001946/*
1947 * AES-CTR buffer encryption/decryption
1948 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001949int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001950 size_t length,
1951 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001952 unsigned char nonce_counter[16],
1953 unsigned char stream_block[16],
1954 const unsigned char *input,
1955 unsigned char *output )
1956{
Paul Bakker369e14b2012-04-18 14:16:09 +00001957 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001958 size_t n;
1959
1960 AES_VALIDATE_RET( ctx != NULL );
1961 AES_VALIDATE_RET( nc_off != NULL );
1962 AES_VALIDATE_RET( nonce_counter != NULL );
1963 AES_VALIDATE_RET( stream_block != NULL );
1964 AES_VALIDATE_RET( input != NULL );
1965 AES_VALIDATE_RET( output != NULL );
1966
1967 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001968
Arto Kinnunen75439012019-12-03 14:12:10 +02001969 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001970 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1971
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001972 while( length-- )
1973 {
1974 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001975 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001976
Paul Bakker369e14b2012-04-18 14:16:09 +00001977 for( i = 16; i > 0; i-- )
1978 if( ++nonce_counter[i - 1] != 0 )
1979 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001980 }
1981 c = *input++;
1982 *output++ = (unsigned char)( c ^ stream_block[n] );
1983
Paul Bakker66d5d072014-06-17 16:39:18 +02001984 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001985 }
1986
1987 *nc_off = n;
1988
1989 return( 0 );
1990}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001991#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001993#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001994
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001995#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001996/*
1997 * AES test vectors from:
1998 *
1999 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2000 */
2001static const unsigned char aes_test_ecb_dec[3][16] =
2002{
2003 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2004 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2005 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2006 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2007 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2008 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2009};
2010
2011static const unsigned char aes_test_ecb_enc[3][16] =
2012{
2013 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2014 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2015 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2016 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2017 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2018 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2019};
2020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002021#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002022static const unsigned char aes_test_cbc_dec[3][16] =
2023{
2024 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2025 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2026 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2027 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2028 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2029 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2030};
2031
2032static const unsigned char aes_test_cbc_enc[3][16] =
2033{
2034 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2035 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2036 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2037 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2038 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2039 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2040};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002044/*
2045 * AES-CFB128 test vectors from:
2046 *
2047 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2048 */
2049static const unsigned char aes_test_cfb128_key[3][32] =
2050{
2051 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2052 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2053 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2054 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2055 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2056 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2057 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2058 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2059 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2060};
2061
2062static const unsigned char aes_test_cfb128_iv[16] =
2063{
2064 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2065 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2066};
2067
2068static const unsigned char aes_test_cfb128_pt[64] =
2069{
2070 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2071 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2072 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2073 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2074 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2075 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2076 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2077 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2078};
2079
2080static const unsigned char aes_test_cfb128_ct[3][64] =
2081{
2082 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2083 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2084 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2085 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2086 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2087 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2088 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2089 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2090 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2091 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2092 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2093 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2094 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2095 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2096 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2097 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2098 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2099 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2100 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2101 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2102 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2103 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2104 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2105 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2106};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002107#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002108
Simon Butcherad4e4932018-04-29 00:43:47 +01002109#if defined(MBEDTLS_CIPHER_MODE_OFB)
2110/*
2111 * AES-OFB test vectors from:
2112 *
Simon Butcher5db13622018-06-04 22:11:25 +01002113 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002114 */
2115static const unsigned char aes_test_ofb_key[3][32] =
2116{
2117 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2118 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2119 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2120 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2121 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2122 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2123 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2124 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2125 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2126};
2127
2128static const unsigned char aes_test_ofb_iv[16] =
2129{
2130 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2131 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2132};
2133
2134static const unsigned char aes_test_ofb_pt[64] =
2135{
2136 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2137 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2138 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2139 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2140 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2141 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2142 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2143 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2144};
2145
2146static const unsigned char aes_test_ofb_ct[3][64] =
2147{
2148 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2149 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2150 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2151 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2152 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2153 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2154 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2155 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2156 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2157 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2158 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2159 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2160 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2161 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2162 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2163 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2164 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2165 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2166 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2167 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2168 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2169 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2170 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2171 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2172};
2173#endif /* MBEDTLS_CIPHER_MODE_OFB */
2174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002176/*
2177 * AES-CTR test vectors from:
2178 *
2179 * http://www.faqs.org/rfcs/rfc3686.html
2180 */
2181
2182static const unsigned char aes_test_ctr_key[3][16] =
2183{
2184 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2185 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2186 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2187 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2188 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2189 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2190};
2191
2192static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2193{
2194 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2196 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2197 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2198 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2199 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2200};
2201
2202static const unsigned char aes_test_ctr_pt[3][48] =
2203{
2204 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2205 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2206
2207 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2208 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2209 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2210 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2211
2212 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2213 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2214 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2215 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2216 0x20, 0x21, 0x22, 0x23 }
2217};
2218
2219static const unsigned char aes_test_ctr_ct[3][48] =
2220{
2221 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2222 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2223 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2224 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2225 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2226 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2227 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2228 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2229 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2230 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2231 0x25, 0xB2, 0x07, 0x2F }
2232};
2233
2234static const int aes_test_ctr_len[3] =
2235 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002237
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002238#if defined(MBEDTLS_CIPHER_MODE_XTS)
2239/*
2240 * AES-XTS test vectors from:
2241 *
2242 * IEEE P1619/D16 Annex B
2243 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2244 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2245 */
2246static const unsigned char aes_test_xts_key[][32] =
2247{
2248 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2252 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2253 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2254 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2255 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2256 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2257 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2258 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2259 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2260};
2261
2262static const unsigned char aes_test_xts_pt32[][32] =
2263{
2264 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2268 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2269 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2270 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2271 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2272 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2273 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2274 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2275 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2276};
2277
2278static const unsigned char aes_test_xts_ct32[][32] =
2279{
2280 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2281 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2282 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2283 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2284 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2285 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2286 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2287 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2288 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2289 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2290 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2291 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2292};
2293
2294static const unsigned char aes_test_xts_data_unit[][16] =
2295{
2296 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2298 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2300 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2302};
2303
2304#endif /* MBEDTLS_CIPHER_MODE_XTS */
2305
Paul Bakker5121ce52009-01-03 21:22:43 +00002306/*
2307 * Checkup routine
2308 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002309int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002310{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002311 int ret = 0, i, j, u, mode;
2312 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002313 unsigned char key[32];
2314 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002315 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002316#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002317 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002318#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002319#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002320 unsigned char prv[16];
2321#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002322#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2323 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002324 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002325#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002326#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002327 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002328#endif
2329#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002330 unsigned char nonce_counter[16];
2331 unsigned char stream_block[16];
2332#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002333 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002334
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002335 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002336 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002337
2338 /*
2339 * ECB mode
2340 */
2341 for( i = 0; i < 6; i++ )
2342 {
2343 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002344 keybits = 128 + u * 64;
2345 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002346
2347 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002348 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2349 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002350
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002351#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2352 if( keybits > 128 )
2353 {
2354 mbedtls_printf( "skipped\n" );
2355 continue;
2356 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002357#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2358
2359#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2360 if( mode == MBEDTLS_AES_DECRYPT )
2361 {
2362 mbedtls_printf( "skipped\n" );
2363 continue;
2364 }
2365#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002366
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002367 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002368
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002369 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002370 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002371 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2372 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002373 }
2374 else
2375 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002376 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2377 aes_tests = aes_test_ecb_enc[u];
2378 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002379
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002380 /*
2381 * AES-192 is an optional feature that may be unavailable when
2382 * there is an alternative underlying implementation i.e. when
2383 * MBEDTLS_AES_ALT is defined.
2384 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002385 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002386 {
2387 mbedtls_printf( "skipped\n" );
2388 continue;
2389 }
2390 else if( ret != 0 )
2391 {
2392 goto exit;
2393 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002395 for( j = 0; j < 10000; j++ )
2396 {
2397 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2398 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002399 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002400 }
2401
2402 if( memcmp( buf, aes_tests, 16 ) != 0 )
2403 {
2404 ret = 1;
2405 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002406 }
2407
2408 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002409 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002410 }
2411
2412 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002413 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002415#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002416 /*
2417 * CBC mode
2418 */
2419 for( i = 0; i < 6; i++ )
2420 {
2421 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002422 keybits = 128 + u * 64;
2423 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002424
2425 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002426 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2427 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002428
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002429#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2430 if( keybits > 128 )
2431 {
2432 mbedtls_printf( "skipped\n" );
2433 continue;
2434 }
2435#endif
2436
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002437#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2438 if( mode == MBEDTLS_AES_DECRYPT )
2439 {
2440 mbedtls_printf( "skipped\n" );
2441 continue;
2442 }
2443#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2444
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002445 memset( iv , 0, 16 );
2446 memset( prv, 0, 16 );
2447 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002448
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002449 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002450 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002451 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2452 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002453 }
2454 else
2455 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002456 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2457 aes_tests = aes_test_cbc_enc[u];
2458 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002459
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002460 /*
2461 * AES-192 is an optional feature that may be unavailable when
2462 * there is an alternative underlying implementation i.e. when
2463 * MBEDTLS_AES_ALT is defined.
2464 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002465 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002466 {
2467 mbedtls_printf( "skipped\n" );
2468 continue;
2469 }
2470 else if( ret != 0 )
2471 {
2472 goto exit;
2473 }
2474
2475 for( j = 0; j < 10000; j++ )
2476 {
2477 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002478 {
2479 unsigned char tmp[16];
2480
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002481 memcpy( tmp, prv, 16 );
2482 memcpy( prv, buf, 16 );
2483 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002484 }
2485
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002486 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2487 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002488 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002489
2490 }
2491
2492 if( memcmp( buf, aes_tests, 16 ) != 0 )
2493 {
2494 ret = 1;
2495 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002496 }
2497
2498 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002499 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002500 }
2501
2502 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002503 mbedtls_printf( "\n" );
2504#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002505
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002506#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002507 /*
2508 * CFB128 mode
2509 */
2510 for( i = 0; i < 6; i++ )
2511 {
2512 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002513 keybits = 128 + u * 64;
2514 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002515
2516 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002517 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2518 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002519
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002520#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2521 if( keybits > 128 )
2522 {
2523 mbedtls_printf( "skipped\n" );
2524 continue;
2525 }
2526#endif
2527
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002528#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2529 if( mode == MBEDTLS_AES_DECRYPT )
2530 {
2531 mbedtls_printf( "skipped\n" );
2532 continue;
2533 }
2534#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2535
Paul Bakker5121ce52009-01-03 21:22:43 +00002536 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002537 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002538
2539 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002540 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002541 /*
2542 * AES-192 is an optional feature that may be unavailable when
2543 * there is an alternative underlying implementation i.e. when
2544 * MBEDTLS_AES_ALT is defined.
2545 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002546 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002547 {
2548 mbedtls_printf( "skipped\n" );
2549 continue;
2550 }
2551 else if( ret != 0 )
2552 {
2553 goto exit;
2554 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002555
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002556 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002557 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002558 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002559 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002560 }
2561 else
2562 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002563 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002564 aes_tests = aes_test_cfb128_ct[u];
2565 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002566
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002567 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2568 if( ret != 0 )
2569 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002570
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002571 if( memcmp( buf, aes_tests, 64 ) != 0 )
2572 {
2573 ret = 1;
2574 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002575 }
2576
2577 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002578 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002579 }
2580
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002581 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582 mbedtls_printf( "\n" );
2583#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002584
Simon Butcherad4e4932018-04-29 00:43:47 +01002585#if defined(MBEDTLS_CIPHER_MODE_OFB)
2586 /*
2587 * OFB mode
2588 */
2589 for( i = 0; i < 6; i++ )
2590 {
2591 u = i >> 1;
2592 keybits = 128 + u * 64;
2593 mode = i & 1;
2594
2595 if( verbose != 0 )
2596 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2597 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2598
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002599#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2600 if( keybits > 128 )
2601 {
2602 mbedtls_printf( "skipped\n" );
2603 continue;
2604 }
2605#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002606
2607#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2608 if( mode == MBEDTLS_AES_DECRYPT )
2609 {
2610 mbedtls_printf( "skipped\n" );
2611 continue;
2612 }
2613#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2614
Simon Butcherad4e4932018-04-29 00:43:47 +01002615 memcpy( iv, aes_test_ofb_iv, 16 );
2616 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2617
2618 offset = 0;
2619 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2620 /*
2621 * AES-192 is an optional feature that may be unavailable when
2622 * there is an alternative underlying implementation i.e. when
2623 * MBEDTLS_AES_ALT is defined.
2624 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002625 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002626 {
2627 mbedtls_printf( "skipped\n" );
2628 continue;
2629 }
2630 else if( ret != 0 )
2631 {
2632 goto exit;
2633 }
2634
2635 if( mode == MBEDTLS_AES_DECRYPT )
2636 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002637 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002638 aes_tests = aes_test_ofb_pt;
2639 }
2640 else
2641 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002642 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002643 aes_tests = aes_test_ofb_ct[u];
2644 }
2645
2646 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2647 if( ret != 0 )
2648 goto exit;
2649
2650 if( memcmp( buf, aes_tests, 64 ) != 0 )
2651 {
2652 ret = 1;
2653 goto exit;
2654 }
2655
2656 if( verbose != 0 )
2657 mbedtls_printf( "passed\n" );
2658 }
2659
2660 if( verbose != 0 )
2661 mbedtls_printf( "\n" );
2662#endif /* MBEDTLS_CIPHER_MODE_OFB */
2663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002664#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002665 /*
2666 * CTR mode
2667 */
2668 for( i = 0; i < 6; i++ )
2669 {
2670 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002671 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002672
2673 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002674 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002675 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002676
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002677#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2678 if( keybits > 128 )
2679 {
2680 mbedtls_printf( "skipped\n" );
2681 continue;
2682 }
2683#endif
2684
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002685#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2686 if( mode == MBEDTLS_AES_DECRYPT )
2687 {
2688 mbedtls_printf( "skipped\n" );
2689 continue;
2690 }
2691#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2692
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002693 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2694 memcpy( key, aes_test_ctr_key[u], 16 );
2695
2696 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002697 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2698 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002699
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002700 len = aes_test_ctr_len[u];
2701
2702 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002703 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002704 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002705 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002706 }
2707 else
2708 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002709 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002710 aes_tests = aes_test_ctr_ct[u];
2711 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002712
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002713 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2714 stream_block, buf, buf );
2715 if( ret != 0 )
2716 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002717
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002718 if( memcmp( buf, aes_tests, len ) != 0 )
2719 {
2720 ret = 1;
2721 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002722 }
2723
2724 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002725 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002726 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002727
2728 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002729 mbedtls_printf( "\n" );
2730#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002731
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002732#if defined(MBEDTLS_CIPHER_MODE_XTS)
2733 {
2734 static const int num_tests =
2735 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2736 mbedtls_aes_xts_context ctx_xts;
2737
2738 /*
2739 * XTS mode
2740 */
2741 mbedtls_aes_xts_init( &ctx_xts );
2742
2743 for( i = 0; i < num_tests << 1; i++ )
2744 {
2745 const unsigned char *data_unit;
2746 u = i >> 1;
2747 mode = i & 1;
2748
2749 if( verbose != 0 )
2750 mbedtls_printf( " AES-XTS-128 (%s): ",
2751 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2752
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002753#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2754 if( mode == MBEDTLS_AES_DECRYPT )
2755 {
2756 mbedtls_printf( "skipped\n" );
2757 continue;
2758 }
2759#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2760
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002761 memset( key, 0, sizeof( key ) );
2762 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002763 data_unit = aes_test_xts_data_unit[u];
2764
2765 len = sizeof( *aes_test_xts_ct32 );
2766
2767 if( mode == MBEDTLS_AES_DECRYPT )
2768 {
2769 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2770 if( ret != 0)
2771 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002772 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002773 aes_tests = aes_test_xts_pt32[u];
2774 }
2775 else
2776 {
2777 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2778 if( ret != 0)
2779 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002780 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002781 aes_tests = aes_test_xts_ct32[u];
2782 }
2783
2784
2785 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2786 buf, buf );
2787 if( ret != 0 )
2788 goto exit;
2789
2790 if( memcmp( buf, aes_tests, len ) != 0 )
2791 {
2792 ret = 1;
2793 goto exit;
2794 }
2795
2796 if( verbose != 0 )
2797 mbedtls_printf( "passed\n" );
2798 }
2799
2800 if( verbose != 0 )
2801 mbedtls_printf( "\n" );
2802
2803 mbedtls_aes_xts_free( &ctx_xts );
2804 }
2805#endif /* MBEDTLS_CIPHER_MODE_XTS */
2806
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002807 ret = 0;
2808
2809exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002810 if( ret != 0 && verbose != 0 )
2811 mbedtls_printf( "failed\n" );
2812
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002813 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002814
2815 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002816}
2817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002818#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002819
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002820#endif /* MBEDTLS_AES_C */