blob: e7a888f1a6b9d210e25e6927e498d1cfbf223a1d [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)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200550static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t 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 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000706
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200707 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000708 {
709 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300710#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000711 case 192: ctx->nr = 12; break;
712 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300713#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715 }
716
Simon Butcher5201e412018-12-06 17:40:14 +0000717#if !defined(MBEDTLS_AES_ROM_TABLES)
718 if( aes_init_done == 0 )
719 {
720 aes_gen_tables();
721 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000722 }
723#endif
724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000726 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100727 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000728
729 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000731 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000732#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000733 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400734#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400735 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400736#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000737
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200738#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100739 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200740 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100741#endif
742
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400743 /* Three least significant bits are truncated from keybits, which is
744 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400745 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200746 offset = mbedtls_platform_random_in_range( keybits >> 5 );
747
748 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000749 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200750 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200751 flow_ctrl++;
752 }
753
754 for( j = 0; j < offset; j++ )
755 {
756 GET_UINT32_LE( RK[j], key, j << 2 );
757 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000758 }
759
760 switch( ctx->nr )
761 {
762 case 10:
763
764 for( i = 0; i < 10; i++, RK += 4 )
765 {
766 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000767 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
768 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
769 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
770 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000771
772 RK[5] = RK[1] ^ RK[4];
773 RK[6] = RK[2] ^ RK[5];
774 RK[7] = RK[3] ^ RK[6];
775 }
776 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300777#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000778 case 12:
779
780 for( i = 0; i < 8; i++, RK += 6 )
781 {
782 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000783 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
784 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
785 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
786 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000787
788 RK[7] = RK[1] ^ RK[6];
789 RK[8] = RK[2] ^ RK[7];
790 RK[9] = RK[3] ^ RK[8];
791 RK[10] = RK[4] ^ RK[9];
792 RK[11] = RK[5] ^ RK[10];
793 }
794 break;
795
796 case 14:
797
798 for( i = 0; i < 7; i++, RK += 8 )
799 {
800 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000801 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
802 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
803 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
804 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000805
806 RK[9] = RK[1] ^ RK[8];
807 RK[10] = RK[2] ^ RK[9];
808 RK[11] = RK[3] ^ RK[10];
809
810 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000811 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
812 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
813 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
814 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000815
816 RK[13] = RK[5] ^ RK[12];
817 RK[14] = RK[6] ^ RK[13];
818 RK[15] = RK[7] ^ RK[14];
819 }
820 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300821#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000822 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000823
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200824 ret = 0;
825
826 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200827 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200828#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
829 || ( ctx->nr == 12 && i == 8 )
830 || ( ctx->nr == 14 && i == 7 )
831#endif
832 ) )
833 {
Andrzej Kurekafec8852020-07-15 16:31:27 -0400834 return ret;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200835 }
836
Andrzej Kurekca609372020-07-08 03:19:02 -0400837 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200838 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000839}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200840#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
842/*
843 * AES key schedule (decryption)
844 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200845#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200847 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000848{
Arto Kinnunen14804442019-10-16 13:43:59 +0300849#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
850 (void) ctx;
851 (void) key;
852 (void) keybits;
853
854 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
855#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200856 volatile unsigned int i = 0, j = 0;
857 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200858 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000859 uint32_t *RK;
860 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200861
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100862 AES_VALIDATE_RET( ctx != NULL );
863 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200867#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000868 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100869 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000870
871 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200872 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000873 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000874#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000875 ctx->rk = RK = ctx->buf;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400876#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Andrzej Kureke78775e2020-07-02 10:57:00 -0400877 mbedtls_generate_fake_key( keybits, ctx );
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -0400878#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000879
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200880 /* Also checks keybits */
881 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200882 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000883
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200884 ctx->nr = cty.nr;
885
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100887 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100888 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100890 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200891 i = 0;
892 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200893 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100894 }
895#endif
896
Paul Bakker5121ce52009-01-03 21:22:43 +0000897 SK = cty.rk + cty.nr * 4;
898
899 *RK++ = *SK++;
900 *RK++ = *SK++;
901 *RK++ = *SK++;
902 *RK++ = *SK++;
903
904 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
905 {
906 for( j = 0; j < 4; j++, SK++ )
907 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200908 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
909 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
910 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
911 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000912 }
913 }
914
915 *RK++ = *SK++;
916 *RK++ = *SK++;
917 *RK++ = *SK++;
918 *RK++ = *SK++;
919
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200920exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000922
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200923 if( ret != 0 )
924 {
925 return( ret );
926 }
927 else if( ( i == 0 ) && ( j == 4 ) )
928 {
929 return( ret );
930 }
931 else
932 {
933 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
934 }
935
Arto Kinnunen14804442019-10-16 13:43:59 +0300936#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000937}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100938
939#if defined(MBEDTLS_CIPHER_MODE_XTS)
940static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
941 unsigned int keybits,
942 const unsigned char **key1,
943 unsigned int *key1bits,
944 const unsigned char **key2,
945 unsigned int *key2bits )
946{
947 const unsigned int half_keybits = keybits / 2;
948 const unsigned int half_keybytes = half_keybits / 8;
949
950 switch( keybits )
951 {
952 case 256: break;
953 case 512: break;
954 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
955 }
956
957 *key1bits = half_keybits;
958 *key2bits = half_keybits;
959 *key1 = &key[0];
960 *key2 = &key[half_keybytes];
961
962 return 0;
963}
964
965int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
966 const unsigned char *key,
967 unsigned int keybits)
968{
969 int ret;
970 const unsigned char *key1, *key2;
971 unsigned int key1bits, key2bits;
972
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100973 AES_VALIDATE_RET( ctx != NULL );
974 AES_VALIDATE_RET( key != NULL );
975
Jaeden Amero9366feb2018-05-29 18:55:17 +0100976 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
977 &key2, &key2bits );
978 if( ret != 0 )
979 return( ret );
980
981 /* Set the tweak key. Always set tweak key for the encryption mode. */
982 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
983 if( ret != 0 )
984 return( ret );
985
986 /* Set crypt key for encryption. */
987 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
988}
989
990int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
991 const unsigned char *key,
992 unsigned int keybits)
993{
994 int ret;
995 const unsigned char *key1, *key2;
996 unsigned int key1bits, key2bits;
997
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100998 AES_VALIDATE_RET( ctx != NULL );
999 AES_VALIDATE_RET( key != NULL );
1000
Jaeden Amero9366feb2018-05-29 18:55:17 +01001001 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
1002 &key2, &key2bits );
1003 if( ret != 0 )
1004 return( ret );
1005
1006 /* Set the tweak key. Always set tweak key for encryption. */
1007 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1008 if( ret != 0 )
1009 return( ret );
1010
1011 /* Set crypt key for decryption. */
1012 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
1013}
1014#endif /* MBEDTLS_CIPHER_MODE_XTS */
1015
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001016#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001017
Paul Bakker5121ce52009-01-03 21:22:43 +00001018/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001019 * AES-ECB block encryption
1020 */
1021#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001022
Arto Kinnunen311ab592020-01-16 17:20:51 +02001023#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001024static uint32_t *aes_fround( uint32_t *R,
1025 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1026 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1027{
1028 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1029 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1030 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1031 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1032
1033 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1034 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1035 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1036 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1037
1038 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1039 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1040 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1041 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1042
1043 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1044 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1045 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1046 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1047
1048 return R;
1049}
1050
1051static void aes_fround_final( uint32_t *R,
1052 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1053 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1054{
1055 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1056 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1057 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1058 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1059
1060 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1061 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1062 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1063 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1064
1065 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1066 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1067 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1068 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1069
1070 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1071 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1072 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1073 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1074}
1075
Andres AGf5bf7182017-03-03 14:09:56 +00001076int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1077 const unsigned char input[16],
1078 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001079{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001080 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001081 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001082 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001083 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001084 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001085 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001086 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001087 // control bytes for AES calculation rounds,
1088 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1089 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001090
Arto Kinnunen172836a2019-11-28 13:34:13 +02001091 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001092 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001093
Arto Kinnunen311ab592020-01-16 17:20:51 +02001094 aes_data_table[0] = &aes_data_real;
1095 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001096
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001097 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001098 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1099 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001100 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001101
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001102 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001103 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001104
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001105 // SCA countermeasure, randomize secret data location by initializing it in
1106 // a random order and writing randomized fake data between the real data
1107 // writes.
1108 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001109 i = offset;
1110 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001111 {
1112 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001113 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001114 flow_control++;
1115 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001116
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001117 tindex = 0;
1118 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001119 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001120 // Get pointer to the real or fake data
1121 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1122 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001123
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001124 // initial round key addition
1125 for( i = 0; i < 4; i++ )
1126 {
1127 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1128 }
1129 tindex++;
1130 flow_control++;
1131 } while( stop_mark == 0 );
1132
1133 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1134 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001135 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001136 // Get pointer to the real or fake data
1137 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1138 offset = round_ctrl_table[tindex] & 0x04;
1139 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001140
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001141 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1142 &aes_data_ptr->xy_values[0 + offset],
1143 &aes_data_ptr->xy_values[1 + offset],
1144 &aes_data_ptr->xy_values[2 + offset],
1145 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001146 aes_data_ptr->xy_values[4 - offset],
1147 aes_data_ptr->xy_values[5 - offset],
1148 aes_data_ptr->xy_values[6 - offset],
1149 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001150 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001151 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001152 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001153
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001154 // Calculate final AES round + dummy rounds
1155 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001156 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001157 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1158 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001159 aes_fround_final( aes_data_ptr->rk_ptr,
1160 &aes_data_ptr->xy_values[0],
1161 &aes_data_ptr->xy_values[1],
1162 &aes_data_ptr->xy_values[2],
1163 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001164 aes_data_ptr->xy_values[4],
1165 aes_data_ptr->xy_values[5],
1166 aes_data_ptr->xy_values[6],
1167 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001168 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001169 tindex++;
1170 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001171
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001172 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001173 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001174
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001175 // SCA countermeasure, randomize secret data location by writing to it in
1176 // a random order.
1177 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001178 i = offset;
1179 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001180 {
1181 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1182 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001183 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001184
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001185 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001186 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001187 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001188 }
1189
Andrzej Kurekca609372020-07-08 03:19:02 -04001190 // Clear the output in case of a FI
1191 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001192 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001193}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001194
1195#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1196
1197#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1198 do \
1199 { \
1200 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1201 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1202 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1203 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1204 \
1205 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1206 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1207 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1208 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1209 \
1210 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1211 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1212 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1213 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1214 \
1215 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1216 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1217 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1218 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1219 } while( 0 )
1220
1221int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1222 const unsigned char input[16],
1223 unsigned char output[16] )
1224{
1225 int i;
1226 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1227
1228 RK = ctx->rk;
1229
1230 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1231 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1232 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1233 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1234
1235 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1236 {
1237 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1238 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1239 }
1240
1241 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1242
1243 X0 = *RK++ ^ \
1244 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1245 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1246 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1247 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1248
1249 X1 = *RK++ ^ \
1250 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1251 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1252 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1253 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1254
1255 X2 = *RK++ ^ \
1256 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1257 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1258 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1259 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1260
1261 X3 = *RK++ ^ \
1262 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1263 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1264 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1265 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1266
1267 PUT_UINT32_LE( X0, output, 0 );
1268 PUT_UINT32_LE( X1, output, 4 );
1269 PUT_UINT32_LE( X2, output, 8 );
1270 PUT_UINT32_LE( X3, output, 12 );
1271
Andrzej Kureka8405442019-11-12 03:34:03 -05001272 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1273 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1274 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1275 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1276
1277 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1278 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1279 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1280 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1281
1282 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1283
Arto Kinnunen311ab592020-01-16 17:20:51 +02001284 return( 0 );
1285}
1286#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001287#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1288
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001289#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001290void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1291 const unsigned char input[16],
1292 unsigned char output[16] )
1293{
1294 mbedtls_internal_aes_encrypt( ctx, input, output );
1295}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001296#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001297
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001298/*
1299 * AES-ECB block decryption
1300 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001301
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001302#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001303#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001304
Arto Kinnunen311ab592020-01-16 17:20:51 +02001305#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001306static uint32_t *aes_rround( uint32_t *R,
1307 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1308 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1309{
1310 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1311 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1312 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1313 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1314
1315 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1316 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1317 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1318 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1319
1320 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1321 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1322 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1323 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1324
1325 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1326 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1327 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1328 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1329 return R;
1330}
1331
1332static void aes_rround_final( uint32_t *R,
1333 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1334 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1335{
1336 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1337 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1338 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1339 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1340
1341 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1342 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1343 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1344 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1345
1346 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1347 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1348 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1349 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1350
1351 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1352 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1353 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1354 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1355}
1356
Andres AGf5bf7182017-03-03 14:09:56 +00001357int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1358 const unsigned char input[16],
1359 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001360{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001361 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001362 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001363 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001364 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001365 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001366 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001367 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001368 // control bytes for AES calculation rounds,
1369 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1370 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001371
Arto Kinnunen172836a2019-11-28 13:34:13 +02001372 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001373 aes_data_fake.rk_ptr = ctx->frk;
Andrzej Kurekfac2f9b2020-07-19 00:32:34 -04001374
Arto Kinnunen311ab592020-01-16 17:20:51 +02001375 aes_data_table[0] = &aes_data_real;
1376 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001377
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001378 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001379 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001380 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001381 flow_control = dummy_rounds;
1382
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001383 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001384 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001385
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001386 // SCA countermeasure, randomize secret data location by initializing it in
1387 // a random order and writing randomized fake data between the real data
1388 // writes.
1389 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001390 i = offset;
1391 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001392 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001393 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001394 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001395 flow_control++;
1396 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001397
1398 tindex = 0;
1399 do
1400 {
1401 // Get pointer to the real or fake data
1402 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1403 stop_mark = round_ctrl_table[tindex] & 0x03;
1404
1405 // initial round key addition
1406 for( i = 0; i < 4; i++ )
1407 {
1408 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1409 }
1410 tindex++;
1411 flow_control++;
1412 } while( stop_mark == 0 );
1413
1414 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1415 do
1416 {
1417 // Get pointer to the real or fake data
1418 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1419 offset = round_ctrl_table[tindex] & 0x04;
1420 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001421
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001422 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1423 &aes_data_ptr->xy_values[0 + offset],
1424 &aes_data_ptr->xy_values[1 + offset],
1425 &aes_data_ptr->xy_values[2 + offset],
1426 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001427 aes_data_ptr->xy_values[4 - offset],
1428 aes_data_ptr->xy_values[5 - offset],
1429 aes_data_ptr->xy_values[6 - offset],
1430 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001431 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001432 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001433 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001434
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001435 // Calculate final AES round + dummy rounds
1436 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001437 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001438 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1439 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001440 aes_rround_final( aes_data_ptr->rk_ptr,
1441 &aes_data_ptr->xy_values[0],
1442 &aes_data_ptr->xy_values[1],
1443 &aes_data_ptr->xy_values[2],
1444 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001445 aes_data_ptr->xy_values[4],
1446 aes_data_ptr->xy_values[5],
1447 aes_data_ptr->xy_values[6],
1448 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001449 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001450 tindex++;
1451 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001452
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001453 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001454 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001455
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001456 // SCA countermeasure, randomize secret data location by writing to it in
1457 // a random order.
1458 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001459 i = offset;
1460 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001461 {
1462 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001463 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001464 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001465
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001466 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001467 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001468 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001469 }
1470
Andrzej Kurekca609372020-07-08 03:19:02 -04001471 // Clear the output in case of a FI
1472 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001473 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001474}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001475
1476#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1477
1478#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1479 do \
1480 { \
1481 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1482 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1483 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1484 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1485 \
1486 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1487 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1488 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1489 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1490 \
1491 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1492 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1493 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1494 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1495 \
1496 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1497 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1498 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1499 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1500 } while( 0 )
1501
1502int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1503 const unsigned char input[16],
1504 unsigned char output[16] )
1505{
1506 int i;
1507 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1508
1509 RK = ctx->rk;
1510
1511 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1512 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1513 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1514 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1515
1516 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1517 {
1518 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1519 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1520 }
1521
1522 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1523
1524 X0 = *RK++ ^ \
1525 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1526 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1527 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1528 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1529
1530 X1 = *RK++ ^ \
1531 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1532 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1533 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1534 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1535
1536 X2 = *RK++ ^ \
1537 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1538 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1539 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1540 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1541
1542 X3 = *RK++ ^ \
1543 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1544 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1545 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1546 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1547
1548 PUT_UINT32_LE( X0, output, 0 );
1549 PUT_UINT32_LE( X1, output, 4 );
1550 PUT_UINT32_LE( X2, output, 8 );
1551 PUT_UINT32_LE( X3, output, 12 );
1552
Andrzej Kureka8405442019-11-12 03:34:03 -05001553 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1554 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1555 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1556 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1557
1558 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1559 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1560 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1561 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1562
1563 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1564
Arto Kinnunen311ab592020-01-16 17:20:51 +02001565 return( 0 );
1566}
1567#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1568
Arto Kinnunen14804442019-10-16 13:43:59 +03001569#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001570#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1571
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001572#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001573void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1574 const unsigned char input[16],
1575 unsigned char output[16] )
1576{
Arto Kinnunen14804442019-10-16 13:43:59 +03001577#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1578 (void) ctx;
1579 (void) input;
1580 (void) output;
1581#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001582 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001583#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001584}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001585#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001586
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001587/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001588 * AES-ECB block encryption/decryption
1589 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001590int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001591 int mode,
1592 const unsigned char input[16],
1593 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001594{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001595 AES_VALIDATE_RET( ctx != NULL );
1596 AES_VALIDATE_RET( input != NULL );
1597 AES_VALIDATE_RET( output != NULL );
1598 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1599 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001600 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001603 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001604 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001605#endif
1606
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001607#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001608 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001609 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001610 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001611 return( 0 );
1612
1613 // If padlock data misaligned, we just fall back to
1614 // unaccelerated mode
1615 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001616 }
1617#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001618
Arto Kinnunen14804442019-10-16 13:43:59 +03001619#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1620 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1621#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001622
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001623 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001624 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001625 else
Andres AGf5bf7182017-03-03 14:09:56 +00001626 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001627#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001628}
1629
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001630#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001631/*
1632 * AES-CBC buffer encryption/decryption
1633 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001635 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001636 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001637 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001638 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001639 unsigned char *output )
1640{
1641 int i;
1642 unsigned char temp[16];
1643
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001644 AES_VALIDATE_RET( ctx != NULL );
1645 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1646 mode == MBEDTLS_AES_DECRYPT );
1647 AES_VALIDATE_RET( iv != NULL );
1648 AES_VALIDATE_RET( input != NULL );
1649 AES_VALIDATE_RET( output != NULL );
1650
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001651 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001652 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001655 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001656 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001657 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001658 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001659
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001660 // If padlock data misaligned, we just fall back to
1661 // unaccelerated mode
1662 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001663 }
1664#endif
1665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001666 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001667 {
1668 while( length > 0 )
1669 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001670 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001671 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001672
1673 for( i = 0; i < 16; i++ )
1674 output[i] = (unsigned char)( output[i] ^ iv[i] );
1675
Teppo Järvelin91d79382019-10-02 09:09:31 +03001676 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001677
1678 input += 16;
1679 output += 16;
1680 length -= 16;
1681 }
1682 }
1683 else
1684 {
1685 while( length > 0 )
1686 {
1687 for( i = 0; i < 16; i++ )
1688 output[i] = (unsigned char)( input[i] ^ iv[i] );
1689
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001690 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001691 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
1693 input += 16;
1694 output += 16;
1695 length -= 16;
1696 }
1697 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001698
1699 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001700}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001701#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001702
Aorimn5f778012016-06-09 23:22:58 +02001703#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001704
1705/* Endianess with 64 bits values */
1706#ifndef GET_UINT64_LE
1707#define GET_UINT64_LE(n,b,i) \
1708{ \
1709 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1710 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1711 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1712 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1713 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1714 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1715 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1716 | ( (uint64_t) (b)[(i) ] ); \
1717}
1718#endif
1719
1720#ifndef PUT_UINT64_LE
1721#define PUT_UINT64_LE(n,b,i) \
1722{ \
1723 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1724 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1725 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1726 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1727 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1728 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1729 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1730 (b)[(i) ] = (unsigned char) ( (n) ); \
1731}
1732#endif
1733
1734typedef unsigned char mbedtls_be128[16];
1735
1736/*
1737 * GF(2^128) multiplication function
1738 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001739 * This function multiplies a field element by x in the polynomial field
1740 * representation. It uses 64-bit word operations to gain speed but compensates
1741 * for machine endianess and hence works correctly on both big and little
1742 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001743 */
1744static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001745 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001746{
1747 uint64_t a, b, ra, rb;
1748
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001749 GET_UINT64_LE( a, x, 0 );
1750 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001751
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001752 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1753 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001754
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001755 PUT_UINT64_LE( ra, r, 0 );
1756 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001757}
1758
Aorimn5f778012016-06-09 23:22:58 +02001759/*
1760 * AES-XTS buffer encryption/decryption
1761 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001762int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1763 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001764 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001765 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001766 const unsigned char *input,
1767 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001768{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001769 int ret;
1770 size_t blocks = length / 16;
1771 size_t leftover = length % 16;
1772 unsigned char tweak[16];
1773 unsigned char prev_tweak[16];
1774 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001775
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001776 AES_VALIDATE_RET( ctx != NULL );
1777 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1778 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001779 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001780 AES_VALIDATE_RET( input != NULL );
1781 AES_VALIDATE_RET( output != NULL );
1782
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001783 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001784 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001785 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001786
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001787 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001788 if( length > ( 1 << 20 ) * 16 )
1789 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001790
Jaeden Amerod82cd862018-04-28 15:02:45 +01001791 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001792 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1793 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001794 if( ret != 0 )
1795 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001796
Jaeden Amerod82cd862018-04-28 15:02:45 +01001797 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001798 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001799 size_t i;
1800
1801 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1802 {
1803 /* We are on the last block in a decrypt operation that has
1804 * leftover bytes, so we need to use the next tweak for this block,
1805 * and this tweak for the lefover bytes. Save the current tweak for
1806 * the leftovers and then update the current tweak for use on this,
1807 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001808 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001809 mbedtls_gf128mul_x_ble( tweak, tweak );
1810 }
1811
1812 for( i = 0; i < 16; i++ )
1813 tmp[i] = input[i] ^ tweak[i];
1814
1815 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1816 if( ret != 0 )
1817 return( ret );
1818
1819 for( i = 0; i < 16; i++ )
1820 output[i] = tmp[i] ^ tweak[i];
1821
1822 /* Update the tweak for the next block. */
1823 mbedtls_gf128mul_x_ble( tweak, tweak );
1824
1825 output += 16;
1826 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001827 }
1828
Jaeden Amerod82cd862018-04-28 15:02:45 +01001829 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001830 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001831 /* If we are on the leftover bytes in a decrypt operation, we need to
1832 * use the previous tweak for these bytes (as saved in prev_tweak). */
1833 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001834
Jaeden Amerod82cd862018-04-28 15:02:45 +01001835 /* We are now on the final part of the data unit, which doesn't divide
1836 * evenly by 16. It's time for ciphertext stealing. */
1837 size_t i;
1838 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001839
Jaeden Amerod82cd862018-04-28 15:02:45 +01001840 /* Copy ciphertext bytes from the previous block to our output for each
1841 * byte of cyphertext we won't steal. At the same time, copy the
1842 * remainder of the input for this final round (since the loop bounds
1843 * are the same). */
1844 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001845 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001846 output[i] = prev_output[i];
1847 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001848 }
Aorimn5f778012016-06-09 23:22:58 +02001849
Jaeden Amerod82cd862018-04-28 15:02:45 +01001850 /* Copy ciphertext bytes from the previous block for input in this
1851 * round. */
1852 for( ; i < 16; i++ )
1853 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001854
Jaeden Amerod82cd862018-04-28 15:02:45 +01001855 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1856 if( ret != 0 )
1857 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001858
Jaeden Amerod82cd862018-04-28 15:02:45 +01001859 /* Write the result back to the previous block, overriding the previous
1860 * output we copied. */
1861 for( i = 0; i < 16; i++ )
1862 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001863 }
1864
1865 return( 0 );
1866}
1867#endif /* MBEDTLS_CIPHER_MODE_XTS */
1868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001869#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001870/*
1871 * AES-CFB128 buffer encryption/decryption
1872 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001873int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001874 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001875 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001876 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001877 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001878 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001879 unsigned char *output )
1880{
Paul Bakker27fdf462011-06-09 13:55:13 +00001881 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001882 size_t n;
1883
1884 AES_VALIDATE_RET( ctx != NULL );
1885 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1886 mode == MBEDTLS_AES_DECRYPT );
1887 AES_VALIDATE_RET( iv_off != NULL );
1888 AES_VALIDATE_RET( iv != NULL );
1889 AES_VALIDATE_RET( input != NULL );
1890 AES_VALIDATE_RET( output != NULL );
1891
1892 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001893
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001894 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001895 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001897 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001898 {
1899 while( length-- )
1900 {
1901 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001902 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001903
1904 c = *input++;
1905 *output++ = (unsigned char)( c ^ iv[n] );
1906 iv[n] = (unsigned char) c;
1907
Paul Bakker66d5d072014-06-17 16:39:18 +02001908 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 }
1910 }
1911 else
1912 {
1913 while( length-- )
1914 {
1915 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001916 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001917
1918 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1919
Paul Bakker66d5d072014-06-17 16:39:18 +02001920 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001921 }
1922 }
1923
1924 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001925
1926 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001927}
Paul Bakker556efba2014-01-24 15:38:12 +01001928
1929/*
1930 * AES-CFB8 buffer encryption/decryption
1931 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001932int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001933 int mode,
1934 size_t length,
1935 unsigned char iv[16],
1936 const unsigned char *input,
1937 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001938{
1939 unsigned char c;
1940 unsigned char ov[17];
1941
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001942 AES_VALIDATE_RET( ctx != NULL );
1943 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1944 mode == MBEDTLS_AES_DECRYPT );
1945 AES_VALIDATE_RET( iv != NULL );
1946 AES_VALIDATE_RET( input != NULL );
1947 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001948 while( length-- )
1949 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001950 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001951 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001953 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001954 ov[16] = *input;
1955
1956 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1957
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001958 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001959 ov[16] = c;
1960
Teppo Järvelin91d79382019-10-02 09:09:31 +03001961 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001962 }
1963
1964 return( 0 );
1965}
Simon Butcher76a5b222018-04-22 22:57:27 +01001966#endif /* MBEDTLS_CIPHER_MODE_CFB */
1967
1968#if defined(MBEDTLS_CIPHER_MODE_OFB)
1969/*
1970 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1971 */
1972int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001973 size_t length,
1974 size_t *iv_off,
1975 unsigned char iv[16],
1976 const unsigned char *input,
1977 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001978{
Simon Butcherad4e4932018-04-29 00:43:47 +01001979 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001980 size_t n;
1981
1982 AES_VALIDATE_RET( ctx != NULL );
1983 AES_VALIDATE_RET( iv_off != NULL );
1984 AES_VALIDATE_RET( iv != NULL );
1985 AES_VALIDATE_RET( input != NULL );
1986 AES_VALIDATE_RET( output != NULL );
1987
1988 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001989
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001990 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001991 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1992
Simon Butcher76a5b222018-04-22 22:57:27 +01001993 while( length-- )
1994 {
1995 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001996 {
1997 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1998 if( ret != 0 )
1999 goto exit;
2000 }
Simon Butcher76a5b222018-04-22 22:57:27 +01002001 *output++ = *input++ ^ iv[n];
2002
2003 n = ( n + 1 ) & 0x0F;
2004 }
2005
2006 *iv_off = n;
2007
Simon Butcherad4e4932018-04-29 00:43:47 +01002008exit:
2009 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002010}
2011#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002012
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002013#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002014/*
2015 * AES-CTR buffer encryption/decryption
2016 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002017int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002018 size_t length,
2019 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002020 unsigned char nonce_counter[16],
2021 unsigned char stream_block[16],
2022 const unsigned char *input,
2023 unsigned char *output )
2024{
Paul Bakker369e14b2012-04-18 14:16:09 +00002025 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002026 size_t n;
2027
2028 AES_VALIDATE_RET( ctx != NULL );
2029 AES_VALIDATE_RET( nc_off != NULL );
2030 AES_VALIDATE_RET( nonce_counter != NULL );
2031 AES_VALIDATE_RET( stream_block != NULL );
2032 AES_VALIDATE_RET( input != NULL );
2033 AES_VALIDATE_RET( output != NULL );
2034
2035 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002036
Arto Kinnunen75439012019-12-03 14:12:10 +02002037 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002038 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2039
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002040 while( length-- )
2041 {
2042 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002044
Paul Bakker369e14b2012-04-18 14:16:09 +00002045 for( i = 16; i > 0; i-- )
2046 if( ++nonce_counter[i - 1] != 0 )
2047 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002048 }
2049 c = *input++;
2050 *output++ = (unsigned char)( c ^ stream_block[n] );
2051
Paul Bakker66d5d072014-06-17 16:39:18 +02002052 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002053 }
2054
2055 *nc_off = n;
2056
2057 return( 0 );
2058}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002059#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002061#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002063#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002064/*
2065 * AES test vectors from:
2066 *
2067 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2068 */
2069static const unsigned char aes_test_ecb_dec[3][16] =
2070{
2071 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2072 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2073 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2074 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2075 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2076 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2077};
2078
2079static const unsigned char aes_test_ecb_enc[3][16] =
2080{
2081 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2082 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2083 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2084 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2085 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2086 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2087};
2088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002090static const unsigned char aes_test_cbc_dec[3][16] =
2091{
2092 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2093 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2094 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2095 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2096 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2097 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2098};
2099
2100static const unsigned char aes_test_cbc_enc[3][16] =
2101{
2102 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2103 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2104 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2105 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2106 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2107 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2108};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002109#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002111#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002112/*
2113 * AES-CFB128 test vectors from:
2114 *
2115 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2116 */
2117static const unsigned char aes_test_cfb128_key[3][32] =
2118{
2119 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2120 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2121 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2122 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2123 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2124 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2125 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2126 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2127 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2128};
2129
2130static const unsigned char aes_test_cfb128_iv[16] =
2131{
2132 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2133 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2134};
2135
2136static const unsigned char aes_test_cfb128_pt[64] =
2137{
2138 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2139 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2140 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2141 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2142 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2143 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2144 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2145 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2146};
2147
2148static const unsigned char aes_test_cfb128_ct[3][64] =
2149{
2150 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2151 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2152 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2153 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2154 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2155 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2156 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2157 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2158 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2159 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2160 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2161 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2162 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2163 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2164 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2165 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2166 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2167 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2168 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2169 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2170 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2171 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2172 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2173 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2174};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002176
Simon Butcherad4e4932018-04-29 00:43:47 +01002177#if defined(MBEDTLS_CIPHER_MODE_OFB)
2178/*
2179 * AES-OFB test vectors from:
2180 *
Simon Butcher5db13622018-06-04 22:11:25 +01002181 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002182 */
2183static const unsigned char aes_test_ofb_key[3][32] =
2184{
2185 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2186 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2187 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2188 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2189 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2190 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2191 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2192 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2193 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2194};
2195
2196static const unsigned char aes_test_ofb_iv[16] =
2197{
2198 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2199 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2200};
2201
2202static const unsigned char aes_test_ofb_pt[64] =
2203{
2204 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2205 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2206 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2207 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2208 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2209 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2210 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2211 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2212};
2213
2214static const unsigned char aes_test_ofb_ct[3][64] =
2215{
2216 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2217 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2218 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2219 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2220 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2221 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2222 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2223 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2224 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2225 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2226 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2227 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2228 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2229 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2230 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2231 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2232 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2233 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2234 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2235 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2236 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2237 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2238 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2239 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2240};
2241#endif /* MBEDTLS_CIPHER_MODE_OFB */
2242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002243#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002244/*
2245 * AES-CTR test vectors from:
2246 *
2247 * http://www.faqs.org/rfcs/rfc3686.html
2248 */
2249
2250static const unsigned char aes_test_ctr_key[3][16] =
2251{
2252 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2253 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2254 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2255 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2256 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2257 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2258};
2259
2260static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2261{
2262 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2264 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2265 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2266 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2267 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2268};
2269
2270static const unsigned char aes_test_ctr_pt[3][48] =
2271{
2272 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2273 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2274
2275 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2276 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2277 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2278 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2279
2280 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2281 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2282 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2283 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2284 0x20, 0x21, 0x22, 0x23 }
2285};
2286
2287static const unsigned char aes_test_ctr_ct[3][48] =
2288{
2289 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2290 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2291 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2292 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2293 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2294 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2295 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2296 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2297 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2298 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2299 0x25, 0xB2, 0x07, 0x2F }
2300};
2301
2302static const int aes_test_ctr_len[3] =
2303 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002304#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002305
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002306#if defined(MBEDTLS_CIPHER_MODE_XTS)
2307/*
2308 * AES-XTS test vectors from:
2309 *
2310 * IEEE P1619/D16 Annex B
2311 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2312 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2313 */
2314static const unsigned char aes_test_xts_key[][32] =
2315{
2316 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2320 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2321 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2322 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2323 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2324 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2325 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2326 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2327 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2328};
2329
2330static const unsigned char aes_test_xts_pt32[][32] =
2331{
2332 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2336 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2337 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2338 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2339 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2340 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2341 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2342 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2343 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2344};
2345
2346static const unsigned char aes_test_xts_ct32[][32] =
2347{
2348 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2349 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2350 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2351 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2352 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2353 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2354 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2355 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2356 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2357 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2358 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2359 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2360};
2361
2362static const unsigned char aes_test_xts_data_unit[][16] =
2363{
2364 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2366 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2368 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2370};
2371
2372#endif /* MBEDTLS_CIPHER_MODE_XTS */
2373
Paul Bakker5121ce52009-01-03 21:22:43 +00002374/*
2375 * Checkup routine
2376 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002377int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002378{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002379 int ret = 0, i, j, u, mode;
2380 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002381 unsigned char key[32];
2382 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002383 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002384#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002385 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002386#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002387#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002388 unsigned char prv[16];
2389#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002390#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2391 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002392 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002393#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002394#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002395 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002396#endif
2397#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002398 unsigned char nonce_counter[16];
2399 unsigned char stream_block[16];
2400#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002401 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002402
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002403 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002404 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002405
2406 /*
2407 * ECB mode
2408 */
2409 for( i = 0; i < 6; i++ )
2410 {
2411 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002412 keybits = 128 + u * 64;
2413 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002414
2415 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002416 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2417 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002418
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002419#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2420 if( keybits > 128 )
2421 {
2422 mbedtls_printf( "skipped\n" );
2423 continue;
2424 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002425#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2426
2427#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2428 if( mode == MBEDTLS_AES_DECRYPT )
2429 {
2430 mbedtls_printf( "skipped\n" );
2431 continue;
2432 }
2433#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002434
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002435 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002436
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002437 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002438 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002439 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2440 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002441 }
2442 else
2443 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002444 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2445 aes_tests = aes_test_ecb_enc[u];
2446 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002447
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002448 /*
2449 * AES-192 is an optional feature that may be unavailable when
2450 * there is an alternative underlying implementation i.e. when
2451 * MBEDTLS_AES_ALT is defined.
2452 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002453 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002454 {
2455 mbedtls_printf( "skipped\n" );
2456 continue;
2457 }
2458 else if( ret != 0 )
2459 {
2460 goto exit;
2461 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002462
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002463 for( j = 0; j < 10000; j++ )
2464 {
2465 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2466 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002467 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002468 }
2469
2470 if( memcmp( buf, aes_tests, 16 ) != 0 )
2471 {
2472 ret = 1;
2473 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002474 }
2475
2476 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002477 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002478 }
2479
2480 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002481 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002483#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002484 /*
2485 * CBC mode
2486 */
2487 for( i = 0; i < 6; i++ )
2488 {
2489 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002490 keybits = 128 + u * 64;
2491 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002492
2493 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002494 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2495 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002496
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002497#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2498 if( keybits > 128 )
2499 {
2500 mbedtls_printf( "skipped\n" );
2501 continue;
2502 }
2503#endif
2504
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002505#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2506 if( mode == MBEDTLS_AES_DECRYPT )
2507 {
2508 mbedtls_printf( "skipped\n" );
2509 continue;
2510 }
2511#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2512
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002513 memset( iv , 0, 16 );
2514 memset( prv, 0, 16 );
2515 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002516
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002517 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002518 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002519 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2520 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002521 }
2522 else
2523 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002524 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2525 aes_tests = aes_test_cbc_enc[u];
2526 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002527
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002528 /*
2529 * AES-192 is an optional feature that may be unavailable when
2530 * there is an alternative underlying implementation i.e. when
2531 * MBEDTLS_AES_ALT is defined.
2532 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002533 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002534 {
2535 mbedtls_printf( "skipped\n" );
2536 continue;
2537 }
2538 else if( ret != 0 )
2539 {
2540 goto exit;
2541 }
2542
2543 for( j = 0; j < 10000; j++ )
2544 {
2545 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002546 {
2547 unsigned char tmp[16];
2548
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002549 memcpy( tmp, prv, 16 );
2550 memcpy( prv, buf, 16 );
2551 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002552 }
2553
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002554 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2555 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002556 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002557
2558 }
2559
2560 if( memcmp( buf, aes_tests, 16 ) != 0 )
2561 {
2562 ret = 1;
2563 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002564 }
2565
2566 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002567 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002568 }
2569
2570 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002571 mbedtls_printf( "\n" );
2572#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002574#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002575 /*
2576 * CFB128 mode
2577 */
2578 for( i = 0; i < 6; i++ )
2579 {
2580 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002581 keybits = 128 + u * 64;
2582 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002583
2584 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002585 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2586 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002587
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002588#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2589 if( keybits > 128 )
2590 {
2591 mbedtls_printf( "skipped\n" );
2592 continue;
2593 }
2594#endif
2595
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002596#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2597 if( mode == MBEDTLS_AES_DECRYPT )
2598 {
2599 mbedtls_printf( "skipped\n" );
2600 continue;
2601 }
2602#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2603
Paul Bakker5121ce52009-01-03 21:22:43 +00002604 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002605 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002606
2607 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002608 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002609 /*
2610 * AES-192 is an optional feature that may be unavailable when
2611 * there is an alternative underlying implementation i.e. when
2612 * MBEDTLS_AES_ALT is defined.
2613 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002614 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002615 {
2616 mbedtls_printf( "skipped\n" );
2617 continue;
2618 }
2619 else if( ret != 0 )
2620 {
2621 goto exit;
2622 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002623
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002624 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002625 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002626 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002627 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002628 }
2629 else
2630 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002631 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002632 aes_tests = aes_test_cfb128_ct[u];
2633 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002634
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002635 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2636 if( ret != 0 )
2637 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002638
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002639 if( memcmp( buf, aes_tests, 64 ) != 0 )
2640 {
2641 ret = 1;
2642 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002643 }
2644
2645 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002646 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002647 }
2648
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002649 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002650 mbedtls_printf( "\n" );
2651#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002652
Simon Butcherad4e4932018-04-29 00:43:47 +01002653#if defined(MBEDTLS_CIPHER_MODE_OFB)
2654 /*
2655 * OFB mode
2656 */
2657 for( i = 0; i < 6; i++ )
2658 {
2659 u = i >> 1;
2660 keybits = 128 + u * 64;
2661 mode = i & 1;
2662
2663 if( verbose != 0 )
2664 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2665 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2666
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002667#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2668 if( keybits > 128 )
2669 {
2670 mbedtls_printf( "skipped\n" );
2671 continue;
2672 }
2673#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002674
2675#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2676 if( mode == MBEDTLS_AES_DECRYPT )
2677 {
2678 mbedtls_printf( "skipped\n" );
2679 continue;
2680 }
2681#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2682
Simon Butcherad4e4932018-04-29 00:43:47 +01002683 memcpy( iv, aes_test_ofb_iv, 16 );
2684 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2685
2686 offset = 0;
2687 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2688 /*
2689 * AES-192 is an optional feature that may be unavailable when
2690 * there is an alternative underlying implementation i.e. when
2691 * MBEDTLS_AES_ALT is defined.
2692 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002693 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002694 {
2695 mbedtls_printf( "skipped\n" );
2696 continue;
2697 }
2698 else if( ret != 0 )
2699 {
2700 goto exit;
2701 }
2702
2703 if( mode == MBEDTLS_AES_DECRYPT )
2704 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002705 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002706 aes_tests = aes_test_ofb_pt;
2707 }
2708 else
2709 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002710 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002711 aes_tests = aes_test_ofb_ct[u];
2712 }
2713
2714 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2715 if( ret != 0 )
2716 goto exit;
2717
2718 if( memcmp( buf, aes_tests, 64 ) != 0 )
2719 {
2720 ret = 1;
2721 goto exit;
2722 }
2723
2724 if( verbose != 0 )
2725 mbedtls_printf( "passed\n" );
2726 }
2727
2728 if( verbose != 0 )
2729 mbedtls_printf( "\n" );
2730#endif /* MBEDTLS_CIPHER_MODE_OFB */
2731
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002732#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002733 /*
2734 * CTR mode
2735 */
2736 for( i = 0; i < 6; i++ )
2737 {
2738 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002739 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002740
2741 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002742 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002743 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002744
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002745#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2746 if( keybits > 128 )
2747 {
2748 mbedtls_printf( "skipped\n" );
2749 continue;
2750 }
2751#endif
2752
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002753#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2754 if( mode == MBEDTLS_AES_DECRYPT )
2755 {
2756 mbedtls_printf( "skipped\n" );
2757 continue;
2758 }
2759#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2760
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002761 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2762 memcpy( key, aes_test_ctr_key[u], 16 );
2763
2764 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002765 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2766 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002767
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002768 len = aes_test_ctr_len[u];
2769
2770 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002771 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002772 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002773 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002774 }
2775 else
2776 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002777 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002778 aes_tests = aes_test_ctr_ct[u];
2779 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002780
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002781 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2782 stream_block, buf, buf );
2783 if( ret != 0 )
2784 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002785
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002786 if( memcmp( buf, aes_tests, len ) != 0 )
2787 {
2788 ret = 1;
2789 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002790 }
2791
2792 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002793 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002794 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002795
2796 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002797 mbedtls_printf( "\n" );
2798#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002799
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002800#if defined(MBEDTLS_CIPHER_MODE_XTS)
2801 {
2802 static const int num_tests =
2803 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2804 mbedtls_aes_xts_context ctx_xts;
2805
2806 /*
2807 * XTS mode
2808 */
2809 mbedtls_aes_xts_init( &ctx_xts );
2810
2811 for( i = 0; i < num_tests << 1; i++ )
2812 {
2813 const unsigned char *data_unit;
2814 u = i >> 1;
2815 mode = i & 1;
2816
2817 if( verbose != 0 )
2818 mbedtls_printf( " AES-XTS-128 (%s): ",
2819 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2820
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002821#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2822 if( mode == MBEDTLS_AES_DECRYPT )
2823 {
2824 mbedtls_printf( "skipped\n" );
2825 continue;
2826 }
2827#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2828
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002829 memset( key, 0, sizeof( key ) );
2830 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002831 data_unit = aes_test_xts_data_unit[u];
2832
2833 len = sizeof( *aes_test_xts_ct32 );
2834
2835 if( mode == MBEDTLS_AES_DECRYPT )
2836 {
2837 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2838 if( ret != 0)
2839 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002840 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002841 aes_tests = aes_test_xts_pt32[u];
2842 }
2843 else
2844 {
2845 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2846 if( ret != 0)
2847 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002848 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002849 aes_tests = aes_test_xts_ct32[u];
2850 }
2851
2852
2853 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2854 buf, buf );
2855 if( ret != 0 )
2856 goto exit;
2857
2858 if( memcmp( buf, aes_tests, len ) != 0 )
2859 {
2860 ret = 1;
2861 goto exit;
2862 }
2863
2864 if( verbose != 0 )
2865 mbedtls_printf( "passed\n" );
2866 }
2867
2868 if( verbose != 0 )
2869 mbedtls_printf( "\n" );
2870
2871 mbedtls_aes_xts_free( &ctx_xts );
2872 }
2873#endif /* MBEDTLS_CIPHER_MODE_XTS */
2874
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002875 ret = 0;
2876
2877exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002878 if( ret != 0 && verbose != 0 )
2879 mbedtls_printf( "failed\n" );
2880
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002881 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002882
2883 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002884}
2885
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002886#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002887
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002888#endif /* MBEDTLS_AES_C */