blob: e49f74f7690d762d534825eaf627bc33dc63c529 [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 );
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200555 // get random from 0x0fff (each f will be used separately)
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
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200573 num = ( num & 0x000f ) % ( 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
Paul Bakker5121ce52009-01-03 21:22:43 +0000678/*
679 * AES key schedule (encryption)
680 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200681#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200683 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000684{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200685 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200686 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200687 volatile unsigned int i = 0;
688 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400689 volatile const unsigned char *key_dup = key;
690 volatile unsigned int keybits_dup = keybits;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000691 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200692 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000693
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100694 AES_VALIDATE_RET( ctx != NULL );
695 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000696
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200697 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000698 {
699 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300700#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000701 case 192: ctx->nr = 12; break;
702 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300703#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200704 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000705 }
706
Simon Butcher5201e412018-12-06 17:40:14 +0000707#if !defined(MBEDTLS_AES_ROM_TABLES)
708 if( aes_init_done == 0 )
709 {
710 aes_gen_tables();
711 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000712 }
713#endif
714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000716 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100717 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000718
719 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000721 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000722#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000723 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100726 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200727 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100728#endif
729
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200730 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
731 offset = mbedtls_platform_random_in_range( keybits >> 5 );
732
733 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000734 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200735 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200736 flow_ctrl++;
737 }
738
739 for( j = 0; j < offset; j++ )
740 {
741 GET_UINT32_LE( RK[j], key, j << 2 );
742 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000743 }
744
745 switch( ctx->nr )
746 {
747 case 10:
748
749 for( i = 0; i < 10; i++, RK += 4 )
750 {
751 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000752 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
753 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
754 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
755 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000756
757 RK[5] = RK[1] ^ RK[4];
758 RK[6] = RK[2] ^ RK[5];
759 RK[7] = RK[3] ^ RK[6];
760 }
761 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300762#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000763 case 12:
764
765 for( i = 0; i < 8; i++, RK += 6 )
766 {
767 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000768 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
769 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
770 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
771 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
773 RK[7] = RK[1] ^ RK[6];
774 RK[8] = RK[2] ^ RK[7];
775 RK[9] = RK[3] ^ RK[8];
776 RK[10] = RK[4] ^ RK[9];
777 RK[11] = RK[5] ^ RK[10];
778 }
779 break;
780
781 case 14:
782
783 for( i = 0; i < 7; i++, RK += 8 )
784 {
785 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000786 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
787 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
788 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
789 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000790
791 RK[9] = RK[1] ^ RK[8];
792 RK[10] = RK[2] ^ RK[9];
793 RK[11] = RK[3] ^ RK[10];
794
795 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000796 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
797 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
798 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
799 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000800
801 RK[13] = RK[5] ^ RK[12];
802 RK[14] = RK[6] ^ RK[13];
803 RK[15] = RK[7] ^ RK[14];
804 }
805 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300806#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000807 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000808
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200809 ret = 0;
810
811 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200812 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200813#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
814 || ( ctx->nr == 12 && i == 8 )
815 || ( ctx->nr == 14 && i == 7 )
816#endif
817 ) )
818 {
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400819 if( keybits_dup == keybits && key_dup == key )
820 {
821 return ret;
822 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200823 }
824
Andrzej Kurekca609372020-07-08 03:19:02 -0400825 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200826 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000827}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200828#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000829
830/*
831 * AES key schedule (decryption)
832 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200833#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200835 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000836{
Arto Kinnunen14804442019-10-16 13:43:59 +0300837#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
838 (void) ctx;
839 (void) key;
840 (void) keybits;
841
842 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
843#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200844 volatile unsigned int i = 0, j = 0;
845 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000847 uint32_t *RK;
848 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200849
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100850 AES_VALIDATE_RET( ctx != NULL );
851 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000852
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200853 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000854
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000856 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100857 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000858
859 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000861 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000862#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000863 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000864
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200865 /* Also checks keybits */
866 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200867 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000868
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200869 ctx->nr = cty.nr;
870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200871#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100872 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100873 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100875 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200876 i = 0;
877 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200878 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100879 }
880#endif
881
Paul Bakker5121ce52009-01-03 21:22:43 +0000882 SK = cty.rk + cty.nr * 4;
883
884 *RK++ = *SK++;
885 *RK++ = *SK++;
886 *RK++ = *SK++;
887 *RK++ = *SK++;
888
889 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
890 {
891 for( j = 0; j < 4; j++, SK++ )
892 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200893 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
894 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
895 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
896 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000897 }
898 }
899
900 *RK++ = *SK++;
901 *RK++ = *SK++;
902 *RK++ = *SK++;
903 *RK++ = *SK++;
904
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200905exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000907
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200908 if( ret != 0 )
909 {
910 return( ret );
911 }
912 else if( ( i == 0 ) && ( j == 4 ) )
913 {
914 return( ret );
915 }
916 else
917 {
918 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
919 }
920
Arto Kinnunen14804442019-10-16 13:43:59 +0300921#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000922}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100923
924#if defined(MBEDTLS_CIPHER_MODE_XTS)
925static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
926 unsigned int keybits,
927 const unsigned char **key1,
928 unsigned int *key1bits,
929 const unsigned char **key2,
930 unsigned int *key2bits )
931{
932 const unsigned int half_keybits = keybits / 2;
933 const unsigned int half_keybytes = half_keybits / 8;
934
935 switch( keybits )
936 {
937 case 256: break;
938 case 512: break;
939 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
940 }
941
942 *key1bits = half_keybits;
943 *key2bits = half_keybits;
944 *key1 = &key[0];
945 *key2 = &key[half_keybytes];
946
947 return 0;
948}
949
950int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
951 const unsigned char *key,
952 unsigned int keybits)
953{
954 int ret;
955 const unsigned char *key1, *key2;
956 unsigned int key1bits, key2bits;
957
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100958 AES_VALIDATE_RET( ctx != NULL );
959 AES_VALIDATE_RET( key != NULL );
960
Jaeden Amero9366feb2018-05-29 18:55:17 +0100961 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
962 &key2, &key2bits );
963 if( ret != 0 )
964 return( ret );
965
966 /* Set the tweak key. Always set tweak key for the encryption mode. */
967 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
968 if( ret != 0 )
969 return( ret );
970
971 /* Set crypt key for encryption. */
972 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
973}
974
975int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
976 const unsigned char *key,
977 unsigned int keybits)
978{
979 int ret;
980 const unsigned char *key1, *key2;
981 unsigned int key1bits, key2bits;
982
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100983 AES_VALIDATE_RET( ctx != NULL );
984 AES_VALIDATE_RET( key != NULL );
985
Jaeden Amero9366feb2018-05-29 18:55:17 +0100986 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
987 &key2, &key2bits );
988 if( ret != 0 )
989 return( ret );
990
991 /* Set the tweak key. Always set tweak key for encryption. */
992 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
993 if( ret != 0 )
994 return( ret );
995
996 /* Set crypt key for decryption. */
997 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
998}
999#endif /* MBEDTLS_CIPHER_MODE_XTS */
1000
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001001#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001002
Paul Bakker5121ce52009-01-03 21:22:43 +00001003/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001004 * AES-ECB block encryption
1005 */
1006#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001007
Arto Kinnunen311ab592020-01-16 17:20:51 +02001008#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001009static uint32_t *aes_fround( uint32_t *R,
1010 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1011 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1012{
1013 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1014 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1015 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1016 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1017
1018 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1019 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1020 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1021 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1022
1023 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1024 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1025 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1026 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1027
1028 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1029 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1030 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1031 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1032
1033 return R;
1034}
1035
1036static void aes_fround_final( uint32_t *R,
1037 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1038 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1039{
1040 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1041 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1042 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1043 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1044
1045 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1046 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1047 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1048 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1049
1050 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1051 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1052 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1053 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1054
1055 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1056 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1057 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1058 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1059}
1060
Andres AGf5bf7182017-03-03 14:09:56 +00001061int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1062 const unsigned char input[16],
1063 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001064{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001065 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001066 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001067 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001068 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001069 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001070 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001071 volatile int flow_control;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001072 volatile const unsigned char *input_dup = input;
1073 volatile unsigned char *output_dup = output;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001074 // control bytes for AES calculation rounds,
1075 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1076 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001077
Arto Kinnunen172836a2019-11-28 13:34:13 +02001078 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001079 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001080 aes_data_table[0] = &aes_data_real;
1081 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001082
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001083 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001084 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1085 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001086 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001087
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001088 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001089 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001090
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001091 // SCA countermeasure, randomize secret data location by initializing it in
1092 // a random order and writing randomized fake data between the real data
1093 // writes.
1094 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001095 i = offset;
1096 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001097 {
1098 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001099 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001100 flow_control++;
1101 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001102
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001103 tindex = 0;
1104 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001105 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001106 // Get pointer to the real or fake data
1107 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1108 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001109
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001110 // initial round key addition
1111 for( i = 0; i < 4; i++ )
1112 {
1113 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1114 }
1115 tindex++;
1116 flow_control++;
1117 } while( stop_mark == 0 );
1118
1119 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1120 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001121 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001122 // Get pointer to the real or fake data
1123 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1124 offset = round_ctrl_table[tindex] & 0x04;
1125 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001126
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001127 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1128 &aes_data_ptr->xy_values[0 + offset],
1129 &aes_data_ptr->xy_values[1 + offset],
1130 &aes_data_ptr->xy_values[2 + offset],
1131 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001132 aes_data_ptr->xy_values[4 - offset],
1133 aes_data_ptr->xy_values[5 - offset],
1134 aes_data_ptr->xy_values[6 - offset],
1135 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001136 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001137 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001138 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001139
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001140 // Calculate final AES round + dummy rounds
1141 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001142 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001143 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1144 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001145 aes_fround_final( aes_data_ptr->rk_ptr,
1146 &aes_data_ptr->xy_values[0],
1147 &aes_data_ptr->xy_values[1],
1148 &aes_data_ptr->xy_values[2],
1149 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001150 aes_data_ptr->xy_values[4],
1151 aes_data_ptr->xy_values[5],
1152 aes_data_ptr->xy_values[6],
1153 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001154 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001155 tindex++;
1156 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001157
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001158 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001159 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001160
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001161 // SCA countermeasure, randomize secret data location by writing to it in
1162 // a random order.
1163 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001164 i = offset;
1165 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001166 {
1167 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1168 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001169 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001170
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001171 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001172 {
1173 /* Validate control path due possible fault injection */
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001174 if( output_dup == output && input_dup == input )
1175 {
1176 return 0;
1177 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001178 }
1179
Andrzej Kurekca609372020-07-08 03:19:02 -04001180 // Clear the output in case of a FI
1181 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001182 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001183}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001184
1185#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1186
1187#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1188 do \
1189 { \
1190 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1191 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1192 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1193 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1194 \
1195 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1196 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1197 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1198 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1199 \
1200 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1201 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1202 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1203 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1204 \
1205 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1206 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1207 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1208 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1209 } while( 0 )
1210
1211int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1212 const unsigned char input[16],
1213 unsigned char output[16] )
1214{
1215 int i;
1216 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1217
1218 RK = ctx->rk;
1219
1220 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1221 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1222 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1223 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1224
1225 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1226 {
1227 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1228 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1229 }
1230
1231 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1232
1233 X0 = *RK++ ^ \
1234 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1235 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1236 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1237 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1238
1239 X1 = *RK++ ^ \
1240 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1241 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1242 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1243 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1244
1245 X2 = *RK++ ^ \
1246 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1247 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1248 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1249 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1250
1251 X3 = *RK++ ^ \
1252 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1253 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1254 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1255 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1256
1257 PUT_UINT32_LE( X0, output, 0 );
1258 PUT_UINT32_LE( X1, output, 4 );
1259 PUT_UINT32_LE( X2, output, 8 );
1260 PUT_UINT32_LE( X3, output, 12 );
1261
Andrzej Kureka8405442019-11-12 03:34:03 -05001262 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1263 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1264 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1265 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1266
1267 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1268 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1269 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1270 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1271
1272 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1273
Arto Kinnunen311ab592020-01-16 17:20:51 +02001274 return( 0 );
1275}
1276#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001277#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1278
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001279#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001280void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1281 const unsigned char input[16],
1282 unsigned char output[16] )
1283{
1284 mbedtls_internal_aes_encrypt( ctx, input, output );
1285}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001286#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001287
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001288/*
1289 * AES-ECB block decryption
1290 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001291
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001292#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001293#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001294
Arto Kinnunen311ab592020-01-16 17:20:51 +02001295#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001296static uint32_t *aes_rround( uint32_t *R,
1297 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1298 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1299{
1300 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1301 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1302 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1303 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1304
1305 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1306 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1307 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1308 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1309
1310 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1311 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1312 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1313 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1314
1315 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1316 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1317 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1318 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1319 return R;
1320}
1321
1322static void aes_rround_final( uint32_t *R,
1323 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1324 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1325{
1326 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1327 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1328 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1329 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1330
1331 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1332 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1333 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1334 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1335
1336 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1337 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1338 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1339 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1340
1341 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1342 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1343 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1344 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1345}
1346
Andres AGf5bf7182017-03-03 14:09:56 +00001347int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1348 const unsigned char input[16],
1349 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001350{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001351 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001352 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001353 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001354 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001355 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001356 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001357 volatile int flow_control;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001358 volatile const unsigned char *input_dup = input;
1359 volatile unsigned char *output_dup = output;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001360 // control bytes for AES calculation rounds,
1361 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1362 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001363
Arto Kinnunen172836a2019-11-28 13:34:13 +02001364 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001365 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001366 aes_data_table[0] = &aes_data_real;
1367 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001368
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001369 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001370 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001371 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001372 flow_control = dummy_rounds;
1373
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001374 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001375 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001376
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001377 // SCA countermeasure, randomize secret data location by initializing it in
1378 // a random order and writing randomized fake data between the real data
1379 // writes.
1380 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001381 i = offset;
1382 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001383 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001384 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001385 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001386 flow_control++;
1387 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001388
1389 tindex = 0;
1390 do
1391 {
1392 // Get pointer to the real or fake data
1393 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1394 stop_mark = round_ctrl_table[tindex] & 0x03;
1395
1396 // initial round key addition
1397 for( i = 0; i < 4; i++ )
1398 {
1399 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1400 }
1401 tindex++;
1402 flow_control++;
1403 } while( stop_mark == 0 );
1404
1405 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1406 do
1407 {
1408 // Get pointer to the real or fake data
1409 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1410 offset = round_ctrl_table[tindex] & 0x04;
1411 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001412
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001413 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1414 &aes_data_ptr->xy_values[0 + offset],
1415 &aes_data_ptr->xy_values[1 + offset],
1416 &aes_data_ptr->xy_values[2 + offset],
1417 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001418 aes_data_ptr->xy_values[4 - offset],
1419 aes_data_ptr->xy_values[5 - offset],
1420 aes_data_ptr->xy_values[6 - offset],
1421 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001422 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001423 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001424 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001425
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001426 // Calculate final AES round + dummy rounds
1427 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001428 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001429 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1430 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001431 aes_rround_final( aes_data_ptr->rk_ptr,
1432 &aes_data_ptr->xy_values[0],
1433 &aes_data_ptr->xy_values[1],
1434 &aes_data_ptr->xy_values[2],
1435 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001436 aes_data_ptr->xy_values[4],
1437 aes_data_ptr->xy_values[5],
1438 aes_data_ptr->xy_values[6],
1439 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001440 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001441 tindex++;
1442 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001443
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001444 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001445 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001446
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001447 // SCA countermeasure, randomize secret data location by writing to it in
1448 // a random order.
1449 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001450 i = offset;
1451 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001452 {
1453 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001454 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001455 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001456
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001457 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001458 {
1459 /* Validate control path due possible fault injection */
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001460 if( output_dup == output && input_dup == input )
1461 {
1462 return 0;
1463 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001464 }
1465
Andrzej Kurekca609372020-07-08 03:19:02 -04001466 // Clear the output in case of a FI
1467 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001468 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001469}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001470
1471#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1472
1473#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1474 do \
1475 { \
1476 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1477 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1478 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1479 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1480 \
1481 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1482 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1483 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1484 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1485 \
1486 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1487 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1488 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1489 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1490 \
1491 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1492 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1493 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1494 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1495 } while( 0 )
1496
1497int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1498 const unsigned char input[16],
1499 unsigned char output[16] )
1500{
1501 int i;
1502 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1503
1504 RK = ctx->rk;
1505
1506 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1507 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1508 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1509 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1510
1511 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1512 {
1513 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1514 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1515 }
1516
1517 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1518
1519 X0 = *RK++ ^ \
1520 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1521 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1522 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1523 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1524
1525 X1 = *RK++ ^ \
1526 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1527 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1528 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1529 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1530
1531 X2 = *RK++ ^ \
1532 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1533 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1534 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1535 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1536
1537 X3 = *RK++ ^ \
1538 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1539 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1540 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1541 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1542
1543 PUT_UINT32_LE( X0, output, 0 );
1544 PUT_UINT32_LE( X1, output, 4 );
1545 PUT_UINT32_LE( X2, output, 8 );
1546 PUT_UINT32_LE( X3, output, 12 );
1547
Andrzej Kureka8405442019-11-12 03:34:03 -05001548 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1549 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1550 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1551 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1552
1553 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1554 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1555 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1556 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1557
1558 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1559
Arto Kinnunen311ab592020-01-16 17:20:51 +02001560 return( 0 );
1561}
1562#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1563
Arto Kinnunen14804442019-10-16 13:43:59 +03001564#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001565#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1566
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001567#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001568void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1569 const unsigned char input[16],
1570 unsigned char output[16] )
1571{
Arto Kinnunen14804442019-10-16 13:43:59 +03001572#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1573 (void) ctx;
1574 (void) input;
1575 (void) output;
1576#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001577 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001578#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001579}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001580#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001581
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001582/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001583 * AES-ECB block encryption/decryption
1584 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001586 int mode,
1587 const unsigned char input[16],
1588 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001589{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001590 AES_VALIDATE_RET( ctx != NULL );
1591 AES_VALIDATE_RET( input != NULL );
1592 AES_VALIDATE_RET( output != NULL );
1593 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1594 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001595 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001596
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001597#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001598 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001599 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001600#endif
1601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001603 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001604 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001605 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001606 return( 0 );
1607
1608 // If padlock data misaligned, we just fall back to
1609 // unaccelerated mode
1610 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001611 }
1612#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001613
Arto Kinnunen14804442019-10-16 13:43:59 +03001614#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1615 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1616#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001617
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001618 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001619 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001620 else
Andres AGf5bf7182017-03-03 14:09:56 +00001621 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001622#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001623}
1624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001625#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001626/*
1627 * AES-CBC buffer encryption/decryption
1628 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001629int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001630 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001631 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001632 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001633 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001634 unsigned char *output )
1635{
1636 int i;
1637 unsigned char temp[16];
1638
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001639 AES_VALIDATE_RET( ctx != NULL );
1640 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1641 mode == MBEDTLS_AES_DECRYPT );
1642 AES_VALIDATE_RET( iv != NULL );
1643 AES_VALIDATE_RET( input != NULL );
1644 AES_VALIDATE_RET( output != NULL );
1645
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001646 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001647 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001648
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001649#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001650 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001651 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001652 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001653 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001654
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001655 // If padlock data misaligned, we just fall back to
1656 // unaccelerated mode
1657 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001658 }
1659#endif
1660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001661 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001662 {
1663 while( length > 0 )
1664 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001665 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001666 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001667
1668 for( i = 0; i < 16; i++ )
1669 output[i] = (unsigned char)( output[i] ^ iv[i] );
1670
Teppo Järvelin91d79382019-10-02 09:09:31 +03001671 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001672
1673 input += 16;
1674 output += 16;
1675 length -= 16;
1676 }
1677 }
1678 else
1679 {
1680 while( length > 0 )
1681 {
1682 for( i = 0; i < 16; i++ )
1683 output[i] = (unsigned char)( input[i] ^ iv[i] );
1684
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001685 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001686 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001687
1688 input += 16;
1689 output += 16;
1690 length -= 16;
1691 }
1692 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001693
1694 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001695}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001696#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001697
Aorimn5f778012016-06-09 23:22:58 +02001698#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001699
1700/* Endianess with 64 bits values */
1701#ifndef GET_UINT64_LE
1702#define GET_UINT64_LE(n,b,i) \
1703{ \
1704 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1705 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1706 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1707 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1708 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1709 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1710 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1711 | ( (uint64_t) (b)[(i) ] ); \
1712}
1713#endif
1714
1715#ifndef PUT_UINT64_LE
1716#define PUT_UINT64_LE(n,b,i) \
1717{ \
1718 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1719 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1720 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1721 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1722 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1723 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1724 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1725 (b)[(i) ] = (unsigned char) ( (n) ); \
1726}
1727#endif
1728
1729typedef unsigned char mbedtls_be128[16];
1730
1731/*
1732 * GF(2^128) multiplication function
1733 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001734 * This function multiplies a field element by x in the polynomial field
1735 * representation. It uses 64-bit word operations to gain speed but compensates
1736 * for machine endianess and hence works correctly on both big and little
1737 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001738 */
1739static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001740 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001741{
1742 uint64_t a, b, ra, rb;
1743
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001744 GET_UINT64_LE( a, x, 0 );
1745 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001746
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001747 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1748 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001749
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001750 PUT_UINT64_LE( ra, r, 0 );
1751 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001752}
1753
Aorimn5f778012016-06-09 23:22:58 +02001754/*
1755 * AES-XTS buffer encryption/decryption
1756 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001757int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1758 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001759 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001760 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001761 const unsigned char *input,
1762 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001763{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001764 int ret;
1765 size_t blocks = length / 16;
1766 size_t leftover = length % 16;
1767 unsigned char tweak[16];
1768 unsigned char prev_tweak[16];
1769 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001770
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001771 AES_VALIDATE_RET( ctx != NULL );
1772 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1773 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001774 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001775 AES_VALIDATE_RET( input != NULL );
1776 AES_VALIDATE_RET( output != NULL );
1777
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001778 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001779 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001780 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001781
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001782 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001783 if( length > ( 1 << 20 ) * 16 )
1784 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001785
Jaeden Amerod82cd862018-04-28 15:02:45 +01001786 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001787 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1788 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001789 if( ret != 0 )
1790 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001791
Jaeden Amerod82cd862018-04-28 15:02:45 +01001792 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001793 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001794 size_t i;
1795
1796 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1797 {
1798 /* We are on the last block in a decrypt operation that has
1799 * leftover bytes, so we need to use the next tweak for this block,
1800 * and this tweak for the lefover bytes. Save the current tweak for
1801 * the leftovers and then update the current tweak for use on this,
1802 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001803 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001804 mbedtls_gf128mul_x_ble( tweak, tweak );
1805 }
1806
1807 for( i = 0; i < 16; i++ )
1808 tmp[i] = input[i] ^ tweak[i];
1809
1810 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1811 if( ret != 0 )
1812 return( ret );
1813
1814 for( i = 0; i < 16; i++ )
1815 output[i] = tmp[i] ^ tweak[i];
1816
1817 /* Update the tweak for the next block. */
1818 mbedtls_gf128mul_x_ble( tweak, tweak );
1819
1820 output += 16;
1821 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001822 }
1823
Jaeden Amerod82cd862018-04-28 15:02:45 +01001824 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001825 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001826 /* If we are on the leftover bytes in a decrypt operation, we need to
1827 * use the previous tweak for these bytes (as saved in prev_tweak). */
1828 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001829
Jaeden Amerod82cd862018-04-28 15:02:45 +01001830 /* We are now on the final part of the data unit, which doesn't divide
1831 * evenly by 16. It's time for ciphertext stealing. */
1832 size_t i;
1833 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001834
Jaeden Amerod82cd862018-04-28 15:02:45 +01001835 /* Copy ciphertext bytes from the previous block to our output for each
1836 * byte of cyphertext we won't steal. At the same time, copy the
1837 * remainder of the input for this final round (since the loop bounds
1838 * are the same). */
1839 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001840 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001841 output[i] = prev_output[i];
1842 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001843 }
Aorimn5f778012016-06-09 23:22:58 +02001844
Jaeden Amerod82cd862018-04-28 15:02:45 +01001845 /* Copy ciphertext bytes from the previous block for input in this
1846 * round. */
1847 for( ; i < 16; i++ )
1848 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001849
Jaeden Amerod82cd862018-04-28 15:02:45 +01001850 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1851 if( ret != 0 )
1852 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001853
Jaeden Amerod82cd862018-04-28 15:02:45 +01001854 /* Write the result back to the previous block, overriding the previous
1855 * output we copied. */
1856 for( i = 0; i < 16; i++ )
1857 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001858 }
1859
1860 return( 0 );
1861}
1862#endif /* MBEDTLS_CIPHER_MODE_XTS */
1863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001865/*
1866 * AES-CFB128 buffer encryption/decryption
1867 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001868int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001869 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001870 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001871 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001872 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001873 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001874 unsigned char *output )
1875{
Paul Bakker27fdf462011-06-09 13:55:13 +00001876 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001877 size_t n;
1878
1879 AES_VALIDATE_RET( ctx != NULL );
1880 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1881 mode == MBEDTLS_AES_DECRYPT );
1882 AES_VALIDATE_RET( iv_off != NULL );
1883 AES_VALIDATE_RET( iv != NULL );
1884 AES_VALIDATE_RET( input != NULL );
1885 AES_VALIDATE_RET( output != NULL );
1886
1887 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001888
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001889 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001890 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001892 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001893 {
1894 while( length-- )
1895 {
1896 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001897 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001898
1899 c = *input++;
1900 *output++ = (unsigned char)( c ^ iv[n] );
1901 iv[n] = (unsigned char) c;
1902
Paul Bakker66d5d072014-06-17 16:39:18 +02001903 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001904 }
1905 }
1906 else
1907 {
1908 while( length-- )
1909 {
1910 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001911 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001912
1913 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1914
Paul Bakker66d5d072014-06-17 16:39:18 +02001915 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001916 }
1917 }
1918
1919 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001920
1921 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001922}
Paul Bakker556efba2014-01-24 15:38:12 +01001923
1924/*
1925 * AES-CFB8 buffer encryption/decryption
1926 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001927int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001928 int mode,
1929 size_t length,
1930 unsigned char iv[16],
1931 const unsigned char *input,
1932 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001933{
1934 unsigned char c;
1935 unsigned char ov[17];
1936
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001937 AES_VALIDATE_RET( ctx != NULL );
1938 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1939 mode == MBEDTLS_AES_DECRYPT );
1940 AES_VALIDATE_RET( iv != NULL );
1941 AES_VALIDATE_RET( input != NULL );
1942 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001943 while( length-- )
1944 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001945 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001946 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001949 ov[16] = *input;
1950
1951 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001953 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001954 ov[16] = c;
1955
Teppo Järvelin91d79382019-10-02 09:09:31 +03001956 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001957 }
1958
1959 return( 0 );
1960}
Simon Butcher76a5b222018-04-22 22:57:27 +01001961#endif /* MBEDTLS_CIPHER_MODE_CFB */
1962
1963#if defined(MBEDTLS_CIPHER_MODE_OFB)
1964/*
1965 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1966 */
1967int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001968 size_t length,
1969 size_t *iv_off,
1970 unsigned char iv[16],
1971 const unsigned char *input,
1972 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001973{
Simon Butcherad4e4932018-04-29 00:43:47 +01001974 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001975 size_t n;
1976
1977 AES_VALIDATE_RET( ctx != NULL );
1978 AES_VALIDATE_RET( iv_off != NULL );
1979 AES_VALIDATE_RET( iv != NULL );
1980 AES_VALIDATE_RET( input != NULL );
1981 AES_VALIDATE_RET( output != NULL );
1982
1983 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001984
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001985 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001986 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1987
Simon Butcher76a5b222018-04-22 22:57:27 +01001988 while( length-- )
1989 {
1990 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001991 {
1992 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1993 if( ret != 0 )
1994 goto exit;
1995 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001996 *output++ = *input++ ^ iv[n];
1997
1998 n = ( n + 1 ) & 0x0F;
1999 }
2000
2001 *iv_off = n;
2002
Simon Butcherad4e4932018-04-29 00:43:47 +01002003exit:
2004 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002005}
2006#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002008#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002009/*
2010 * AES-CTR buffer encryption/decryption
2011 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002012int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002013 size_t length,
2014 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002015 unsigned char nonce_counter[16],
2016 unsigned char stream_block[16],
2017 const unsigned char *input,
2018 unsigned char *output )
2019{
Paul Bakker369e14b2012-04-18 14:16:09 +00002020 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002021 size_t n;
2022
2023 AES_VALIDATE_RET( ctx != NULL );
2024 AES_VALIDATE_RET( nc_off != NULL );
2025 AES_VALIDATE_RET( nonce_counter != NULL );
2026 AES_VALIDATE_RET( stream_block != NULL );
2027 AES_VALIDATE_RET( input != NULL );
2028 AES_VALIDATE_RET( output != NULL );
2029
2030 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002031
Arto Kinnunen75439012019-12-03 14:12:10 +02002032 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002033 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2034
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002035 while( length-- )
2036 {
2037 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002038 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002039
Paul Bakker369e14b2012-04-18 14:16:09 +00002040 for( i = 16; i > 0; i-- )
2041 if( ++nonce_counter[i - 1] != 0 )
2042 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002043 }
2044 c = *input++;
2045 *output++ = (unsigned char)( c ^ stream_block[n] );
2046
Paul Bakker66d5d072014-06-17 16:39:18 +02002047 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002048 }
2049
2050 *nc_off = n;
2051
2052 return( 0 );
2053}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002054#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002056#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002057
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002058#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002059/*
2060 * AES test vectors from:
2061 *
2062 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2063 */
2064static const unsigned char aes_test_ecb_dec[3][16] =
2065{
2066 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2067 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2068 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2069 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2070 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2071 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2072};
2073
2074static const unsigned char aes_test_ecb_enc[3][16] =
2075{
2076 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2077 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2078 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2079 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2080 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2081 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2082};
2083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002084#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002085static const unsigned char aes_test_cbc_dec[3][16] =
2086{
2087 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2088 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2089 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2090 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2091 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2092 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2093};
2094
2095static const unsigned char aes_test_cbc_enc[3][16] =
2096{
2097 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2098 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2099 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2100 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2101 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2102 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2103};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002106#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002107/*
2108 * AES-CFB128 test vectors from:
2109 *
2110 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2111 */
2112static const unsigned char aes_test_cfb128_key[3][32] =
2113{
2114 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2115 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2116 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2117 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2118 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2119 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2120 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2121 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2122 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2123};
2124
2125static const unsigned char aes_test_cfb128_iv[16] =
2126{
2127 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2128 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2129};
2130
2131static const unsigned char aes_test_cfb128_pt[64] =
2132{
2133 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2134 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2135 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2136 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2137 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2138 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2139 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2140 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2141};
2142
2143static const unsigned char aes_test_cfb128_ct[3][64] =
2144{
2145 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2146 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2147 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2148 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2149 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2150 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2151 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2152 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2153 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2154 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2155 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2156 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2157 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2158 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2159 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2160 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2161 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2162 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2163 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2164 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2165 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2166 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2167 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2168 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2169};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002170#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002171
Simon Butcherad4e4932018-04-29 00:43:47 +01002172#if defined(MBEDTLS_CIPHER_MODE_OFB)
2173/*
2174 * AES-OFB test vectors from:
2175 *
Simon Butcher5db13622018-06-04 22:11:25 +01002176 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002177 */
2178static const unsigned char aes_test_ofb_key[3][32] =
2179{
2180 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2181 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2182 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2183 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2184 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2185 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2186 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2187 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2188 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2189};
2190
2191static const unsigned char aes_test_ofb_iv[16] =
2192{
2193 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2194 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2195};
2196
2197static const unsigned char aes_test_ofb_pt[64] =
2198{
2199 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2200 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2201 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2202 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2203 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2204 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2205 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2206 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2207};
2208
2209static const unsigned char aes_test_ofb_ct[3][64] =
2210{
2211 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2212 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2213 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2214 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2215 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2216 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2217 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2218 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2219 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2220 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2221 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2222 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2223 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2224 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2225 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2226 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2227 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2228 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2229 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2230 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2231 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2232 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2233 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2234 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2235};
2236#endif /* MBEDTLS_CIPHER_MODE_OFB */
2237
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002238#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002239/*
2240 * AES-CTR test vectors from:
2241 *
2242 * http://www.faqs.org/rfcs/rfc3686.html
2243 */
2244
2245static const unsigned char aes_test_ctr_key[3][16] =
2246{
2247 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2248 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2249 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2250 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2251 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2252 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2253};
2254
2255static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2256{
2257 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2259 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2260 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2261 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2262 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2263};
2264
2265static const unsigned char aes_test_ctr_pt[3][48] =
2266{
2267 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2268 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2269
2270 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2271 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2272 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2273 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
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 0x20, 0x21, 0x22, 0x23 }
2280};
2281
2282static const unsigned char aes_test_ctr_ct[3][48] =
2283{
2284 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2285 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2286 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2287 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2288 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2289 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2290 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2291 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2292 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2293 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2294 0x25, 0xB2, 0x07, 0x2F }
2295};
2296
2297static const int aes_test_ctr_len[3] =
2298 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002299#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002300
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002301#if defined(MBEDTLS_CIPHER_MODE_XTS)
2302/*
2303 * AES-XTS test vectors from:
2304 *
2305 * IEEE P1619/D16 Annex B
2306 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2307 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2308 */
2309static const unsigned char aes_test_xts_key[][32] =
2310{
2311 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2315 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2316 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2317 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2318 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2319 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2320 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2321 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2322 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2323};
2324
2325static const unsigned char aes_test_xts_pt32[][32] =
2326{
2327 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2331 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2332 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2333 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2334 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2335 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
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};
2340
2341static const unsigned char aes_test_xts_ct32[][32] =
2342{
2343 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2344 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2345 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2346 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2347 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2348 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2349 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2350 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2351 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2352 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2353 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2354 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2355};
2356
2357static const unsigned char aes_test_xts_data_unit[][16] =
2358{
2359 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2361 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2363 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2365};
2366
2367#endif /* MBEDTLS_CIPHER_MODE_XTS */
2368
Paul Bakker5121ce52009-01-03 21:22:43 +00002369/*
2370 * Checkup routine
2371 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002372int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002373{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002374 int ret = 0, i, j, u, mode;
2375 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002376 unsigned char key[32];
2377 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002378 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002379#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002380 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002381#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002382#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002383 unsigned char prv[16];
2384#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002385#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2386 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002387 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002388#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002389#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002390 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002391#endif
2392#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002393 unsigned char nonce_counter[16];
2394 unsigned char stream_block[16];
2395#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002396 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002398 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002399 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002400
2401 /*
2402 * ECB mode
2403 */
2404 for( i = 0; i < 6; i++ )
2405 {
2406 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002407 keybits = 128 + u * 64;
2408 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
2410 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002411 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2412 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002413
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002414#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2415 if( keybits > 128 )
2416 {
2417 mbedtls_printf( "skipped\n" );
2418 continue;
2419 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002420#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2421
2422#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2423 if( mode == MBEDTLS_AES_DECRYPT )
2424 {
2425 mbedtls_printf( "skipped\n" );
2426 continue;
2427 }
2428#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002429
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002430 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002431
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002432 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002433 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002434 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2435 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002436 }
2437 else
2438 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002439 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2440 aes_tests = aes_test_ecb_enc[u];
2441 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002442
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002443 /*
2444 * AES-192 is an optional feature that may be unavailable when
2445 * there is an alternative underlying implementation i.e. when
2446 * MBEDTLS_AES_ALT is defined.
2447 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002448 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002449 {
2450 mbedtls_printf( "skipped\n" );
2451 continue;
2452 }
2453 else if( ret != 0 )
2454 {
2455 goto exit;
2456 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002457
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002458 for( j = 0; j < 10000; j++ )
2459 {
2460 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2461 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002462 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002463 }
2464
2465 if( memcmp( buf, aes_tests, 16 ) != 0 )
2466 {
2467 ret = 1;
2468 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002469 }
2470
2471 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002472 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002473 }
2474
2475 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002476 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002478#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002479 /*
2480 * CBC mode
2481 */
2482 for( i = 0; i < 6; i++ )
2483 {
2484 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002485 keybits = 128 + u * 64;
2486 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002487
2488 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002489 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2490 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002491
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002492#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2493 if( keybits > 128 )
2494 {
2495 mbedtls_printf( "skipped\n" );
2496 continue;
2497 }
2498#endif
2499
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002500#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2501 if( mode == MBEDTLS_AES_DECRYPT )
2502 {
2503 mbedtls_printf( "skipped\n" );
2504 continue;
2505 }
2506#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2507
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002508 memset( iv , 0, 16 );
2509 memset( prv, 0, 16 );
2510 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002511
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002512 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002513 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002514 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2515 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002516 }
2517 else
2518 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002519 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2520 aes_tests = aes_test_cbc_enc[u];
2521 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002522
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002523 /*
2524 * AES-192 is an optional feature that may be unavailable when
2525 * there is an alternative underlying implementation i.e. when
2526 * MBEDTLS_AES_ALT is defined.
2527 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002528 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002529 {
2530 mbedtls_printf( "skipped\n" );
2531 continue;
2532 }
2533 else if( ret != 0 )
2534 {
2535 goto exit;
2536 }
2537
2538 for( j = 0; j < 10000; j++ )
2539 {
2540 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002541 {
2542 unsigned char tmp[16];
2543
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002544 memcpy( tmp, prv, 16 );
2545 memcpy( prv, buf, 16 );
2546 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002547 }
2548
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002549 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2550 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002551 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002552
2553 }
2554
2555 if( memcmp( buf, aes_tests, 16 ) != 0 )
2556 {
2557 ret = 1;
2558 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002559 }
2560
2561 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002562 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002563 }
2564
2565 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002566 mbedtls_printf( "\n" );
2567#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002569#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002570 /*
2571 * CFB128 mode
2572 */
2573 for( i = 0; i < 6; i++ )
2574 {
2575 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002576 keybits = 128 + u * 64;
2577 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002578
2579 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002580 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2581 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002582
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002583#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2584 if( keybits > 128 )
2585 {
2586 mbedtls_printf( "skipped\n" );
2587 continue;
2588 }
2589#endif
2590
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002591#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2592 if( mode == MBEDTLS_AES_DECRYPT )
2593 {
2594 mbedtls_printf( "skipped\n" );
2595 continue;
2596 }
2597#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2598
Paul Bakker5121ce52009-01-03 21:22:43 +00002599 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002600 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002601
2602 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002603 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002604 /*
2605 * AES-192 is an optional feature that may be unavailable when
2606 * there is an alternative underlying implementation i.e. when
2607 * MBEDTLS_AES_ALT is defined.
2608 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002609 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002610 {
2611 mbedtls_printf( "skipped\n" );
2612 continue;
2613 }
2614 else if( ret != 0 )
2615 {
2616 goto exit;
2617 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002618
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002619 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002620 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002621 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002622 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002623 }
2624 else
2625 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002626 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002627 aes_tests = aes_test_cfb128_ct[u];
2628 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002629
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002630 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2631 if( ret != 0 )
2632 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002633
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002634 if( memcmp( buf, aes_tests, 64 ) != 0 )
2635 {
2636 ret = 1;
2637 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002638 }
2639
2640 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002642 }
2643
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002644 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002645 mbedtls_printf( "\n" );
2646#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002647
Simon Butcherad4e4932018-04-29 00:43:47 +01002648#if defined(MBEDTLS_CIPHER_MODE_OFB)
2649 /*
2650 * OFB mode
2651 */
2652 for( i = 0; i < 6; i++ )
2653 {
2654 u = i >> 1;
2655 keybits = 128 + u * 64;
2656 mode = i & 1;
2657
2658 if( verbose != 0 )
2659 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2660 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2661
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002662#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2663 if( keybits > 128 )
2664 {
2665 mbedtls_printf( "skipped\n" );
2666 continue;
2667 }
2668#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002669
2670#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2671 if( mode == MBEDTLS_AES_DECRYPT )
2672 {
2673 mbedtls_printf( "skipped\n" );
2674 continue;
2675 }
2676#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2677
Simon Butcherad4e4932018-04-29 00:43:47 +01002678 memcpy( iv, aes_test_ofb_iv, 16 );
2679 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2680
2681 offset = 0;
2682 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2683 /*
2684 * AES-192 is an optional feature that may be unavailable when
2685 * there is an alternative underlying implementation i.e. when
2686 * MBEDTLS_AES_ALT is defined.
2687 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002688 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002689 {
2690 mbedtls_printf( "skipped\n" );
2691 continue;
2692 }
2693 else if( ret != 0 )
2694 {
2695 goto exit;
2696 }
2697
2698 if( mode == MBEDTLS_AES_DECRYPT )
2699 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002700 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002701 aes_tests = aes_test_ofb_pt;
2702 }
2703 else
2704 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002705 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002706 aes_tests = aes_test_ofb_ct[u];
2707 }
2708
2709 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2710 if( ret != 0 )
2711 goto exit;
2712
2713 if( memcmp( buf, aes_tests, 64 ) != 0 )
2714 {
2715 ret = 1;
2716 goto exit;
2717 }
2718
2719 if( verbose != 0 )
2720 mbedtls_printf( "passed\n" );
2721 }
2722
2723 if( verbose != 0 )
2724 mbedtls_printf( "\n" );
2725#endif /* MBEDTLS_CIPHER_MODE_OFB */
2726
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002727#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002728 /*
2729 * CTR mode
2730 */
2731 for( i = 0; i < 6; i++ )
2732 {
2733 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002734 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002735
2736 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002737 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002738 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002739
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002740#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2741 if( keybits > 128 )
2742 {
2743 mbedtls_printf( "skipped\n" );
2744 continue;
2745 }
2746#endif
2747
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002748#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2749 if( mode == MBEDTLS_AES_DECRYPT )
2750 {
2751 mbedtls_printf( "skipped\n" );
2752 continue;
2753 }
2754#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2755
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002756 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2757 memcpy( key, aes_test_ctr_key[u], 16 );
2758
2759 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002760 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2761 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002762
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002763 len = aes_test_ctr_len[u];
2764
2765 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002766 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002767 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002768 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002769 }
2770 else
2771 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002772 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002773 aes_tests = aes_test_ctr_ct[u];
2774 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002775
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002776 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2777 stream_block, buf, buf );
2778 if( ret != 0 )
2779 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002780
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002781 if( memcmp( buf, aes_tests, len ) != 0 )
2782 {
2783 ret = 1;
2784 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002785 }
2786
2787 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002788 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002789 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002790
2791 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002792 mbedtls_printf( "\n" );
2793#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002794
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002795#if defined(MBEDTLS_CIPHER_MODE_XTS)
2796 {
2797 static const int num_tests =
2798 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2799 mbedtls_aes_xts_context ctx_xts;
2800
2801 /*
2802 * XTS mode
2803 */
2804 mbedtls_aes_xts_init( &ctx_xts );
2805
2806 for( i = 0; i < num_tests << 1; i++ )
2807 {
2808 const unsigned char *data_unit;
2809 u = i >> 1;
2810 mode = i & 1;
2811
2812 if( verbose != 0 )
2813 mbedtls_printf( " AES-XTS-128 (%s): ",
2814 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2815
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002816#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2817 if( mode == MBEDTLS_AES_DECRYPT )
2818 {
2819 mbedtls_printf( "skipped\n" );
2820 continue;
2821 }
2822#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2823
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002824 memset( key, 0, sizeof( key ) );
2825 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002826 data_unit = aes_test_xts_data_unit[u];
2827
2828 len = sizeof( *aes_test_xts_ct32 );
2829
2830 if( mode == MBEDTLS_AES_DECRYPT )
2831 {
2832 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2833 if( ret != 0)
2834 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002835 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002836 aes_tests = aes_test_xts_pt32[u];
2837 }
2838 else
2839 {
2840 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2841 if( ret != 0)
2842 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002843 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002844 aes_tests = aes_test_xts_ct32[u];
2845 }
2846
2847
2848 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2849 buf, buf );
2850 if( ret != 0 )
2851 goto exit;
2852
2853 if( memcmp( buf, aes_tests, len ) != 0 )
2854 {
2855 ret = 1;
2856 goto exit;
2857 }
2858
2859 if( verbose != 0 )
2860 mbedtls_printf( "passed\n" );
2861 }
2862
2863 if( verbose != 0 )
2864 mbedtls_printf( "\n" );
2865
2866 mbedtls_aes_xts_free( &ctx_xts );
2867 }
2868#endif /* MBEDTLS_CIPHER_MODE_XTS */
2869
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002870 ret = 0;
2871
2872exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002873 if( ret != 0 && verbose != 0 )
2874 mbedtls_printf( "failed\n" );
2875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002876 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002877
2878 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002879}
2880
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002881#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002882
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002883#endif /* MBEDTLS_AES_C */