blob: 03dabd8b53669236f1baf5b625f9656b8b88ed53 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
23 *
24 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
25 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Rich Evans00ab4702015-02-06 13:43:58 +000036#include <string.h>
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030039#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050040#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_SELF_TEST)
49#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#else
Rich Evans00ab4702015-02-06 13:43:58 +000052#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#define mbedtls_printf printf
54#endif /* MBEDTLS_PLATFORM_C */
55#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010059/* Parameter validation macros based on platform_util.h */
60#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010061 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010062#define AES_VALIDATE( cond ) \
63 MBEDTLS_INTERNAL_VALIDATE( cond )
64
Paul Bakker5121ce52009-01-03 21:22:43 +000065/*
66 * 32-bit integer manipulation macros (little endian)
67 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef GET_UINT32_LE
69#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000071 (n) = ( (uint32_t) (b)[(i) ] ) \
72 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
73 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
74 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
76#endif
77
Paul Bakker5c2364c2012-10-01 14:41:15 +000078#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000079#define PUT_UINT32_LE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
82 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
83 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
84 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000085}
86#endif
87
Arto Kinnunen172836a2019-11-28 13:34:13 +020088/*
89 * Data structure for AES round data
90 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020091typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020092 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020093 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020094} aes_r_data_t;
95
96#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen17540ab2020-01-20 11:46:34 +020097/* Number of additional AES dummy rounds added for SCA countermeasures */
Arto Kinnunen98c93af2020-01-14 13:31:03 +020098#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +020099#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101#if defined(MBEDTLS_PADLOCK_C) && \
102 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000103static int aes_padlock_ace = -1;
104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000107/*
108 * Forward S-box
109 */
110static const unsigned char FSb[256] =
111{
112 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
113 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
114 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
115 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
116 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
117 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
118 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
119 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
120 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
121 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
122 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
123 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
124 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
125 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
126 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
127 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
128 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
129 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
130 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
131 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
132 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
133 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
134 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
135 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
136 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
137 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
138 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
139 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
140 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
141 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
142 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
143 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
144};
145
146/*
147 * Forward tables
148 */
149#define FT \
150\
151 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
152 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
153 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
154 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
155 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
156 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
157 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
158 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
159 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
160 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
161 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
162 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
163 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
164 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
165 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
166 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
167 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
168 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
169 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
170 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
171 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
172 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
173 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
174 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
175 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
176 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
177 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
178 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
179 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
180 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
181 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
182 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
183 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
184 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
185 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
186 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
187 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
188 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
189 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
190 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
191 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
192 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
193 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
194 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
195 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
196 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
197 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
198 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
199 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
200 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
201 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
202 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
203 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
204 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
205 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
206 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
207 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
208 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
209 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
210 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
211 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
212 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
213 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
214 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
215
216#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000217static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000218#undef V
219
Hanno Beckerad049a92017-06-19 16:31:54 +0100220#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200221
Paul Bakker5121ce52009-01-03 21:22:43 +0000222#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000223static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#undef V
225
226#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000227static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000228#undef V
229
230#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000231static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000232#undef V
233
Hanno Becker177d3cf2017-06-07 15:52:48 +0100234#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200235
Paul Bakker5121ce52009-01-03 21:22:43 +0000236#undef FT
237
Arto Kinnunen14804442019-10-16 13:43:59 +0300238#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000239/*
240 * Reverse S-box
241 */
242static const unsigned char RSb[256] =
243{
244 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
245 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
246 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
247 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
248 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
249 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
250 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
251 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
252 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
253 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
254 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
255 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
256 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
257 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
258 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
259 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
260 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
261 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
262 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
263 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
264 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
265 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
266 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
267 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
268 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
269 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
270 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
271 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
272 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
273 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
274 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
275 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
276};
Arto Kinnunen14804442019-10-16 13:43:59 +0300277#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
279/*
280 * Reverse tables
281 */
282#define RT \
283\
284 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
285 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
286 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
287 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
288 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
289 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
290 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
291 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
292 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
293 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
294 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
295 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
296 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
297 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
298 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
299 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
300 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
301 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
302 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
303 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
304 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
305 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
306 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
307 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
308 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
309 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
310 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
311 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
312 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
313 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
314 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
315 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
316 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
317 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
318 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
319 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
320 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
321 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
322 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
323 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
324 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
325 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
326 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
327 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
328 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
329 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
330 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
331 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
332 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
333 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
334 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
335 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
336 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
337 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
338 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
339 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
340 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
341 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
342 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
343 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
344 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
345 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
346 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
347 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
348
Arto Kinnunen14804442019-10-16 13:43:59 +0300349#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000350#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000351static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#undef V
353
Hanno Beckerad049a92017-06-19 16:31:54 +0100354#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#undef V
359
360#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000362#undef V
363
364#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000365static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000366#undef V
367
Hanno Becker177d3cf2017-06-07 15:52:48 +0100368#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300369#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200370
Paul Bakker5121ce52009-01-03 21:22:43 +0000371#undef RT
372
373/*
374 * Round constants
375 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000376static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
378 0x00000001, 0x00000002, 0x00000004, 0x00000008,
379 0x00000010, 0x00000020, 0x00000040, 0x00000080,
380 0x0000001B, 0x00000036
381};
382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385/*
386 * Forward S-box & tables
387 */
388static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200389static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100390#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT1[256];
392static uint32_t FT2[256];
393static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100394#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
396/*
397 * Reverse S-box & tables
398 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300399#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000400static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100402#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT1[256];
404static uint32_t RT2[256];
405static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100406#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300407#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
409/*
410 * Round constants
411 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000412static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000413
414/*
415 * Tables generation code
416 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100417#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
418#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100419#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
421static int aes_init_done = 0;
422
423static void aes_gen_tables( void )
424{
425 int i, x, y, z;
426 int pow[256];
427 int log[256];
428
429 /*
430 * compute pow and log tables over GF(2^8)
431 */
432 for( i = 0, x = 1; i < 256; i++ )
433 {
434 pow[i] = x;
435 log[x] = i;
436 x = ( x ^ XTIME( x ) ) & 0xFF;
437 }
438
439 /*
440 * calculate the round constants
441 */
442 for( i = 0, x = 1; i < 10; i++ )
443 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000444 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 x = XTIME( x ) & 0xFF;
446 }
447
448 /*
449 * generate the forward and reverse S-boxes
450 */
451 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300452#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000455
456 for( i = 1; i < 256; i++ )
457 {
458 x = pow[255 - log[i]];
459
Paul Bakker66d5d072014-06-17 16:39:18 +0200460 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
461 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
462 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 x ^= y ^ 0x63;
465
466 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300467#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 }
471
472 /*
473 * generate the forward and reverse tables
474 */
475 for( i = 0; i < 256; i++ )
476 {
477 x = FSb[i];
478 y = XTIME( x ) & 0xFF;
479 z = ( y ^ x ) & 0xFF;
480
Paul Bakker5c2364c2012-10-01 14:41:15 +0000481 FT0[i] = ( (uint32_t) y ) ^
482 ( (uint32_t) x << 8 ) ^
483 ( (uint32_t) x << 16 ) ^
484 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
Hanno Beckerad049a92017-06-19 16:31:54 +0100486#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 FT1[i] = ROTL8( FT0[i] );
488 FT2[i] = ROTL8( FT1[i] );
489 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100490#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300492#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000493 x = RSb[i];
494
Paul Bakker5c2364c2012-10-01 14:41:15 +0000495 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
496 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
497 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
498 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
Hanno Beckerad049a92017-06-19 16:31:54 +0100500#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000501 RT1[i] = ROTL8( RT0[i] );
502 RT2[i] = ROTL8( RT1[i] );
503 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100504#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300505#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 }
507}
508
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200509#undef ROTL8
510
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Arto Kinnunen172836a2019-11-28 13:34:13 +0200513/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200514 * Randomize positions for AES SCA countermeasures if AES countermeasures are
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200515 * enabled. If the countermeasures are not enabled then we fill the given table
516 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200517 *
518 * Dummy rounds are added as follows:
519 * 1. One dummy round added to the initial round key addition (executed in
520 * random order).
521 * 2. Random number of dummy rounds added as first and/or last AES calculation
522 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
523 *
524 * Description of the bytes in the table are as follows:
525 * - 2 bytes for initial round key addition
526 * - remaining bytes for AES calculation with real or dummy data
527 *
528 * Each byte indicates one AES calculation round:
529 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
530 * -bit 2 = offset for even/odd rounds
531 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200532 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200533 * Return Number of additional AES rounds
534 *
535 * Example of the control bytes:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200536 * R = real data in actual AES calculation round
537 * Ri = Real data in initial round key addition phase
538 * F = fake data in actual AES calculation round
539 * Fi = fake data in initial round key addition phase
540 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200541 * 1. No countermeasures enabled and AES-128, only real data (R) used:
542 * | Ri | R | R | R | R | R | R | R | R | R | R |
543 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200544 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200545 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200546 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
547 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200548 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200549#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200550static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200551{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200552 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200553
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200554 mbedtls_platform_memset( tbl, 0, tbl_len );
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400555 // get random from 0x0fff
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200556 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200557
558 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200559 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200560 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561 tbl[i++] = 0x10; // dummy data
562 tbl[i++] = 0x00 | 0x03; // real data + stop marker
563 } else {
564 tbl[i++] = 0x00; // real data
565 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200568 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200569 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200570 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200571
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 // randomize positions for the dummy rounds
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400573 num = ( num & 0x0fff ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200574
575 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200577 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200579 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200580
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200581 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200582 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200583 {
584 tbl[j] = 0x10; // dummy data
585 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200586
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200587 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200588 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200591 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200593 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200595 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 is_even_pos = 0;
597 }
598 else
599 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200600 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200601 is_even_pos = 1;
602 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200603 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200604 }
605 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200606
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200607 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
608 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
609
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200610 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200611}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200612#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200613
Hanno Beckerad049a92017-06-19 16:31:54 +0100614#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200615
616#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
617#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
618#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
619
620#define AES_RT0(idx) RT0[idx]
621#define AES_RT1(idx) ROTL8( RT0[idx] )
622#define AES_RT2(idx) ROTL16( RT0[idx] )
623#define AES_RT3(idx) ROTL24( RT0[idx] )
624
625#define AES_FT0(idx) FT0[idx]
626#define AES_FT1(idx) ROTL8( FT0[idx] )
627#define AES_FT2(idx) ROTL16( FT0[idx] )
628#define AES_FT3(idx) ROTL24( FT0[idx] )
629
Hanno Becker177d3cf2017-06-07 15:52:48 +0100630#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200631
632#define AES_RT0(idx) RT0[idx]
633#define AES_RT1(idx) RT1[idx]
634#define AES_RT2(idx) RT2[idx]
635#define AES_RT3(idx) RT3[idx]
636
637#define AES_FT0(idx) FT0[idx]
638#define AES_FT1(idx) FT1[idx]
639#define AES_FT2(idx) FT2[idx]
640#define AES_FT3(idx) FT3[idx]
641
Hanno Becker177d3cf2017-06-07 15:52:48 +0100642#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200645{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100646 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000647
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200648 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649}
650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200652{
653 if( ctx == NULL )
654 return;
655
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500656 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200657}
658
Jaeden Amero9366feb2018-05-29 18:55:17 +0100659#if defined(MBEDTLS_CIPHER_MODE_XTS)
660void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
661{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100662 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000663
Jaeden Amero9366feb2018-05-29 18:55:17 +0100664 mbedtls_aes_init( &ctx->crypt );
665 mbedtls_aes_init( &ctx->tweak );
666}
667
668void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
669{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100670 if( ctx == NULL )
671 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000672
Jaeden Amero9366feb2018-05-29 18:55:17 +0100673 mbedtls_aes_free( &ctx->crypt );
674 mbedtls_aes_free( &ctx->tweak );
675}
676#endif /* MBEDTLS_CIPHER_MODE_XTS */
677
Andrzej Kureke78775e2020-07-02 10:57:00 -0400678static void mbedtls_generate_fake_key( unsigned int keybits, mbedtls_aes_context *ctx )
679{
680 unsigned int qword;
681
682 for( qword = keybits >> 5; qword > 0; qword-- )
683 {
684 ctx->frk[ qword - 1 ] = mbedtls_platform_random_uint32();
685 }
686}
687
Paul Bakker5121ce52009-01-03 21:22:43 +0000688/*
689 * AES key schedule (encryption)
690 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200691#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200693 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000694{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200695 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200696 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200697 volatile unsigned int i = 0;
698 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000699 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200700 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000701
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100702 AES_VALIDATE_RET( ctx != NULL );
703 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000704
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200705 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000706 {
707 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300708#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000709 case 192: ctx->nr = 12; break;
710 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300711#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000713 }
714
Simon Butcher5201e412018-12-06 17:40:14 +0000715#if !defined(MBEDTLS_AES_ROM_TABLES)
716 if( aes_init_done == 0 )
717 {
718 aes_gen_tables();
719 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000720 }
721#endif
722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000724 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100725 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000726
727 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200728 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000729 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000730#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000731 ctx->rk = RK = ctx->buf;
Andrzej Kureke78775e2020-07-02 10:57:00 -0400732 mbedtls_generate_fake_key( keybits, ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200734#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100735 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200736 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100737#endif
738
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400739 /* Three least significant bits are truncated from keybits, which is
740 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400741 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200742 offset = mbedtls_platform_random_in_range( keybits >> 5 );
743
744 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000745 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200746 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200747 flow_ctrl++;
748 }
749
750 for( j = 0; j < offset; j++ )
751 {
752 GET_UINT32_LE( RK[j], key, j << 2 );
753 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000754 }
755
756 switch( ctx->nr )
757 {
758 case 10:
759
760 for( i = 0; i < 10; i++, RK += 4 )
761 {
762 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000763 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
764 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
765 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
766 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000767
768 RK[5] = RK[1] ^ RK[4];
769 RK[6] = RK[2] ^ RK[5];
770 RK[7] = RK[3] ^ RK[6];
771 }
772 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300773#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000774 case 12:
775
776 for( i = 0; i < 8; i++, RK += 6 )
777 {
778 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000779 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
780 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
781 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
782 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000783
784 RK[7] = RK[1] ^ RK[6];
785 RK[8] = RK[2] ^ RK[7];
786 RK[9] = RK[3] ^ RK[8];
787 RK[10] = RK[4] ^ RK[9];
788 RK[11] = RK[5] ^ RK[10];
789 }
790 break;
791
792 case 14:
793
794 for( i = 0; i < 7; i++, RK += 8 )
795 {
796 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000797 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
798 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
799 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
800 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000801
802 RK[9] = RK[1] ^ RK[8];
803 RK[10] = RK[2] ^ RK[9];
804 RK[11] = RK[3] ^ RK[10];
805
806 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000807 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
808 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
809 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
810 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000811
812 RK[13] = RK[5] ^ RK[12];
813 RK[14] = RK[6] ^ RK[13];
814 RK[15] = RK[7] ^ RK[14];
815 }
816 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300817#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000818 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000819
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200820 ret = 0;
821
822 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200823 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200824#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
825 || ( ctx->nr == 12 && i == 8 )
826 || ( ctx->nr == 14 && i == 7 )
827#endif
828 ) )
829 {
Andrzej Kurekafec8852020-07-15 16:31:27 -0400830 return ret;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200831 }
832
Andrzej Kurekca609372020-07-08 03:19:02 -0400833 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200834 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000835}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200836#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000837
838/*
839 * AES key schedule (decryption)
840 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200841#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200843 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000844{
Arto Kinnunen14804442019-10-16 13:43:59 +0300845#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
846 (void) ctx;
847 (void) key;
848 (void) keybits;
849
850 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
851#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200852 volatile unsigned int i = 0, j = 0;
853 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000855 uint32_t *RK;
856 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200857
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100858 AES_VALIDATE_RET( ctx != NULL );
859 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000862
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000864 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100865 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000866
867 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000869 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000870#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000871 ctx->rk = RK = ctx->buf;
Andrzej Kureke78775e2020-07-02 10:57:00 -0400872 mbedtls_generate_fake_key( keybits, ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000873
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200874 /* Also checks keybits */
875 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200876 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000877
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200878 ctx->nr = cty.nr;
879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200880#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100881 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100882 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200883 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100884 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200885 i = 0;
886 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200887 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100888 }
889#endif
890
Paul Bakker5121ce52009-01-03 21:22:43 +0000891 SK = cty.rk + cty.nr * 4;
892
893 *RK++ = *SK++;
894 *RK++ = *SK++;
895 *RK++ = *SK++;
896 *RK++ = *SK++;
897
898 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
899 {
900 for( j = 0; j < 4; j++, SK++ )
901 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200902 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
903 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
904 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
905 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000906 }
907 }
908
909 *RK++ = *SK++;
910 *RK++ = *SK++;
911 *RK++ = *SK++;
912 *RK++ = *SK++;
913
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200914exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000916
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200917 if( ret != 0 )
918 {
919 return( ret );
920 }
921 else if( ( i == 0 ) && ( j == 4 ) )
922 {
923 return( ret );
924 }
925 else
926 {
927 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
928 }
929
Arto Kinnunen14804442019-10-16 13:43:59 +0300930#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000931}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100932
933#if defined(MBEDTLS_CIPHER_MODE_XTS)
934static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
935 unsigned int keybits,
936 const unsigned char **key1,
937 unsigned int *key1bits,
938 const unsigned char **key2,
939 unsigned int *key2bits )
940{
941 const unsigned int half_keybits = keybits / 2;
942 const unsigned int half_keybytes = half_keybits / 8;
943
944 switch( keybits )
945 {
946 case 256: break;
947 case 512: break;
948 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
949 }
950
951 *key1bits = half_keybits;
952 *key2bits = half_keybits;
953 *key1 = &key[0];
954 *key2 = &key[half_keybytes];
955
956 return 0;
957}
958
959int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
960 const unsigned char *key,
961 unsigned int keybits)
962{
963 int ret;
964 const unsigned char *key1, *key2;
965 unsigned int key1bits, key2bits;
966
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100967 AES_VALIDATE_RET( ctx != NULL );
968 AES_VALIDATE_RET( key != NULL );
969
Jaeden Amero9366feb2018-05-29 18:55:17 +0100970 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
971 &key2, &key2bits );
972 if( ret != 0 )
973 return( ret );
974
975 /* Set the tweak key. Always set tweak key for the encryption mode. */
976 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
977 if( ret != 0 )
978 return( ret );
979
980 /* Set crypt key for encryption. */
981 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
982}
983
984int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
985 const unsigned char *key,
986 unsigned int keybits)
987{
988 int ret;
989 const unsigned char *key1, *key2;
990 unsigned int key1bits, key2bits;
991
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100992 AES_VALIDATE_RET( ctx != NULL );
993 AES_VALIDATE_RET( key != NULL );
994
Jaeden Amero9366feb2018-05-29 18:55:17 +0100995 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
996 &key2, &key2bits );
997 if( ret != 0 )
998 return( ret );
999
1000 /* Set the tweak key. Always set tweak key for encryption. */
1001 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
1002 if( ret != 0 )
1003 return( ret );
1004
1005 /* Set crypt key for decryption. */
1006 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
1007}
1008#endif /* MBEDTLS_CIPHER_MODE_XTS */
1009
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001010#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001011
Paul Bakker5121ce52009-01-03 21:22:43 +00001012/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001013 * AES-ECB block encryption
1014 */
1015#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001016
Arto Kinnunen311ab592020-01-16 17:20:51 +02001017#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001018static uint32_t *aes_fround( uint32_t *R,
1019 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1020 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1021{
1022 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1023 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1024 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1025 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1026
1027 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1028 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1029 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1030 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1031
1032 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1033 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1034 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1035 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1036
1037 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1038 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1039 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1040 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1041
1042 return R;
1043}
1044
1045static void aes_fround_final( uint32_t *R,
1046 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1047 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1048{
1049 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1050 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1051 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1052 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1053
1054 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1055 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1056 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1057 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1058
1059 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1060 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1061 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1062 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1063
1064 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1065 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1066 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1067 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1068}
1069
Andres AGf5bf7182017-03-03 14:09:56 +00001070int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1071 const unsigned char input[16],
1072 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001073{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001074 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001075 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001076 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001077 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001078 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001079 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001080 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001081 // control bytes for AES calculation rounds,
1082 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1083 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001084
Arto Kinnunen172836a2019-11-28 13:34:13 +02001085 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001086 aes_data_fake.rk_ptr = ctx->frk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001087 aes_data_table[0] = &aes_data_real;
1088 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001089
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001090 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001091 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1092 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001093 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001094
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001095 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001096 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001097
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001098 // SCA countermeasure, randomize secret data location by initializing it in
1099 // a random order and writing randomized fake data between the real data
1100 // writes.
1101 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001102 i = offset;
1103 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001104 {
1105 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001106 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001107 flow_control++;
1108 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001109
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001110 tindex = 0;
1111 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001112 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001113 // Get pointer to the real or fake data
1114 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1115 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001116
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001117 // initial round key addition
1118 for( i = 0; i < 4; i++ )
1119 {
1120 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1121 }
1122 tindex++;
1123 flow_control++;
1124 } while( stop_mark == 0 );
1125
1126 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1127 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001128 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001129 // Get pointer to the real or fake data
1130 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1131 offset = round_ctrl_table[tindex] & 0x04;
1132 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001133
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001134 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1135 &aes_data_ptr->xy_values[0 + offset],
1136 &aes_data_ptr->xy_values[1 + offset],
1137 &aes_data_ptr->xy_values[2 + offset],
1138 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001139 aes_data_ptr->xy_values[4 - offset],
1140 aes_data_ptr->xy_values[5 - offset],
1141 aes_data_ptr->xy_values[6 - offset],
1142 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001143 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001144 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001145 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001146
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001147 // Calculate final AES round + dummy rounds
1148 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001149 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001150 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1151 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001152 aes_fround_final( aes_data_ptr->rk_ptr,
1153 &aes_data_ptr->xy_values[0],
1154 &aes_data_ptr->xy_values[1],
1155 &aes_data_ptr->xy_values[2],
1156 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001157 aes_data_ptr->xy_values[4],
1158 aes_data_ptr->xy_values[5],
1159 aes_data_ptr->xy_values[6],
1160 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001161 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001162 tindex++;
1163 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001164
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001165 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001166 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001167
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001168 // SCA countermeasure, randomize secret data location by writing to it in
1169 // a random order.
1170 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001171 i = offset;
1172 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001173 {
1174 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1175 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001176 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001177
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001178 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001179 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001180 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001181 }
1182
Andrzej Kurekca609372020-07-08 03:19:02 -04001183 // Clear the output in case of a FI
1184 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001185 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001186}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001187
1188#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1189
1190#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1191 do \
1192 { \
1193 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1194 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1195 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1196 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1197 \
1198 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1199 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1200 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1201 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1202 \
1203 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1204 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1205 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1206 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1207 \
1208 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1209 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1210 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1211 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1212 } while( 0 )
1213
1214int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1215 const unsigned char input[16],
1216 unsigned char output[16] )
1217{
1218 int i;
1219 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1220
1221 RK = ctx->rk;
1222
1223 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1224 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1225 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1226 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1227
1228 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1229 {
1230 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1231 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1232 }
1233
1234 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1235
1236 X0 = *RK++ ^ \
1237 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1238 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1239 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1240 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1241
1242 X1 = *RK++ ^ \
1243 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1244 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1245 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1246 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1247
1248 X2 = *RK++ ^ \
1249 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1250 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1251 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1252 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1253
1254 X3 = *RK++ ^ \
1255 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1256 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1257 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1258 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1259
1260 PUT_UINT32_LE( X0, output, 0 );
1261 PUT_UINT32_LE( X1, output, 4 );
1262 PUT_UINT32_LE( X2, output, 8 );
1263 PUT_UINT32_LE( X3, output, 12 );
1264
Andrzej Kureka8405442019-11-12 03:34:03 -05001265 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1266 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1267 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1268 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1269
1270 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1271 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1272 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1273 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1274
1275 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1276
Arto Kinnunen311ab592020-01-16 17:20:51 +02001277 return( 0 );
1278}
1279#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001280#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1281
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001282#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001283void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1284 const unsigned char input[16],
1285 unsigned char output[16] )
1286{
1287 mbedtls_internal_aes_encrypt( ctx, input, output );
1288}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001289#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001290
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001291/*
1292 * AES-ECB block decryption
1293 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001294
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001295#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001296#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001297
Arto Kinnunen311ab592020-01-16 17:20:51 +02001298#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001299static uint32_t *aes_rround( uint32_t *R,
1300 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1301 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1302{
1303 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1304 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1305 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1306 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1307
1308 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1309 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1310 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1311 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1312
1313 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1314 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1315 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1316 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1317
1318 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1319 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1320 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1321 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1322 return R;
1323}
1324
1325static void aes_rround_final( uint32_t *R,
1326 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1327 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1328{
1329 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1330 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1331 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1332 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1333
1334 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1335 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1336 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1337 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1338
1339 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1340 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1341 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1342 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1343
1344 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1345 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1346 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1347 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1348}
1349
Andres AGf5bf7182017-03-03 14:09:56 +00001350int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1351 const unsigned char input[16],
1352 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001353{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001354 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001355 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001356 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001357 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001358 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001359 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001360 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001361 // control bytes for AES calculation rounds,
1362 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1363 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001364
Arto Kinnunen172836a2019-11-28 13:34:13 +02001365 aes_data_real.rk_ptr = ctx->rk;
Andrzej Kureke78775e2020-07-02 10:57:00 -04001366 aes_data_fake.rk_ptr = ctx->frk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001367 aes_data_table[0] = &aes_data_real;
1368 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001369
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001370 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001371 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001372 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001373 flow_control = dummy_rounds;
1374
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001375 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001376 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001377
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001378 // SCA countermeasure, randomize secret data location by initializing it in
1379 // a random order and writing randomized fake data between the real data
1380 // writes.
1381 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001382 i = offset;
1383 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001384 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001385 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001386 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001387 flow_control++;
1388 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001389
1390 tindex = 0;
1391 do
1392 {
1393 // Get pointer to the real or fake data
1394 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1395 stop_mark = round_ctrl_table[tindex] & 0x03;
1396
1397 // initial round key addition
1398 for( i = 0; i < 4; i++ )
1399 {
1400 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1401 }
1402 tindex++;
1403 flow_control++;
1404 } while( stop_mark == 0 );
1405
1406 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1407 do
1408 {
1409 // Get pointer to the real or fake data
1410 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1411 offset = round_ctrl_table[tindex] & 0x04;
1412 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001413
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001414 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1415 &aes_data_ptr->xy_values[0 + offset],
1416 &aes_data_ptr->xy_values[1 + offset],
1417 &aes_data_ptr->xy_values[2 + offset],
1418 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001419 aes_data_ptr->xy_values[4 - offset],
1420 aes_data_ptr->xy_values[5 - offset],
1421 aes_data_ptr->xy_values[6 - offset],
1422 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001423 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001424 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001425 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001426
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001427 // Calculate final AES round + dummy rounds
1428 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001429 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001430 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1431 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001432 aes_rround_final( aes_data_ptr->rk_ptr,
1433 &aes_data_ptr->xy_values[0],
1434 &aes_data_ptr->xy_values[1],
1435 &aes_data_ptr->xy_values[2],
1436 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001437 aes_data_ptr->xy_values[4],
1438 aes_data_ptr->xy_values[5],
1439 aes_data_ptr->xy_values[6],
1440 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001441 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001442 tindex++;
1443 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001444
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001445 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001446 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001447
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001448 // SCA countermeasure, randomize secret data location by writing to it in
1449 // a random order.
1450 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001451 i = offset;
1452 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001453 {
1454 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001455 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001456 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001457
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001458 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001459 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001460 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001461 }
1462
Andrzej Kurekca609372020-07-08 03:19:02 -04001463 // Clear the output in case of a FI
1464 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001465 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001466}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001467
1468#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1469
1470#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1471 do \
1472 { \
1473 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1474 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1475 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1476 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1477 \
1478 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1479 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1480 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1481 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1482 \
1483 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1484 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1485 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1486 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1487 \
1488 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1489 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1490 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1491 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1492 } while( 0 )
1493
1494int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1495 const unsigned char input[16],
1496 unsigned char output[16] )
1497{
1498 int i;
1499 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1500
1501 RK = ctx->rk;
1502
1503 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1504 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1505 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1506 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1507
1508 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1509 {
1510 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1511 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1512 }
1513
1514 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1515
1516 X0 = *RK++ ^ \
1517 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1518 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1519 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1520 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1521
1522 X1 = *RK++ ^ \
1523 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1524 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1525 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1526 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1527
1528 X2 = *RK++ ^ \
1529 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1530 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1531 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1532 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1533
1534 X3 = *RK++ ^ \
1535 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1536 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1537 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1538 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1539
1540 PUT_UINT32_LE( X0, output, 0 );
1541 PUT_UINT32_LE( X1, output, 4 );
1542 PUT_UINT32_LE( X2, output, 8 );
1543 PUT_UINT32_LE( X3, output, 12 );
1544
Andrzej Kureka8405442019-11-12 03:34:03 -05001545 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1546 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1547 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1548 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1549
1550 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1551 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1552 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1553 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1554
1555 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1556
Arto Kinnunen311ab592020-01-16 17:20:51 +02001557 return( 0 );
1558}
1559#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1560
Arto Kinnunen14804442019-10-16 13:43:59 +03001561#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001562#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1563
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001564#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001565void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1566 const unsigned char input[16],
1567 unsigned char output[16] )
1568{
Arto Kinnunen14804442019-10-16 13:43:59 +03001569#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1570 (void) ctx;
1571 (void) input;
1572 (void) output;
1573#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001574 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001575#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001576}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001577#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001578
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001579/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001580 * AES-ECB block encryption/decryption
1581 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001582int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001583 int mode,
1584 const unsigned char input[16],
1585 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001586{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001587 AES_VALIDATE_RET( ctx != NULL );
1588 AES_VALIDATE_RET( input != NULL );
1589 AES_VALIDATE_RET( output != NULL );
1590 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1591 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001592 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001594#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001595 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001596 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001597#endif
1598
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001599#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001600 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001601 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001603 return( 0 );
1604
1605 // If padlock data misaligned, we just fall back to
1606 // unaccelerated mode
1607 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001608 }
1609#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001610
Arto Kinnunen14804442019-10-16 13:43:59 +03001611#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1612 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1613#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001614
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001615 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001616 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001617 else
Andres AGf5bf7182017-03-03 14:09:56 +00001618 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001619#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001620}
1621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001622#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001623/*
1624 * AES-CBC buffer encryption/decryption
1625 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001626int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001627 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001628 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001629 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001630 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001631 unsigned char *output )
1632{
1633 int i;
1634 unsigned char temp[16];
1635
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001636 AES_VALIDATE_RET( ctx != NULL );
1637 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1638 mode == MBEDTLS_AES_DECRYPT );
1639 AES_VALIDATE_RET( iv != NULL );
1640 AES_VALIDATE_RET( input != NULL );
1641 AES_VALIDATE_RET( output != NULL );
1642
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001643 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001644 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001645
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001646#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001647 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001648 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001649 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001650 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001651
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001652 // If padlock data misaligned, we just fall back to
1653 // unaccelerated mode
1654 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001655 }
1656#endif
1657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001658 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001659 {
1660 while( length > 0 )
1661 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001662 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001663 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001664
1665 for( i = 0; i < 16; i++ )
1666 output[i] = (unsigned char)( output[i] ^ iv[i] );
1667
Teppo Järvelin91d79382019-10-02 09:09:31 +03001668 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001669
1670 input += 16;
1671 output += 16;
1672 length -= 16;
1673 }
1674 }
1675 else
1676 {
1677 while( length > 0 )
1678 {
1679 for( i = 0; i < 16; i++ )
1680 output[i] = (unsigned char)( input[i] ^ iv[i] );
1681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001682 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001683 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001684
1685 input += 16;
1686 output += 16;
1687 length -= 16;
1688 }
1689 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001690
1691 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001692}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001693#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001694
Aorimn5f778012016-06-09 23:22:58 +02001695#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001696
1697/* Endianess with 64 bits values */
1698#ifndef GET_UINT64_LE
1699#define GET_UINT64_LE(n,b,i) \
1700{ \
1701 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1702 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1703 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1704 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1705 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1706 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1707 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1708 | ( (uint64_t) (b)[(i) ] ); \
1709}
1710#endif
1711
1712#ifndef PUT_UINT64_LE
1713#define PUT_UINT64_LE(n,b,i) \
1714{ \
1715 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1716 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1717 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1718 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1719 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1720 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1721 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1722 (b)[(i) ] = (unsigned char) ( (n) ); \
1723}
1724#endif
1725
1726typedef unsigned char mbedtls_be128[16];
1727
1728/*
1729 * GF(2^128) multiplication function
1730 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001731 * This function multiplies a field element by x in the polynomial field
1732 * representation. It uses 64-bit word operations to gain speed but compensates
1733 * for machine endianess and hence works correctly on both big and little
1734 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001735 */
1736static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001737 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001738{
1739 uint64_t a, b, ra, rb;
1740
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001741 GET_UINT64_LE( a, x, 0 );
1742 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001743
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001744 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1745 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001746
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001747 PUT_UINT64_LE( ra, r, 0 );
1748 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001749}
1750
Aorimn5f778012016-06-09 23:22:58 +02001751/*
1752 * AES-XTS buffer encryption/decryption
1753 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001754int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1755 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001756 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001757 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001758 const unsigned char *input,
1759 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001760{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001761 int ret;
1762 size_t blocks = length / 16;
1763 size_t leftover = length % 16;
1764 unsigned char tweak[16];
1765 unsigned char prev_tweak[16];
1766 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001767
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001768 AES_VALIDATE_RET( ctx != NULL );
1769 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1770 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001771 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001772 AES_VALIDATE_RET( input != NULL );
1773 AES_VALIDATE_RET( output != NULL );
1774
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001775 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001776 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001777 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001778
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001779 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001780 if( length > ( 1 << 20 ) * 16 )
1781 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001782
Jaeden Amerod82cd862018-04-28 15:02:45 +01001783 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001784 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1785 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001786 if( ret != 0 )
1787 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001788
Jaeden Amerod82cd862018-04-28 15:02:45 +01001789 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001790 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001791 size_t i;
1792
1793 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1794 {
1795 /* We are on the last block in a decrypt operation that has
1796 * leftover bytes, so we need to use the next tweak for this block,
1797 * and this tweak for the lefover bytes. Save the current tweak for
1798 * the leftovers and then update the current tweak for use on this,
1799 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001800 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001801 mbedtls_gf128mul_x_ble( tweak, tweak );
1802 }
1803
1804 for( i = 0; i < 16; i++ )
1805 tmp[i] = input[i] ^ tweak[i];
1806
1807 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1808 if( ret != 0 )
1809 return( ret );
1810
1811 for( i = 0; i < 16; i++ )
1812 output[i] = tmp[i] ^ tweak[i];
1813
1814 /* Update the tweak for the next block. */
1815 mbedtls_gf128mul_x_ble( tweak, tweak );
1816
1817 output += 16;
1818 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001819 }
1820
Jaeden Amerod82cd862018-04-28 15:02:45 +01001821 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001822 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001823 /* If we are on the leftover bytes in a decrypt operation, we need to
1824 * use the previous tweak for these bytes (as saved in prev_tweak). */
1825 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001826
Jaeden Amerod82cd862018-04-28 15:02:45 +01001827 /* We are now on the final part of the data unit, which doesn't divide
1828 * evenly by 16. It's time for ciphertext stealing. */
1829 size_t i;
1830 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001831
Jaeden Amerod82cd862018-04-28 15:02:45 +01001832 /* Copy ciphertext bytes from the previous block to our output for each
1833 * byte of cyphertext we won't steal. At the same time, copy the
1834 * remainder of the input for this final round (since the loop bounds
1835 * are the same). */
1836 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001837 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001838 output[i] = prev_output[i];
1839 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001840 }
Aorimn5f778012016-06-09 23:22:58 +02001841
Jaeden Amerod82cd862018-04-28 15:02:45 +01001842 /* Copy ciphertext bytes from the previous block for input in this
1843 * round. */
1844 for( ; i < 16; i++ )
1845 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001846
Jaeden Amerod82cd862018-04-28 15:02:45 +01001847 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1848 if( ret != 0 )
1849 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001850
Jaeden Amerod82cd862018-04-28 15:02:45 +01001851 /* Write the result back to the previous block, overriding the previous
1852 * output we copied. */
1853 for( i = 0; i < 16; i++ )
1854 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001855 }
1856
1857 return( 0 );
1858}
1859#endif /* MBEDTLS_CIPHER_MODE_XTS */
1860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001861#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001862/*
1863 * AES-CFB128 buffer encryption/decryption
1864 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001865int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001866 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001867 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001868 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001869 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001870 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001871 unsigned char *output )
1872{
Paul Bakker27fdf462011-06-09 13:55:13 +00001873 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001874 size_t n;
1875
1876 AES_VALIDATE_RET( ctx != NULL );
1877 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1878 mode == MBEDTLS_AES_DECRYPT );
1879 AES_VALIDATE_RET( iv_off != NULL );
1880 AES_VALIDATE_RET( iv != NULL );
1881 AES_VALIDATE_RET( input != NULL );
1882 AES_VALIDATE_RET( output != NULL );
1883
1884 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001885
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001886 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001887 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1888
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001889 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001890 {
1891 while( length-- )
1892 {
1893 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001895
1896 c = *input++;
1897 *output++ = (unsigned char)( c ^ iv[n] );
1898 iv[n] = (unsigned char) c;
1899
Paul Bakker66d5d072014-06-17 16:39:18 +02001900 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001901 }
1902 }
1903 else
1904 {
1905 while( length-- )
1906 {
1907 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001908 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001909
1910 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1911
Paul Bakker66d5d072014-06-17 16:39:18 +02001912 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001913 }
1914 }
1915
1916 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001917
1918 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001919}
Paul Bakker556efba2014-01-24 15:38:12 +01001920
1921/*
1922 * AES-CFB8 buffer encryption/decryption
1923 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001924int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001925 int mode,
1926 size_t length,
1927 unsigned char iv[16],
1928 const unsigned char *input,
1929 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001930{
1931 unsigned char c;
1932 unsigned char ov[17];
1933
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001934 AES_VALIDATE_RET( ctx != NULL );
1935 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1936 mode == MBEDTLS_AES_DECRYPT );
1937 AES_VALIDATE_RET( iv != NULL );
1938 AES_VALIDATE_RET( input != NULL );
1939 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001940 while( length-- )
1941 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001942 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001943 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001945 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001946 ov[16] = *input;
1947
1948 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1949
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001950 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001951 ov[16] = c;
1952
Teppo Järvelin91d79382019-10-02 09:09:31 +03001953 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001954 }
1955
1956 return( 0 );
1957}
Simon Butcher76a5b222018-04-22 22:57:27 +01001958#endif /* MBEDTLS_CIPHER_MODE_CFB */
1959
1960#if defined(MBEDTLS_CIPHER_MODE_OFB)
1961/*
1962 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1963 */
1964int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001965 size_t length,
1966 size_t *iv_off,
1967 unsigned char iv[16],
1968 const unsigned char *input,
1969 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001970{
Simon Butcherad4e4932018-04-29 00:43:47 +01001971 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001972 size_t n;
1973
1974 AES_VALIDATE_RET( ctx != NULL );
1975 AES_VALIDATE_RET( iv_off != NULL );
1976 AES_VALIDATE_RET( iv != NULL );
1977 AES_VALIDATE_RET( input != NULL );
1978 AES_VALIDATE_RET( output != NULL );
1979
1980 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001981
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001982 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001983 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1984
Simon Butcher76a5b222018-04-22 22:57:27 +01001985 while( length-- )
1986 {
1987 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001988 {
1989 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1990 if( ret != 0 )
1991 goto exit;
1992 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001993 *output++ = *input++ ^ iv[n];
1994
1995 n = ( n + 1 ) & 0x0F;
1996 }
1997
1998 *iv_off = n;
1999
Simon Butcherad4e4932018-04-29 00:43:47 +01002000exit:
2001 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002002}
2003#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002005#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002006/*
2007 * AES-CTR buffer encryption/decryption
2008 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002009int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002010 size_t length,
2011 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002012 unsigned char nonce_counter[16],
2013 unsigned char stream_block[16],
2014 const unsigned char *input,
2015 unsigned char *output )
2016{
Paul Bakker369e14b2012-04-18 14:16:09 +00002017 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002018 size_t n;
2019
2020 AES_VALIDATE_RET( ctx != NULL );
2021 AES_VALIDATE_RET( nc_off != NULL );
2022 AES_VALIDATE_RET( nonce_counter != NULL );
2023 AES_VALIDATE_RET( stream_block != NULL );
2024 AES_VALIDATE_RET( input != NULL );
2025 AES_VALIDATE_RET( output != NULL );
2026
2027 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002028
Arto Kinnunen75439012019-12-03 14:12:10 +02002029 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002030 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2031
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002032 while( length-- )
2033 {
2034 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002035 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002036
Paul Bakker369e14b2012-04-18 14:16:09 +00002037 for( i = 16; i > 0; i-- )
2038 if( ++nonce_counter[i - 1] != 0 )
2039 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002040 }
2041 c = *input++;
2042 *output++ = (unsigned char)( c ^ stream_block[n] );
2043
Paul Bakker66d5d072014-06-17 16:39:18 +02002044 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002045 }
2046
2047 *nc_off = n;
2048
2049 return( 0 );
2050}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002051#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002055#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002056/*
2057 * AES test vectors from:
2058 *
2059 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2060 */
2061static const unsigned char aes_test_ecb_dec[3][16] =
2062{
2063 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2064 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2065 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2066 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2067 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2068 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2069};
2070
2071static const unsigned char aes_test_ecb_enc[3][16] =
2072{
2073 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2074 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2075 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2076 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2077 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2078 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2079};
2080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002081#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002082static const unsigned char aes_test_cbc_dec[3][16] =
2083{
2084 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2085 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2086 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2087 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2088 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2089 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2090};
2091
2092static const unsigned char aes_test_cbc_enc[3][16] =
2093{
2094 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2095 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2096 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2097 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2098 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2099 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2100};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002101#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002103#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002104/*
2105 * AES-CFB128 test vectors from:
2106 *
2107 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2108 */
2109static const unsigned char aes_test_cfb128_key[3][32] =
2110{
2111 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2112 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2113 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2114 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2115 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2116 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2117 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2118 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2119 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2120};
2121
2122static const unsigned char aes_test_cfb128_iv[16] =
2123{
2124 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2125 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2126};
2127
2128static const unsigned char aes_test_cfb128_pt[64] =
2129{
2130 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2131 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2132 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2133 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2134 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2135 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2136 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2137 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2138};
2139
2140static const unsigned char aes_test_cfb128_ct[3][64] =
2141{
2142 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2143 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2144 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2145 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2146 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2147 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2148 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2149 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2150 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2151 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2152 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2153 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2154 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2155 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2156 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2157 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2158 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2159 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2160 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2161 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2162 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2163 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2164 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2165 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2166};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002167#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002168
Simon Butcherad4e4932018-04-29 00:43:47 +01002169#if defined(MBEDTLS_CIPHER_MODE_OFB)
2170/*
2171 * AES-OFB test vectors from:
2172 *
Simon Butcher5db13622018-06-04 22:11:25 +01002173 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002174 */
2175static const unsigned char aes_test_ofb_key[3][32] =
2176{
2177 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2178 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2179 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2180 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2181 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2182 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2183 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2184 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2185 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2186};
2187
2188static const unsigned char aes_test_ofb_iv[16] =
2189{
2190 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2191 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2192};
2193
2194static const unsigned char aes_test_ofb_pt[64] =
2195{
2196 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2197 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2198 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2199 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2200 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2201 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2202 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2203 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2204};
2205
2206static const unsigned char aes_test_ofb_ct[3][64] =
2207{
2208 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2209 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2210 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2211 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2212 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2213 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2214 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2215 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2216 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2217 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2218 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2219 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2220 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2221 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2222 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2223 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2224 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2225 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2226 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2227 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2228 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2229 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2230 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2231 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2232};
2233#endif /* MBEDTLS_CIPHER_MODE_OFB */
2234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002235#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002236/*
2237 * AES-CTR test vectors from:
2238 *
2239 * http://www.faqs.org/rfcs/rfc3686.html
2240 */
2241
2242static const unsigned char aes_test_ctr_key[3][16] =
2243{
2244 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2245 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2246 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2247 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2248 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2249 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2250};
2251
2252static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2253{
2254 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2256 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2257 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2258 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2259 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2260};
2261
2262static const unsigned char aes_test_ctr_pt[3][48] =
2263{
2264 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2265 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2266
2267 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2268 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2269 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2270 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2271
2272 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2273 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2274 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2275 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2276 0x20, 0x21, 0x22, 0x23 }
2277};
2278
2279static const unsigned char aes_test_ctr_ct[3][48] =
2280{
2281 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2282 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2283 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2284 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2285 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2286 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2287 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2288 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2289 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2290 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2291 0x25, 0xB2, 0x07, 0x2F }
2292};
2293
2294static const int aes_test_ctr_len[3] =
2295 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002296#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002297
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002298#if defined(MBEDTLS_CIPHER_MODE_XTS)
2299/*
2300 * AES-XTS test vectors from:
2301 *
2302 * IEEE P1619/D16 Annex B
2303 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2304 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2305 */
2306static const unsigned char aes_test_xts_key[][32] =
2307{
2308 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2312 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2313 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2314 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2315 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2316 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2317 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2318 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2319 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2320};
2321
2322static const unsigned char aes_test_xts_pt32[][32] =
2323{
2324 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2328 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2329 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2330 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
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};
2337
2338static const unsigned char aes_test_xts_ct32[][32] =
2339{
2340 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2341 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2342 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2343 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2344 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2345 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2346 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2347 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2348 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2349 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2350 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2351 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2352};
2353
2354static const unsigned char aes_test_xts_data_unit[][16] =
2355{
2356 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2358 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2360 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2362};
2363
2364#endif /* MBEDTLS_CIPHER_MODE_XTS */
2365
Paul Bakker5121ce52009-01-03 21:22:43 +00002366/*
2367 * Checkup routine
2368 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002369int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002370{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002371 int ret = 0, i, j, u, mode;
2372 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002373 unsigned char key[32];
2374 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002375 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002376#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002377 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002378#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002379#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002380 unsigned char prv[16];
2381#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002382#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2383 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002384 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002385#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002386#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002387 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002388#endif
2389#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002390 unsigned char nonce_counter[16];
2391 unsigned char stream_block[16];
2392#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002393 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002395 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002396 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
2398 /*
2399 * ECB mode
2400 */
2401 for( i = 0; i < 6; i++ )
2402 {
2403 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002404 keybits = 128 + u * 64;
2405 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002406
2407 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002408 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2409 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002410
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002411#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2412 if( keybits > 128 )
2413 {
2414 mbedtls_printf( "skipped\n" );
2415 continue;
2416 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002417#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2418
2419#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2420 if( mode == MBEDTLS_AES_DECRYPT )
2421 {
2422 mbedtls_printf( "skipped\n" );
2423 continue;
2424 }
2425#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002426
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002427 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002428
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002429 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002430 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002431 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2432 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002433 }
2434 else
2435 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002436 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2437 aes_tests = aes_test_ecb_enc[u];
2438 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002439
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002440 /*
2441 * AES-192 is an optional feature that may be unavailable when
2442 * there is an alternative underlying implementation i.e. when
2443 * MBEDTLS_AES_ALT is defined.
2444 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002445 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002446 {
2447 mbedtls_printf( "skipped\n" );
2448 continue;
2449 }
2450 else if( ret != 0 )
2451 {
2452 goto exit;
2453 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002454
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002455 for( j = 0; j < 10000; j++ )
2456 {
2457 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2458 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002459 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002460 }
2461
2462 if( memcmp( buf, aes_tests, 16 ) != 0 )
2463 {
2464 ret = 1;
2465 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002466 }
2467
2468 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002469 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002470 }
2471
2472 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002473 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002475#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002476 /*
2477 * CBC mode
2478 */
2479 for( i = 0; i < 6; i++ )
2480 {
2481 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002482 keybits = 128 + u * 64;
2483 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002484
2485 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002486 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2487 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002488
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002489#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2490 if( keybits > 128 )
2491 {
2492 mbedtls_printf( "skipped\n" );
2493 continue;
2494 }
2495#endif
2496
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002497#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2498 if( mode == MBEDTLS_AES_DECRYPT )
2499 {
2500 mbedtls_printf( "skipped\n" );
2501 continue;
2502 }
2503#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2504
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002505 memset( iv , 0, 16 );
2506 memset( prv, 0, 16 );
2507 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002508
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002509 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002510 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002511 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2512 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002513 }
2514 else
2515 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002516 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2517 aes_tests = aes_test_cbc_enc[u];
2518 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002519
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002520 /*
2521 * AES-192 is an optional feature that may be unavailable when
2522 * there is an alternative underlying implementation i.e. when
2523 * MBEDTLS_AES_ALT is defined.
2524 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002525 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002526 {
2527 mbedtls_printf( "skipped\n" );
2528 continue;
2529 }
2530 else if( ret != 0 )
2531 {
2532 goto exit;
2533 }
2534
2535 for( j = 0; j < 10000; j++ )
2536 {
2537 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002538 {
2539 unsigned char tmp[16];
2540
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002541 memcpy( tmp, prv, 16 );
2542 memcpy( prv, buf, 16 );
2543 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002544 }
2545
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002546 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2547 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002548 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002549
2550 }
2551
2552 if( memcmp( buf, aes_tests, 16 ) != 0 )
2553 {
2554 ret = 1;
2555 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002556 }
2557
2558 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002559 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002560 }
2561
2562 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002563 mbedtls_printf( "\n" );
2564#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002566#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002567 /*
2568 * CFB128 mode
2569 */
2570 for( i = 0; i < 6; i++ )
2571 {
2572 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002573 keybits = 128 + u * 64;
2574 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002575
2576 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002577 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2578 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002579
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002580#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2581 if( keybits > 128 )
2582 {
2583 mbedtls_printf( "skipped\n" );
2584 continue;
2585 }
2586#endif
2587
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002588#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2589 if( mode == MBEDTLS_AES_DECRYPT )
2590 {
2591 mbedtls_printf( "skipped\n" );
2592 continue;
2593 }
2594#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2595
Paul Bakker5121ce52009-01-03 21:22:43 +00002596 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002597 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002598
2599 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002600 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002601 /*
2602 * AES-192 is an optional feature that may be unavailable when
2603 * there is an alternative underlying implementation i.e. when
2604 * MBEDTLS_AES_ALT is defined.
2605 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002606 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002607 {
2608 mbedtls_printf( "skipped\n" );
2609 continue;
2610 }
2611 else if( ret != 0 )
2612 {
2613 goto exit;
2614 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002615
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002616 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002617 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002618 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002619 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002620 }
2621 else
2622 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002623 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002624 aes_tests = aes_test_cfb128_ct[u];
2625 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002626
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002627 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2628 if( ret != 0 )
2629 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002630
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002631 if( memcmp( buf, aes_tests, 64 ) != 0 )
2632 {
2633 ret = 1;
2634 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002635 }
2636
2637 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002638 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002639 }
2640
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002641 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002642 mbedtls_printf( "\n" );
2643#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002644
Simon Butcherad4e4932018-04-29 00:43:47 +01002645#if defined(MBEDTLS_CIPHER_MODE_OFB)
2646 /*
2647 * OFB mode
2648 */
2649 for( i = 0; i < 6; i++ )
2650 {
2651 u = i >> 1;
2652 keybits = 128 + u * 64;
2653 mode = i & 1;
2654
2655 if( verbose != 0 )
2656 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2657 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2658
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002659#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2660 if( keybits > 128 )
2661 {
2662 mbedtls_printf( "skipped\n" );
2663 continue;
2664 }
2665#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002666
2667#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2668 if( mode == MBEDTLS_AES_DECRYPT )
2669 {
2670 mbedtls_printf( "skipped\n" );
2671 continue;
2672 }
2673#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2674
Simon Butcherad4e4932018-04-29 00:43:47 +01002675 memcpy( iv, aes_test_ofb_iv, 16 );
2676 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2677
2678 offset = 0;
2679 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2680 /*
2681 * AES-192 is an optional feature that may be unavailable when
2682 * there is an alternative underlying implementation i.e. when
2683 * MBEDTLS_AES_ALT is defined.
2684 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002685 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002686 {
2687 mbedtls_printf( "skipped\n" );
2688 continue;
2689 }
2690 else if( ret != 0 )
2691 {
2692 goto exit;
2693 }
2694
2695 if( mode == MBEDTLS_AES_DECRYPT )
2696 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002697 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002698 aes_tests = aes_test_ofb_pt;
2699 }
2700 else
2701 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002702 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002703 aes_tests = aes_test_ofb_ct[u];
2704 }
2705
2706 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2707 if( ret != 0 )
2708 goto exit;
2709
2710 if( memcmp( buf, aes_tests, 64 ) != 0 )
2711 {
2712 ret = 1;
2713 goto exit;
2714 }
2715
2716 if( verbose != 0 )
2717 mbedtls_printf( "passed\n" );
2718 }
2719
2720 if( verbose != 0 )
2721 mbedtls_printf( "\n" );
2722#endif /* MBEDTLS_CIPHER_MODE_OFB */
2723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002724#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002725 /*
2726 * CTR mode
2727 */
2728 for( i = 0; i < 6; i++ )
2729 {
2730 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002731 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002732
2733 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002734 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002735 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002736
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002737#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2738 if( keybits > 128 )
2739 {
2740 mbedtls_printf( "skipped\n" );
2741 continue;
2742 }
2743#endif
2744
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002745#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2746 if( mode == MBEDTLS_AES_DECRYPT )
2747 {
2748 mbedtls_printf( "skipped\n" );
2749 continue;
2750 }
2751#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2752
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002753 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2754 memcpy( key, aes_test_ctr_key[u], 16 );
2755
2756 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002757 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2758 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002759
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002760 len = aes_test_ctr_len[u];
2761
2762 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002763 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002764 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002765 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002766 }
2767 else
2768 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002769 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002770 aes_tests = aes_test_ctr_ct[u];
2771 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002772
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002773 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2774 stream_block, buf, buf );
2775 if( ret != 0 )
2776 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002777
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002778 if( memcmp( buf, aes_tests, len ) != 0 )
2779 {
2780 ret = 1;
2781 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002782 }
2783
2784 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002785 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002786 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002787
2788 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002789 mbedtls_printf( "\n" );
2790#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002791
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002792#if defined(MBEDTLS_CIPHER_MODE_XTS)
2793 {
2794 static const int num_tests =
2795 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2796 mbedtls_aes_xts_context ctx_xts;
2797
2798 /*
2799 * XTS mode
2800 */
2801 mbedtls_aes_xts_init( &ctx_xts );
2802
2803 for( i = 0; i < num_tests << 1; i++ )
2804 {
2805 const unsigned char *data_unit;
2806 u = i >> 1;
2807 mode = i & 1;
2808
2809 if( verbose != 0 )
2810 mbedtls_printf( " AES-XTS-128 (%s): ",
2811 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2812
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002813#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2814 if( mode == MBEDTLS_AES_DECRYPT )
2815 {
2816 mbedtls_printf( "skipped\n" );
2817 continue;
2818 }
2819#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2820
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002821 memset( key, 0, sizeof( key ) );
2822 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002823 data_unit = aes_test_xts_data_unit[u];
2824
2825 len = sizeof( *aes_test_xts_ct32 );
2826
2827 if( mode == MBEDTLS_AES_DECRYPT )
2828 {
2829 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2830 if( ret != 0)
2831 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002832 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002833 aes_tests = aes_test_xts_pt32[u];
2834 }
2835 else
2836 {
2837 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2838 if( ret != 0)
2839 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002840 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002841 aes_tests = aes_test_xts_ct32[u];
2842 }
2843
2844
2845 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2846 buf, buf );
2847 if( ret != 0 )
2848 goto exit;
2849
2850 if( memcmp( buf, aes_tests, len ) != 0 )
2851 {
2852 ret = 1;
2853 goto exit;
2854 }
2855
2856 if( verbose != 0 )
2857 mbedtls_printf( "passed\n" );
2858 }
2859
2860 if( verbose != 0 )
2861 mbedtls_printf( "\n" );
2862
2863 mbedtls_aes_xts_free( &ctx_xts );
2864 }
2865#endif /* MBEDTLS_CIPHER_MODE_XTS */
2866
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002867 ret = 0;
2868
2869exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002870 if( ret != 0 && verbose != 0 )
2871 mbedtls_printf( "failed\n" );
2872
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002873 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002874
2875 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002876}
2877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002878#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880#endif /* MBEDTLS_AES_C */