blob: f7a48984b1dff4f77fd9def95fae52d036538786 [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)
Arto Kinnunen17540ab2020-01-20 11:46:34 +020097/* Number of additional AES dummy rounds added for SCA countermeasures */
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
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200515 * enabled. If the countermeasures are not enabled then we fill the given table
516 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200517 *
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 Kinnunen17540ab2020-01-20 11:46:34 +0200536 * R = real data in actual AES calculation round
537 * Ri = Real data in initial round key addition phase
538 * F = fake data in actual AES calculation round
539 * Fi = fake data in initial round key addition phase
540 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200541 * 1. No countermeasures enabled and AES-128, only real data (R) used:
542 * | Ri | R | R | R | R | R | R | R | R | R | R |
543 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200544 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200545 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200546 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
547 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200548 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200549#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Kevin Braceya967a582020-11-04 16:28:48 +0200550static int aes_sca_cm_data_randomize( uint8_t *tbl, int tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200551{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200552 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200553
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200554 mbedtls_platform_memset( tbl, 0, tbl_len );
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400555 // get random from 0x0fff
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200556 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200557
558 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200559 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200560 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561 tbl[i++] = 0x10; // dummy data
562 tbl[i++] = 0x00 | 0x03; // real data + stop marker
563 } else {
564 tbl[i++] = 0x00; // real data
565 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200568 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200569 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200570 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200571
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 // randomize positions for the dummy rounds
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400573 num = ( num & 0x0fff ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200574
575 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200577 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200579 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200580
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200581 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200582 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200583 {
584 tbl[j] = 0x10; // dummy data
585 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200586
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200587 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200588 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200591 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200593 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200595 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 is_even_pos = 0;
597 }
598 else
599 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200600 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200601 is_even_pos = 1;
602 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200603 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200604 }
605 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200606
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200607 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
608 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
609
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200610 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200611}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200612#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200613
Hanno Beckerad049a92017-06-19 16:31:54 +0100614#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200615
616#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
617#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
618#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
619
620#define AES_RT0(idx) RT0[idx]
621#define AES_RT1(idx) ROTL8( RT0[idx] )
622#define AES_RT2(idx) ROTL16( RT0[idx] )
623#define AES_RT3(idx) ROTL24( RT0[idx] )
624
625#define AES_FT0(idx) FT0[idx]
626#define AES_FT1(idx) ROTL8( FT0[idx] )
627#define AES_FT2(idx) ROTL16( FT0[idx] )
628#define AES_FT3(idx) ROTL24( FT0[idx] )
629
Hanno Becker177d3cf2017-06-07 15:52:48 +0100630#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200631
632#define AES_RT0(idx) RT0[idx]
633#define AES_RT1(idx) RT1[idx]
634#define AES_RT2(idx) RT2[idx]
635#define AES_RT3(idx) RT3[idx]
636
637#define AES_FT0(idx) FT0[idx]
638#define AES_FT1(idx) FT1[idx]
639#define AES_FT2(idx) FT2[idx]
640#define AES_FT3(idx) FT3[idx]
641
Hanno Becker177d3cf2017-06-07 15:52:48 +0100642#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200645{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100646 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000647
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200648 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649}
650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200652{
653 if( ctx == NULL )
654 return;
655
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500656 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200657}
658
Jaeden Amero9366feb2018-05-29 18:55:17 +0100659#if defined(MBEDTLS_CIPHER_MODE_XTS)
660void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
661{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100662 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000663
Jaeden Amero9366feb2018-05-29 18:55:17 +0100664 mbedtls_aes_init( &ctx->crypt );
665 mbedtls_aes_init( &ctx->tweak );
666}
667
668void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
669{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100670 if( ctx == NULL )
671 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000672
Jaeden Amero9366feb2018-05-29 18:55:17 +0100673 mbedtls_aes_free( &ctx->crypt );
674 mbedtls_aes_free( &ctx->tweak );
675}
676#endif /* MBEDTLS_CIPHER_MODE_XTS */
677
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400678#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400679static void mbedtls_generate_fake_key( unsigned int keybits, mbedtls_aes_context *ctx )
680{
681 unsigned int qword;
682
683 for( qword = keybits >> 5; qword > 0; qword-- )
684 {
685 ctx->frk[ qword - 1 ] = mbedtls_platform_random_uint32();
686 }
687}
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400688#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Andrzej Kureke78775e2020-07-02 10:57:00 -0400689
Paul Bakker5121ce52009-01-03 21:22:43 +0000690/*
691 * AES key schedule (encryption)
692 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200693#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200695 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000696{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200697 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200698 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200699 volatile unsigned int i = 0;
700 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000701 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200702 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000703
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100704 AES_VALIDATE_RET( ctx != NULL );
705 AES_VALIDATE_RET( key != NULL );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400706 (void) ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200708 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000709 {
710 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300711#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000712 case 192: ctx->nr = 12; break;
713 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300714#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000716 }
717
Simon Butcher5201e412018-12-06 17:40:14 +0000718#if !defined(MBEDTLS_AES_ROM_TABLES)
719 if( aes_init_done == 0 )
720 {
721 aes_gen_tables();
722 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000723 }
724#endif
725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000727 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100728 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000729
730 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200731 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000732 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000733#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000734 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400735#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400736 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400737#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000738
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100740 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200741 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100742#endif
743
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400744 /* Three least significant bits are truncated from keybits, which is
745 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400746 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200747 offset = mbedtls_platform_random_in_range( keybits >> 5 );
748
749 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000750 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200751 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200752 flow_ctrl++;
753 }
754
755 for( j = 0; j < offset; j++ )
756 {
757 GET_UINT32_LE( RK[j], key, j << 2 );
758 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000759 }
760
761 switch( ctx->nr )
762 {
763 case 10:
764
765 for( i = 0; i < 10; i++, RK += 4 )
766 {
767 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000768 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
769 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
770 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
771 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
773 RK[5] = RK[1] ^ RK[4];
774 RK[6] = RK[2] ^ RK[5];
775 RK[7] = RK[3] ^ RK[6];
776 }
777 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300778#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000779 case 12:
780
781 for( i = 0; i < 8; i++, RK += 6 )
782 {
783 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000784 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
785 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
786 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
787 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000788
789 RK[7] = RK[1] ^ RK[6];
790 RK[8] = RK[2] ^ RK[7];
791 RK[9] = RK[3] ^ RK[8];
792 RK[10] = RK[4] ^ RK[9];
793 RK[11] = RK[5] ^ RK[10];
794 }
795 break;
796
797 case 14:
798
799 for( i = 0; i < 7; i++, RK += 8 )
800 {
801 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000802 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
803 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
804 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
805 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000806
807 RK[9] = RK[1] ^ RK[8];
808 RK[10] = RK[2] ^ RK[9];
809 RK[11] = RK[3] ^ RK[10];
810
811 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000812 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
813 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
814 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
815 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000816
817 RK[13] = RK[5] ^ RK[12];
818 RK[14] = RK[6] ^ RK[13];
819 RK[15] = RK[7] ^ RK[14];
820 }
821 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300822#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000823 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000824
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200825 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200826 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200827#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
828 || ( ctx->nr == 12 && i == 8 )
829 || ( ctx->nr == 14 && i == 7 )
830#endif
831 ) )
832 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400833#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -0400834 ctx->hash = mbedtls_hash( ctx->rk, keybits >> 3 );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400835#endif
836 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200837 }
838
Andrzej Kurekca609372020-07-08 03:19:02 -0400839 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200840 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000841}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200842#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000843
844/*
845 * AES key schedule (decryption)
846 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200847#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200849 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000850{
Arto Kinnunen14804442019-10-16 13:43:59 +0300851#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
852 (void) ctx;
853 (void) key;
854 (void) keybits;
855
856 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
857#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200858 volatile unsigned int i = 0, j = 0;
859 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000861 uint32_t *RK;
862 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200863
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100864 AES_VALIDATE_RET( ctx != NULL );
865 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200867 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000870 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100871 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000872
873 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000875 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000876#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000877 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400878#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400879 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400880#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000881
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200882 /* Also checks keybits */
883 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200884 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000885
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200886 ctx->nr = cty.nr;
887
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100889 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100890 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200891 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100892 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200893 i = 0;
894 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200895 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100896 }
897#endif
898
Paul Bakker5121ce52009-01-03 21:22:43 +0000899 SK = cty.rk + cty.nr * 4;
900
901 *RK++ = *SK++;
902 *RK++ = *SK++;
903 *RK++ = *SK++;
904 *RK++ = *SK++;
905
906 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
907 {
908 for( j = 0; j < 4; j++, SK++ )
909 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200910 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
911 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
912 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
913 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000914 }
915 }
916
917 *RK++ = *SK++;
918 *RK++ = *SK++;
919 *RK++ = *SK++;
920 *RK++ = *SK++;
921
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200922exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000924
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200925 if( ret != 0 )
926 {
927 return( ret );
928 }
929 else if( ( i == 0 ) && ( j == 4 ) )
930 {
Andrzej Kurekfba59212020-08-07 21:02:25 -0400931#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -0400932 ctx->hash = mbedtls_hash( ctx->rk, keybits >> 3 );
Andrzej Kurekfba59212020-08-07 21:02:25 -0400933#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200934 return( ret );
935 }
936 else
937 {
938 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
939 }
940
Arto Kinnunen14804442019-10-16 13:43:59 +0300941#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000942}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100943
944#if defined(MBEDTLS_CIPHER_MODE_XTS)
945static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
946 unsigned int keybits,
947 const unsigned char **key1,
948 unsigned int *key1bits,
949 const unsigned char **key2,
950 unsigned int *key2bits )
951{
952 const unsigned int half_keybits = keybits / 2;
953 const unsigned int half_keybytes = half_keybits / 8;
954
955 switch( keybits )
956 {
957 case 256: break;
958 case 512: break;
959 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
960 }
961
962 *key1bits = half_keybits;
963 *key2bits = half_keybits;
964 *key1 = &key[0];
965 *key2 = &key[half_keybytes];
966
967 return 0;
968}
969
970int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
971 const unsigned char *key,
972 unsigned int keybits)
973{
974 int ret;
975 const unsigned char *key1, *key2;
976 unsigned int key1bits, key2bits;
977
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100978 AES_VALIDATE_RET( ctx != NULL );
979 AES_VALIDATE_RET( key != NULL );
980
Jaeden Amero9366feb2018-05-29 18:55:17 +0100981 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
982 &key2, &key2bits );
983 if( ret != 0 )
984 return( ret );
985
986 /* Set the tweak key. Always set tweak key for the encryption mode. */
987 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
988 if( ret != 0 )
989 return( ret );
990
991 /* Set crypt key for encryption. */
992 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
993}
994
995int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
996 const unsigned char *key,
997 unsigned int keybits)
998{
999 int ret;
1000 const unsigned char *key1, *key2;
1001 unsigned int key1bits, key2bits;
1002
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +01001003 AES_VALIDATE_RET( ctx != NULL );
1004 AES_VALIDATE_RET( key != NULL );
1005
Jaeden Amero9366feb2018-05-29 18:55:17 +01001006 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
1007 &key2, &key2bits );
1008 if( ret != 0 )
1009 return( ret );
1010
1011 /* Set the tweak key. Always set tweak key for encryption. */
1012 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1013 if( ret != 0 )
1014 return( ret );
1015
1016 /* Set crypt key for decryption. */
1017 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
1018}
1019#endif /* MBEDTLS_CIPHER_MODE_XTS */
1020
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001021#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001022
Paul Bakker5121ce52009-01-03 21:22:43 +00001023/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001024 * AES-ECB block encryption
1025 */
1026#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001027
Arto Kinnunen311ab592020-01-16 17:20:51 +02001028#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001029static uint32_t *aes_fround( uint32_t *R,
1030 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1031 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1032{
1033 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1034 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1035 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1036 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1037
1038 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1039 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1040 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1041 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1042
1043 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1044 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1045 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1046 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1047
1048 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1049 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1050 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1051 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1052
1053 return R;
1054}
1055
1056static void aes_fround_final( uint32_t *R,
1057 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1058 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1059{
1060 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1061 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1062 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1063 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1064
1065 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1066 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1067 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1068 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1069
1070 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1071 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1072 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1073 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1074
1075 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1076 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1077 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1078 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1079}
1080
Andres AGf5bf7182017-03-03 14:09:56 +00001081int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1082 const unsigned char input[16],
1083 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001084{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001085 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001086 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001087 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001088 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001089 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001090 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001091 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001092 // control bytes for AES calculation rounds,
1093 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1094 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001095
Andrzej Kurekfba59212020-08-07 21:02:25 -04001096#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1097 unsigned key_bytes = 0;
Andrzej Kurek9539f832020-08-10 15:58:13 -04001098 uint32_t check_hash = 0;
Andrzej Kurekfba59212020-08-07 21:02:25 -04001099 switch( ctx->nr )
1100 {
1101 case 10: key_bytes = 16; break;
1102#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1103 case 12: key_bytes = 24; break;
1104 case 14: key_bytes = 32; break;
1105#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1106 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1107 }
Andrzej Kurek9539f832020-08-10 15:58:13 -04001108 check_hash = mbedtls_hash( ctx->rk, key_bytes );
Andrzej Kurekfba59212020-08-07 21:02:25 -04001109#endif
1110
Arto Kinnunen172836a2019-11-28 13:34:13 +02001111 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001112 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001113
Arto Kinnunen311ab592020-01-16 17:20:51 +02001114 aes_data_table[0] = &aes_data_real;
1115 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001116
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001117 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001118 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1119 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001120 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001121
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001122 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001123 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001124
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001125 // SCA countermeasure, randomize secret data location by initializing it in
1126 // a random order and writing randomized fake data between the real data
1127 // writes.
1128 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001129 i = offset;
1130 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001131 {
1132 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001133 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001134 flow_control++;
1135 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001136
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001137 tindex = 0;
1138 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001139 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001140 // Get pointer to the real or fake data
1141 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1142 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001143
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001144 // initial round key addition
1145 for( i = 0; i < 4; i++ )
1146 {
1147 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1148 }
1149 tindex++;
1150 flow_control++;
1151 } while( stop_mark == 0 );
1152
1153 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1154 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001155 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001156 // Get pointer to the real or fake data
1157 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1158 offset = round_ctrl_table[tindex] & 0x04;
1159 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001160
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001161 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1162 &aes_data_ptr->xy_values[0 + offset],
1163 &aes_data_ptr->xy_values[1 + offset],
1164 &aes_data_ptr->xy_values[2 + offset],
1165 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001166 aes_data_ptr->xy_values[4 - offset],
1167 aes_data_ptr->xy_values[5 - offset],
1168 aes_data_ptr->xy_values[6 - offset],
1169 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001170 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001171 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001172 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001173
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001174 // Calculate final AES round + dummy rounds
1175 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001176 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001177 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1178 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001179 aes_fround_final( aes_data_ptr->rk_ptr,
1180 &aes_data_ptr->xy_values[0],
1181 &aes_data_ptr->xy_values[1],
1182 &aes_data_ptr->xy_values[2],
1183 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001184 aes_data_ptr->xy_values[4],
1185 aes_data_ptr->xy_values[5],
1186 aes_data_ptr->xy_values[6],
1187 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001188 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001189 tindex++;
1190 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001191
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001192 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001193 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001194
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001195 // SCA countermeasure, randomize secret data location by writing to it in
1196 // a random order.
1197 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001198 i = offset;
1199 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001200 {
1201 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1202 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001203 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001204
Andrzej Kurekfba59212020-08-07 21:02:25 -04001205 /* Double negation is used to silence an "extraneous parentheses" warning */
1206 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1207#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -04001208 && check_hash == ctx->hash
Andrzej Kurekfba59212020-08-07 21:02:25 -04001209#endif
1210 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001211 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001212#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1213 mbedtls_platform_random_delay();
Andrzej Kurek9539f832020-08-10 15:58:13 -04001214 if( mbedtls_hash( ctx->rk, key_bytes ) == ctx->hash )
Andrzej Kurekfba59212020-08-07 21:02:25 -04001215#endif
1216 {
1217 return 0;
1218 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001219 }
1220
Andrzej Kurekca609372020-07-08 03:19:02 -04001221 // Clear the output in case of a FI
1222 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001223 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001224}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001225
1226#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1227
1228#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1229 do \
1230 { \
1231 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1232 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1233 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1234 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1235 \
1236 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1237 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1238 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1239 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1240 \
1241 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1242 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1243 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1244 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1245 \
1246 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1247 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1248 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1249 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1250 } while( 0 )
1251
1252int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1253 const unsigned char input[16],
1254 unsigned char output[16] )
1255{
1256 int i;
1257 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1258
1259 RK = ctx->rk;
1260
1261 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1262 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1263 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1264 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1265
1266 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1267 {
1268 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1269 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1270 }
1271
1272 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1273
1274 X0 = *RK++ ^ \
1275 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1276 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1277 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1278 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1279
1280 X1 = *RK++ ^ \
1281 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1282 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1283 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1284 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1285
1286 X2 = *RK++ ^ \
1287 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1288 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1289 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1290 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1291
1292 X3 = *RK++ ^ \
1293 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1294 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1295 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1296 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1297
1298 PUT_UINT32_LE( X0, output, 0 );
1299 PUT_UINT32_LE( X1, output, 4 );
1300 PUT_UINT32_LE( X2, output, 8 );
1301 PUT_UINT32_LE( X3, output, 12 );
1302
Andrzej Kureka8405442019-11-12 03:34:03 -05001303 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1304 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1305 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1306 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1307
1308 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1309 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1310 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1311 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1312
1313 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1314
Arto Kinnunen311ab592020-01-16 17:20:51 +02001315 return( 0 );
1316}
1317#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001318#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1319
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001320#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001321void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1322 const unsigned char input[16],
1323 unsigned char output[16] )
1324{
1325 mbedtls_internal_aes_encrypt( ctx, input, output );
1326}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001327#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001328
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001329/*
1330 * AES-ECB block decryption
1331 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001332
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001333#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001334#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001335
Arto Kinnunen311ab592020-01-16 17:20:51 +02001336#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001337static uint32_t *aes_rround( uint32_t *R,
1338 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1339 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1340{
1341 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1342 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1343 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1344 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1345
1346 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1347 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1348 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1349 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1350
1351 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1352 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1353 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1354 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1355
1356 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1357 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1358 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1359 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1360 return R;
1361}
1362
1363static void aes_rround_final( uint32_t *R,
1364 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1365 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1366{
1367 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1368 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1369 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1370 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1371
1372 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1373 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1374 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1375 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1376
1377 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1378 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1379 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1380 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1381
1382 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1383 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1384 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1385 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1386}
1387
Andres AGf5bf7182017-03-03 14:09:56 +00001388int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1389 const unsigned char input[16],
1390 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001391{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001392 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001393 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001394 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001395 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001396 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001397 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001398 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001399 // control bytes for AES calculation rounds,
1400 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1401 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001402
Andrzej Kurekfba59212020-08-07 21:02:25 -04001403#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1404 unsigned key_bytes = 0;
Andrzej Kurek9539f832020-08-10 15:58:13 -04001405 uint32_t check_hash = 0;
Andrzej Kurekfba59212020-08-07 21:02:25 -04001406 switch( ctx->nr )
1407 {
1408 case 10: key_bytes = 16; break;
1409#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
1410 case 12: key_bytes = 24; break;
1411 case 14: key_bytes = 32; break;
1412#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
1413 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
1414 }
Andrzej Kurek9539f832020-08-10 15:58:13 -04001415 check_hash = mbedtls_hash( ctx->rk, key_bytes );
Andrzej Kurekfba59212020-08-07 21:02:25 -04001416#endif
1417
Arto Kinnunen172836a2019-11-28 13:34:13 +02001418 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001419 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001420
Arto Kinnunen311ab592020-01-16 17:20:51 +02001421 aes_data_table[0] = &aes_data_real;
1422 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001423
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001424 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001425 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001426 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001427 flow_control = dummy_rounds;
1428
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001429 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001430 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001431
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001432 // SCA countermeasure, randomize secret data location by initializing it in
1433 // a random order and writing randomized fake data between the real data
1434 // writes.
1435 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001436 i = offset;
1437 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001438 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001439 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001440 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001441 flow_control++;
1442 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001443
1444 tindex = 0;
1445 do
1446 {
1447 // Get pointer to the real or fake data
1448 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1449 stop_mark = round_ctrl_table[tindex] & 0x03;
1450
1451 // initial round key addition
1452 for( i = 0; i < 4; i++ )
1453 {
1454 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1455 }
1456 tindex++;
1457 flow_control++;
1458 } while( stop_mark == 0 );
1459
1460 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1461 do
1462 {
1463 // Get pointer to the real or fake data
1464 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1465 offset = round_ctrl_table[tindex] & 0x04;
1466 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001467
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001468 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1469 &aes_data_ptr->xy_values[0 + offset],
1470 &aes_data_ptr->xy_values[1 + offset],
1471 &aes_data_ptr->xy_values[2 + offset],
1472 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001473 aes_data_ptr->xy_values[4 - offset],
1474 aes_data_ptr->xy_values[5 - offset],
1475 aes_data_ptr->xy_values[6 - offset],
1476 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001477 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001478 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001479 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001480
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001481 // Calculate final AES round + dummy rounds
1482 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001483 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001484 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1485 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001486 aes_rround_final( aes_data_ptr->rk_ptr,
1487 &aes_data_ptr->xy_values[0],
1488 &aes_data_ptr->xy_values[1],
1489 &aes_data_ptr->xy_values[2],
1490 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001491 aes_data_ptr->xy_values[4],
1492 aes_data_ptr->xy_values[5],
1493 aes_data_ptr->xy_values[6],
1494 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001495 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001496 tindex++;
1497 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001498
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001499 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001500 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001501
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001502 // SCA countermeasure, randomize secret data location by writing to it in
1503 // a random order.
1504 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001505 i = offset;
1506 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001507 {
1508 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001509 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001510 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001511
Andrzej Kurekfba59212020-08-07 21:02:25 -04001512 /* Double negation is used to silence an "extraneous parentheses" warning */
1513 if( ! ( flow_control != tindex + dummy_rounds + 8 )
1514#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
Andrzej Kurek9539f832020-08-10 15:58:13 -04001515 && check_hash == ctx->hash
Andrzej Kurekfba59212020-08-07 21:02:25 -04001516#endif
1517 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001518 {
Andrzej Kurekfba59212020-08-07 21:02:25 -04001519#if defined(MBEDTLS_VALIDATE_AES_KEYS_INTEGRITY)
1520 mbedtls_platform_random_delay();
Andrzej Kurek9539f832020-08-10 15:58:13 -04001521 if( mbedtls_hash( ctx->rk, key_bytes ) == ctx->hash )
Andrzej Kurekfba59212020-08-07 21:02:25 -04001522#endif
1523 {
1524 return 0;
1525 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001526 }
1527
Andrzej Kurekca609372020-07-08 03:19:02 -04001528 // Clear the output in case of a FI
1529 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001530 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001531}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001532
1533#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1534
1535#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1536 do \
1537 { \
1538 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1539 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1540 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1541 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1542 \
1543 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1544 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1545 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1546 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1547 \
1548 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1549 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1550 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1551 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1552 \
1553 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1554 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1555 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1556 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1557 } while( 0 )
1558
1559int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1560 const unsigned char input[16],
1561 unsigned char output[16] )
1562{
1563 int i;
1564 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1565
1566 RK = ctx->rk;
1567
1568 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1569 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1570 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1571 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1572
1573 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1574 {
1575 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1576 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1577 }
1578
1579 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1580
1581 X0 = *RK++ ^ \
1582 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1583 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1584 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1585 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1586
1587 X1 = *RK++ ^ \
1588 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1589 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1590 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1591 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1592
1593 X2 = *RK++ ^ \
1594 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1595 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1596 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1597 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1598
1599 X3 = *RK++ ^ \
1600 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1601 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1602 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1603 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1604
1605 PUT_UINT32_LE( X0, output, 0 );
1606 PUT_UINT32_LE( X1, output, 4 );
1607 PUT_UINT32_LE( X2, output, 8 );
1608 PUT_UINT32_LE( X3, output, 12 );
1609
Andrzej Kureka8405442019-11-12 03:34:03 -05001610 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1611 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1612 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1613 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1614
1615 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1616 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1617 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1618 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1619
1620 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1621
Arto Kinnunen311ab592020-01-16 17:20:51 +02001622 return( 0 );
1623}
1624#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1625
Arto Kinnunen14804442019-10-16 13:43:59 +03001626#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001627#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1628
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001629#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001630void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1631 const unsigned char input[16],
1632 unsigned char output[16] )
1633{
Arto Kinnunen14804442019-10-16 13:43:59 +03001634#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1635 (void) ctx;
1636 (void) input;
1637 (void) output;
1638#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001639 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001640#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001641}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001642#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001643
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001644/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001645 * AES-ECB block encryption/decryption
1646 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001647int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001648 int mode,
1649 const unsigned char input[16],
1650 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001651{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001652 AES_VALIDATE_RET( ctx != NULL );
1653 AES_VALIDATE_RET( input != NULL );
1654 AES_VALIDATE_RET( output != NULL );
1655 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1656 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001657 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001658
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001659#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001660 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001661 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001662#endif
1663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001664#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001665 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001666 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001667 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001668 return( 0 );
1669
1670 // If padlock data misaligned, we just fall back to
1671 // unaccelerated mode
1672 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001673 }
1674#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001675
Arto Kinnunen14804442019-10-16 13:43:59 +03001676#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1677 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1678#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001679
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001680 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001681 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001682 else
Andres AGf5bf7182017-03-03 14:09:56 +00001683 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001684#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001685}
1686
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001687#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001688/*
1689 * AES-CBC buffer encryption/decryption
1690 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001692 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001693 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001694 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001695 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001696 unsigned char *output )
1697{
1698 int i;
1699 unsigned char temp[16];
1700
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001701 AES_VALIDATE_RET( ctx != NULL );
1702 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1703 mode == MBEDTLS_AES_DECRYPT );
1704 AES_VALIDATE_RET( iv != NULL );
1705 AES_VALIDATE_RET( input != NULL );
1706 AES_VALIDATE_RET( output != NULL );
1707
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001708 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001709 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001710
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001711#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001712 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001713 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001715 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001716
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001717 // If padlock data misaligned, we just fall back to
1718 // unaccelerated mode
1719 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001720 }
1721#endif
1722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001723 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001724 {
1725 while( length > 0 )
1726 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001727 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001728 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001729
1730 for( i = 0; i < 16; i++ )
1731 output[i] = (unsigned char)( output[i] ^ iv[i] );
1732
Teppo Järvelin91d79382019-10-02 09:09:31 +03001733 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001734
1735 input += 16;
1736 output += 16;
1737 length -= 16;
1738 }
1739 }
1740 else
1741 {
1742 while( length > 0 )
1743 {
1744 for( i = 0; i < 16; i++ )
1745 output[i] = (unsigned char)( input[i] ^ iv[i] );
1746
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001747 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001748 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001749
1750 input += 16;
1751 output += 16;
1752 length -= 16;
1753 }
1754 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001755
1756 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001757}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001758#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001759
Aorimn5f778012016-06-09 23:22:58 +02001760#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001761
1762/* Endianess with 64 bits values */
1763#ifndef GET_UINT64_LE
1764#define GET_UINT64_LE(n,b,i) \
1765{ \
1766 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1767 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1768 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1769 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1770 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1771 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1772 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1773 | ( (uint64_t) (b)[(i) ] ); \
1774}
1775#endif
1776
1777#ifndef PUT_UINT64_LE
1778#define PUT_UINT64_LE(n,b,i) \
1779{ \
1780 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1781 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1782 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1783 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1784 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1785 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1786 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1787 (b)[(i) ] = (unsigned char) ( (n) ); \
1788}
1789#endif
1790
1791typedef unsigned char mbedtls_be128[16];
1792
1793/*
1794 * GF(2^128) multiplication function
1795 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001796 * This function multiplies a field element by x in the polynomial field
1797 * representation. It uses 64-bit word operations to gain speed but compensates
1798 * for machine endianess and hence works correctly on both big and little
1799 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001800 */
1801static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001802 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001803{
1804 uint64_t a, b, ra, rb;
1805
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001806 GET_UINT64_LE( a, x, 0 );
1807 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001808
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001809 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1810 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001811
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001812 PUT_UINT64_LE( ra, r, 0 );
1813 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001814}
1815
Aorimn5f778012016-06-09 23:22:58 +02001816/*
1817 * AES-XTS buffer encryption/decryption
1818 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001819int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1820 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001821 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001822 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001823 const unsigned char *input,
1824 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001825{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001826 int ret;
1827 size_t blocks = length / 16;
1828 size_t leftover = length % 16;
1829 unsigned char tweak[16];
1830 unsigned char prev_tweak[16];
1831 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001832
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001833 AES_VALIDATE_RET( ctx != NULL );
1834 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1835 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001836 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001837 AES_VALIDATE_RET( input != NULL );
1838 AES_VALIDATE_RET( output != NULL );
1839
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001840 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001841 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001842 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001843
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001844 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001845 if( length > ( 1 << 20 ) * 16 )
1846 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001847
Jaeden Amerod82cd862018-04-28 15:02:45 +01001848 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001849 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1850 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001851 if( ret != 0 )
1852 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001853
Jaeden Amerod82cd862018-04-28 15:02:45 +01001854 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001855 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001856 size_t i;
1857
1858 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1859 {
1860 /* We are on the last block in a decrypt operation that has
1861 * leftover bytes, so we need to use the next tweak for this block,
1862 * and this tweak for the lefover bytes. Save the current tweak for
1863 * the leftovers and then update the current tweak for use on this,
1864 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001865 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001866 mbedtls_gf128mul_x_ble( tweak, tweak );
1867 }
1868
1869 for( i = 0; i < 16; i++ )
1870 tmp[i] = input[i] ^ tweak[i];
1871
1872 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1873 if( ret != 0 )
1874 return( ret );
1875
1876 for( i = 0; i < 16; i++ )
1877 output[i] = tmp[i] ^ tweak[i];
1878
1879 /* Update the tweak for the next block. */
1880 mbedtls_gf128mul_x_ble( tweak, tweak );
1881
1882 output += 16;
1883 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001884 }
1885
Jaeden Amerod82cd862018-04-28 15:02:45 +01001886 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001887 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001888 /* If we are on the leftover bytes in a decrypt operation, we need to
1889 * use the previous tweak for these bytes (as saved in prev_tweak). */
1890 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001891
Jaeden Amerod82cd862018-04-28 15:02:45 +01001892 /* We are now on the final part of the data unit, which doesn't divide
1893 * evenly by 16. It's time for ciphertext stealing. */
1894 size_t i;
1895 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001896
Jaeden Amerod82cd862018-04-28 15:02:45 +01001897 /* Copy ciphertext bytes from the previous block to our output for each
1898 * byte of cyphertext we won't steal. At the same time, copy the
1899 * remainder of the input for this final round (since the loop bounds
1900 * are the same). */
1901 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001902 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001903 output[i] = prev_output[i];
1904 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001905 }
Aorimn5f778012016-06-09 23:22:58 +02001906
Jaeden Amerod82cd862018-04-28 15:02:45 +01001907 /* Copy ciphertext bytes from the previous block for input in this
1908 * round. */
1909 for( ; i < 16; i++ )
1910 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001911
Jaeden Amerod82cd862018-04-28 15:02:45 +01001912 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1913 if( ret != 0 )
1914 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001915
Jaeden Amerod82cd862018-04-28 15:02:45 +01001916 /* Write the result back to the previous block, overriding the previous
1917 * output we copied. */
1918 for( i = 0; i < 16; i++ )
1919 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001920 }
1921
1922 return( 0 );
1923}
1924#endif /* MBEDTLS_CIPHER_MODE_XTS */
1925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001926#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001927/*
1928 * AES-CFB128 buffer encryption/decryption
1929 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001930int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001931 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001932 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001933 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001934 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001935 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001936 unsigned char *output )
1937{
Paul Bakker27fdf462011-06-09 13:55:13 +00001938 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001939 size_t n;
1940
1941 AES_VALIDATE_RET( ctx != NULL );
1942 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1943 mode == MBEDTLS_AES_DECRYPT );
1944 AES_VALIDATE_RET( iv_off != NULL );
1945 AES_VALIDATE_RET( iv != NULL );
1946 AES_VALIDATE_RET( input != NULL );
1947 AES_VALIDATE_RET( output != NULL );
1948
1949 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001950
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001951 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001952 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001954 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001955 {
1956 while( length-- )
1957 {
1958 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001959 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001960
1961 c = *input++;
1962 *output++ = (unsigned char)( c ^ iv[n] );
1963 iv[n] = (unsigned char) c;
1964
Paul Bakker66d5d072014-06-17 16:39:18 +02001965 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001966 }
1967 }
1968 else
1969 {
1970 while( length-- )
1971 {
1972 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001973 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001974
1975 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1976
Paul Bakker66d5d072014-06-17 16:39:18 +02001977 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001978 }
1979 }
1980
1981 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001982
1983 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001984}
Paul Bakker556efba2014-01-24 15:38:12 +01001985
1986/*
1987 * AES-CFB8 buffer encryption/decryption
1988 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001989int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001990 int mode,
1991 size_t length,
1992 unsigned char iv[16],
1993 const unsigned char *input,
1994 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001995{
1996 unsigned char c;
1997 unsigned char ov[17];
1998
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001999 AES_VALIDATE_RET( ctx != NULL );
2000 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
2001 mode == MBEDTLS_AES_DECRYPT );
2002 AES_VALIDATE_RET( iv != NULL );
2003 AES_VALIDATE_RET( input != NULL );
2004 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01002005 while( length-- )
2006 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03002007 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002008 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01002009
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002010 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002011 ov[16] = *input;
2012
2013 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
2014
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002015 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01002016 ov[16] = c;
2017
Teppo Järvelin91d79382019-10-02 09:09:31 +03002018 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01002019 }
2020
2021 return( 0 );
2022}
Simon Butcher76a5b222018-04-22 22:57:27 +01002023#endif /* MBEDTLS_CIPHER_MODE_CFB */
2024
2025#if defined(MBEDTLS_CIPHER_MODE_OFB)
2026/*
2027 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
2028 */
2029int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01002030 size_t length,
2031 size_t *iv_off,
2032 unsigned char iv[16],
2033 const unsigned char *input,
2034 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01002035{
Simon Butcherad4e4932018-04-29 00:43:47 +01002036 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01002037 size_t n;
2038
2039 AES_VALIDATE_RET( ctx != NULL );
2040 AES_VALIDATE_RET( iv_off != NULL );
2041 AES_VALIDATE_RET( iv != NULL );
2042 AES_VALIDATE_RET( input != NULL );
2043 AES_VALIDATE_RET( output != NULL );
2044
2045 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01002046
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01002047 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01002048 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2049
Simon Butcher76a5b222018-04-22 22:57:27 +01002050 while( length-- )
2051 {
2052 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002053 {
2054 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
2055 if( ret != 0 )
2056 goto exit;
2057 }
Simon Butcher76a5b222018-04-22 22:57:27 +01002058 *output++ = *input++ ^ iv[n];
2059
2060 n = ( n + 1 ) & 0x0F;
2061 }
2062
2063 *iv_off = n;
2064
Simon Butcherad4e4932018-04-29 00:43:47 +01002065exit:
2066 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002067}
2068#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002069
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002070#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002071/*
2072 * AES-CTR buffer encryption/decryption
2073 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002074int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002075 size_t length,
2076 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002077 unsigned char nonce_counter[16],
2078 unsigned char stream_block[16],
2079 const unsigned char *input,
2080 unsigned char *output )
2081{
Paul Bakker369e14b2012-04-18 14:16:09 +00002082 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002083 size_t n;
2084
2085 AES_VALIDATE_RET( ctx != NULL );
2086 AES_VALIDATE_RET( nc_off != NULL );
2087 AES_VALIDATE_RET( nonce_counter != NULL );
2088 AES_VALIDATE_RET( stream_block != NULL );
2089 AES_VALIDATE_RET( input != NULL );
2090 AES_VALIDATE_RET( output != NULL );
2091
2092 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002093
Arto Kinnunen75439012019-12-03 14:12:10 +02002094 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002095 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2096
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002097 while( length-- )
2098 {
2099 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002100 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002101
Paul Bakker369e14b2012-04-18 14:16:09 +00002102 for( i = 16; i > 0; i-- )
2103 if( ++nonce_counter[i - 1] != 0 )
2104 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002105 }
2106 c = *input++;
2107 *output++ = (unsigned char)( c ^ stream_block[n] );
2108
Paul Bakker66d5d072014-06-17 16:39:18 +02002109 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002110 }
2111
2112 *nc_off = n;
2113
2114 return( 0 );
2115}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002116#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002118#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002120#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002121/*
2122 * AES test vectors from:
2123 *
2124 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2125 */
2126static const unsigned char aes_test_ecb_dec[3][16] =
2127{
2128 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2129 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2130 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2131 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2132 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2133 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2134};
2135
2136static const unsigned char aes_test_ecb_enc[3][16] =
2137{
2138 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2139 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2140 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2141 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2142 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2143 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2144};
2145
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002146#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002147static const unsigned char aes_test_cbc_dec[3][16] =
2148{
2149 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2150 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2151 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2152 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2153 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2154 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2155};
2156
2157static const unsigned char aes_test_cbc_enc[3][16] =
2158{
2159 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2160 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2161 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2162 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2163 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2164 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2165};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002166#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002167
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002168#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002169/*
2170 * AES-CFB128 test vectors from:
2171 *
2172 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2173 */
2174static const unsigned char aes_test_cfb128_key[3][32] =
2175{
2176 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2177 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2178 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2179 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2180 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2181 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2182 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2183 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2184 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2185};
2186
2187static const unsigned char aes_test_cfb128_iv[16] =
2188{
2189 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2190 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2191};
2192
2193static const unsigned char aes_test_cfb128_pt[64] =
2194{
2195 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2196 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2197 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2198 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2199 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2200 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2201 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2202 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2203};
2204
2205static const unsigned char aes_test_cfb128_ct[3][64] =
2206{
2207 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2208 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2209 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2210 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2211 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2212 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2213 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2214 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2215 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2216 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2217 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2218 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2219 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2220 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2221 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2222 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2223 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2224 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2225 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2226 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2227 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2228 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2229 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2230 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2231};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002233
Simon Butcherad4e4932018-04-29 00:43:47 +01002234#if defined(MBEDTLS_CIPHER_MODE_OFB)
2235/*
2236 * AES-OFB test vectors from:
2237 *
Simon Butcher5db13622018-06-04 22:11:25 +01002238 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002239 */
2240static const unsigned char aes_test_ofb_key[3][32] =
2241{
2242 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2243 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2244 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2245 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2246 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2247 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2248 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2249 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2250 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2251};
2252
2253static const unsigned char aes_test_ofb_iv[16] =
2254{
2255 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2256 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2257};
2258
2259static const unsigned char aes_test_ofb_pt[64] =
2260{
2261 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2262 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2263 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2264 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2265 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2266 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2267 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2268 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2269};
2270
2271static const unsigned char aes_test_ofb_ct[3][64] =
2272{
2273 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2274 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2275 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2276 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2277 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2278 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2279 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2280 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2281 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2282 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2283 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2284 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2285 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2286 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2287 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2288 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2289 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2290 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2291 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2292 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2293 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2294 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2295 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2296 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2297};
2298#endif /* MBEDTLS_CIPHER_MODE_OFB */
2299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002300#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002301/*
2302 * AES-CTR test vectors from:
2303 *
2304 * http://www.faqs.org/rfcs/rfc3686.html
2305 */
2306
2307static const unsigned char aes_test_ctr_key[3][16] =
2308{
2309 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2310 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2311 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2312 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2313 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2314 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2315};
2316
2317static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2318{
2319 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2321 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2322 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2323 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2324 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2325};
2326
2327static const unsigned char aes_test_ctr_pt[3][48] =
2328{
2329 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2330 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2331
2332 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2333 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2334 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2335 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2336
2337 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2338 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2339 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2340 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2341 0x20, 0x21, 0x22, 0x23 }
2342};
2343
2344static const unsigned char aes_test_ctr_ct[3][48] =
2345{
2346 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2347 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2348 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2349 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2350 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2351 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2352 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2353 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2354 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2355 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2356 0x25, 0xB2, 0x07, 0x2F }
2357};
2358
2359static const int aes_test_ctr_len[3] =
2360 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002361#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002362
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002363#if defined(MBEDTLS_CIPHER_MODE_XTS)
2364/*
2365 * AES-XTS test vectors from:
2366 *
2367 * IEEE P1619/D16 Annex B
2368 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2369 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2370 */
2371static const unsigned char aes_test_xts_key[][32] =
2372{
2373 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2377 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2378 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2379 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2380 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2381 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2382 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2383 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2384 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2385};
2386
2387static const unsigned char aes_test_xts_pt32[][32] =
2388{
2389 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2393 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2394 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2395 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2396 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2397 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2398 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2399 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2400 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2401};
2402
2403static const unsigned char aes_test_xts_ct32[][32] =
2404{
2405 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2406 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2407 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2408 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2409 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2410 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2411 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2412 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2413 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2414 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2415 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2416 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2417};
2418
2419static const unsigned char aes_test_xts_data_unit[][16] =
2420{
2421 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2423 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2425 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2427};
2428
2429#endif /* MBEDTLS_CIPHER_MODE_XTS */
2430
Paul Bakker5121ce52009-01-03 21:22:43 +00002431/*
2432 * Checkup routine
2433 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002434int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002435{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002436 int ret = 0, i, j, u, mode;
2437 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002438 unsigned char key[32];
2439 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002440 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002441#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002443#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002444#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002445 unsigned char prv[16];
2446#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002447#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2448 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002449 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002450#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002451#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002452 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002453#endif
2454#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002455 unsigned char nonce_counter[16];
2456 unsigned char stream_block[16];
2457#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002458 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002459
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002460 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002461 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002462
2463 /*
2464 * ECB mode
2465 */
2466 for( i = 0; i < 6; i++ )
2467 {
2468 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002469 keybits = 128 + u * 64;
2470 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002471
2472 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002473 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2474 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002475
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002476#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2477 if( keybits > 128 )
2478 {
2479 mbedtls_printf( "skipped\n" );
2480 continue;
2481 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002482#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2483
2484#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2485 if( mode == MBEDTLS_AES_DECRYPT )
2486 {
2487 mbedtls_printf( "skipped\n" );
2488 continue;
2489 }
2490#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002491
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002492 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002493
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002494 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002495 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002496 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2497 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002498 }
2499 else
2500 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002501 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2502 aes_tests = aes_test_ecb_enc[u];
2503 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002504
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002505 /*
2506 * AES-192 is an optional feature that may be unavailable when
2507 * there is an alternative underlying implementation i.e. when
2508 * MBEDTLS_AES_ALT is defined.
2509 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002510 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002511 {
2512 mbedtls_printf( "skipped\n" );
2513 continue;
2514 }
2515 else if( ret != 0 )
2516 {
2517 goto exit;
2518 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002519
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002520 for( j = 0; j < 10000; j++ )
2521 {
2522 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2523 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002524 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002525 }
2526
2527 if( memcmp( buf, aes_tests, 16 ) != 0 )
2528 {
2529 ret = 1;
2530 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002531 }
2532
2533 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002534 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002535 }
2536
2537 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002538 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002540#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002541 /*
2542 * CBC mode
2543 */
2544 for( i = 0; i < 6; i++ )
2545 {
2546 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002547 keybits = 128 + u * 64;
2548 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002549
2550 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002551 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2552 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002553
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002554#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2555 if( keybits > 128 )
2556 {
2557 mbedtls_printf( "skipped\n" );
2558 continue;
2559 }
2560#endif
2561
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002562#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2563 if( mode == MBEDTLS_AES_DECRYPT )
2564 {
2565 mbedtls_printf( "skipped\n" );
2566 continue;
2567 }
2568#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2569
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002570 memset( iv , 0, 16 );
2571 memset( prv, 0, 16 );
2572 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002573
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002574 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002575 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002576 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2577 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002578 }
2579 else
2580 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002581 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2582 aes_tests = aes_test_cbc_enc[u];
2583 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002584
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002585 /*
2586 * AES-192 is an optional feature that may be unavailable when
2587 * there is an alternative underlying implementation i.e. when
2588 * MBEDTLS_AES_ALT is defined.
2589 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002590 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002591 {
2592 mbedtls_printf( "skipped\n" );
2593 continue;
2594 }
2595 else if( ret != 0 )
2596 {
2597 goto exit;
2598 }
2599
2600 for( j = 0; j < 10000; j++ )
2601 {
2602 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002603 {
2604 unsigned char tmp[16];
2605
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002606 memcpy( tmp, prv, 16 );
2607 memcpy( prv, buf, 16 );
2608 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002609 }
2610
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002611 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2612 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002613 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002614
2615 }
2616
2617 if( memcmp( buf, aes_tests, 16 ) != 0 )
2618 {
2619 ret = 1;
2620 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002621 }
2622
2623 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002624 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002625 }
2626
2627 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002628 mbedtls_printf( "\n" );
2629#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002630
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002631#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002632 /*
2633 * CFB128 mode
2634 */
2635 for( i = 0; i < 6; i++ )
2636 {
2637 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002638 keybits = 128 + u * 64;
2639 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002640
2641 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002642 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2643 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002644
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002645#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2646 if( keybits > 128 )
2647 {
2648 mbedtls_printf( "skipped\n" );
2649 continue;
2650 }
2651#endif
2652
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002653#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2654 if( mode == MBEDTLS_AES_DECRYPT )
2655 {
2656 mbedtls_printf( "skipped\n" );
2657 continue;
2658 }
2659#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2660
Paul Bakker5121ce52009-01-03 21:22:43 +00002661 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002662 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002663
2664 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002665 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002666 /*
2667 * AES-192 is an optional feature that may be unavailable when
2668 * there is an alternative underlying implementation i.e. when
2669 * MBEDTLS_AES_ALT is defined.
2670 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002671 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002672 {
2673 mbedtls_printf( "skipped\n" );
2674 continue;
2675 }
2676 else if( ret != 0 )
2677 {
2678 goto exit;
2679 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002680
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002681 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002682 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002683 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002684 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002685 }
2686 else
2687 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002688 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002689 aes_tests = aes_test_cfb128_ct[u];
2690 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002691
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002692 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2693 if( ret != 0 )
2694 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002695
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002696 if( memcmp( buf, aes_tests, 64 ) != 0 )
2697 {
2698 ret = 1;
2699 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002700 }
2701
2702 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002703 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002704 }
2705
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002706 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002707 mbedtls_printf( "\n" );
2708#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002709
Simon Butcherad4e4932018-04-29 00:43:47 +01002710#if defined(MBEDTLS_CIPHER_MODE_OFB)
2711 /*
2712 * OFB mode
2713 */
2714 for( i = 0; i < 6; i++ )
2715 {
2716 u = i >> 1;
2717 keybits = 128 + u * 64;
2718 mode = i & 1;
2719
2720 if( verbose != 0 )
2721 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2722 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2723
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002724#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2725 if( keybits > 128 )
2726 {
2727 mbedtls_printf( "skipped\n" );
2728 continue;
2729 }
2730#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002731
2732#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2733 if( mode == MBEDTLS_AES_DECRYPT )
2734 {
2735 mbedtls_printf( "skipped\n" );
2736 continue;
2737 }
2738#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2739
Simon Butcherad4e4932018-04-29 00:43:47 +01002740 memcpy( iv, aes_test_ofb_iv, 16 );
2741 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2742
2743 offset = 0;
2744 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2745 /*
2746 * AES-192 is an optional feature that may be unavailable when
2747 * there is an alternative underlying implementation i.e. when
2748 * MBEDTLS_AES_ALT is defined.
2749 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002750 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002751 {
2752 mbedtls_printf( "skipped\n" );
2753 continue;
2754 }
2755 else if( ret != 0 )
2756 {
2757 goto exit;
2758 }
2759
2760 if( mode == MBEDTLS_AES_DECRYPT )
2761 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002762 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002763 aes_tests = aes_test_ofb_pt;
2764 }
2765 else
2766 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002767 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002768 aes_tests = aes_test_ofb_ct[u];
2769 }
2770
2771 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2772 if( ret != 0 )
2773 goto exit;
2774
2775 if( memcmp( buf, aes_tests, 64 ) != 0 )
2776 {
2777 ret = 1;
2778 goto exit;
2779 }
2780
2781 if( verbose != 0 )
2782 mbedtls_printf( "passed\n" );
2783 }
2784
2785 if( verbose != 0 )
2786 mbedtls_printf( "\n" );
2787#endif /* MBEDTLS_CIPHER_MODE_OFB */
2788
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002789#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002790 /*
2791 * CTR mode
2792 */
2793 for( i = 0; i < 6; i++ )
2794 {
2795 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002796 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002797
2798 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002799 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002800 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002801
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002802#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2803 if( keybits > 128 )
2804 {
2805 mbedtls_printf( "skipped\n" );
2806 continue;
2807 }
2808#endif
2809
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002810#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2811 if( mode == MBEDTLS_AES_DECRYPT )
2812 {
2813 mbedtls_printf( "skipped\n" );
2814 continue;
2815 }
2816#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2817
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002818 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2819 memcpy( key, aes_test_ctr_key[u], 16 );
2820
2821 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002822 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2823 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002824
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002825 len = aes_test_ctr_len[u];
2826
2827 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002828 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002829 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002830 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002831 }
2832 else
2833 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002834 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002835 aes_tests = aes_test_ctr_ct[u];
2836 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002837
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002838 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2839 stream_block, buf, buf );
2840 if( ret != 0 )
2841 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002842
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002843 if( memcmp( buf, aes_tests, len ) != 0 )
2844 {
2845 ret = 1;
2846 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002847 }
2848
2849 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002850 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002851 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002852
2853 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002854 mbedtls_printf( "\n" );
2855#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002856
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002857#if defined(MBEDTLS_CIPHER_MODE_XTS)
2858 {
2859 static const int num_tests =
2860 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2861 mbedtls_aes_xts_context ctx_xts;
2862
2863 /*
2864 * XTS mode
2865 */
2866 mbedtls_aes_xts_init( &ctx_xts );
2867
2868 for( i = 0; i < num_tests << 1; i++ )
2869 {
2870 const unsigned char *data_unit;
2871 u = i >> 1;
2872 mode = i & 1;
2873
2874 if( verbose != 0 )
2875 mbedtls_printf( " AES-XTS-128 (%s): ",
2876 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2877
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002878#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2879 if( mode == MBEDTLS_AES_DECRYPT )
2880 {
2881 mbedtls_printf( "skipped\n" );
2882 continue;
2883 }
2884#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2885
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002886 memset( key, 0, sizeof( key ) );
2887 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002888 data_unit = aes_test_xts_data_unit[u];
2889
2890 len = sizeof( *aes_test_xts_ct32 );
2891
2892 if( mode == MBEDTLS_AES_DECRYPT )
2893 {
2894 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2895 if( ret != 0)
2896 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002897 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002898 aes_tests = aes_test_xts_pt32[u];
2899 }
2900 else
2901 {
2902 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2903 if( ret != 0)
2904 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002905 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002906 aes_tests = aes_test_xts_ct32[u];
2907 }
2908
2909
2910 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2911 buf, buf );
2912 if( ret != 0 )
2913 goto exit;
2914
2915 if( memcmp( buf, aes_tests, len ) != 0 )
2916 {
2917 ret = 1;
2918 goto exit;
2919 }
2920
2921 if( verbose != 0 )
2922 mbedtls_printf( "passed\n" );
2923 }
2924
2925 if( verbose != 0 )
2926 mbedtls_printf( "\n" );
2927
2928 mbedtls_aes_xts_free( &ctx_xts );
2929 }
2930#endif /* MBEDTLS_CIPHER_MODE_XTS */
2931
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002932 ret = 0;
2933
2934exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002935 if( ret != 0 && verbose != 0 )
2936 mbedtls_printf( "failed\n" );
2937
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002938 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002939
2940 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002941}
2942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002943#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002945#endif /* MBEDTLS_AES_C */