blob: e9e75444922a5df076f6e76fa2784f49ee293456 [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
Paul Bakker5121ce52009-01-03 21:22:43 +0000678/*
679 * AES key schedule (encryption)
680 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200681#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200683 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000684{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200685 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200686 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200687 volatile unsigned int i = 0;
688 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000689 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200690 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000691
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100692 AES_VALIDATE_RET( ctx != NULL );
693 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000694
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200695 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 {
697 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300698#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000699 case 192: ctx->nr = 12; break;
700 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300701#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000703 }
704
Simon Butcher5201e412018-12-06 17:40:14 +0000705#if !defined(MBEDTLS_AES_ROM_TABLES)
706 if( aes_init_done == 0 )
707 {
708 aes_gen_tables();
709 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000710 }
711#endif
712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000714 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100715 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000716
717 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000719 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000720#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000721 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100724 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200725 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100726#endif
727
Andrzej Kureka9a5ff52020-07-15 08:50:59 -0400728 /* Three least significant bits are truncated from keybits, which is
729 * expected to be a multiple of 8. */
Andrzej Kurek11ddf252020-06-24 17:33:39 -0400730 mbedtls_platform_memset( RK, 0, keybits >> 3 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200731 offset = mbedtls_platform_random_in_range( keybits >> 5 );
732
733 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000734 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200735 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200736 flow_ctrl++;
737 }
738
739 for( j = 0; j < offset; j++ )
740 {
741 GET_UINT32_LE( RK[j], key, j << 2 );
742 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000743 }
744
745 switch( ctx->nr )
746 {
747 case 10:
748
749 for( i = 0; i < 10; i++, RK += 4 )
750 {
751 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000752 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
753 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
754 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
755 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000756
757 RK[5] = RK[1] ^ RK[4];
758 RK[6] = RK[2] ^ RK[5];
759 RK[7] = RK[3] ^ RK[6];
760 }
761 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300762#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000763 case 12:
764
765 for( i = 0; i < 8; i++, RK += 6 )
766 {
767 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000768 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
769 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
770 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
771 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
773 RK[7] = RK[1] ^ RK[6];
774 RK[8] = RK[2] ^ RK[7];
775 RK[9] = RK[3] ^ RK[8];
776 RK[10] = RK[4] ^ RK[9];
777 RK[11] = RK[5] ^ RK[10];
778 }
779 break;
780
781 case 14:
782
783 for( i = 0; i < 7; i++, RK += 8 )
784 {
785 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000786 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
787 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
788 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
789 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000790
791 RK[9] = RK[1] ^ RK[8];
792 RK[10] = RK[2] ^ RK[9];
793 RK[11] = RK[3] ^ RK[10];
794
795 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000796 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
797 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
798 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
799 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000800
801 RK[13] = RK[5] ^ RK[12];
802 RK[14] = RK[6] ^ RK[13];
803 RK[15] = RK[7] ^ RK[14];
804 }
805 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300806#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000807 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000808
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200809 ret = 0;
810
811 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200812 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200813#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
814 || ( ctx->nr == 12 && i == 8 )
815 || ( ctx->nr == 14 && i == 7 )
816#endif
817 ) )
818 {
Andrzej Kurekafec8852020-07-15 16:31:27 -0400819 return ret;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200820 }
821
Andrzej Kurekca609372020-07-08 03:19:02 -0400822 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200823 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000824}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200825#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000826
827/*
828 * AES key schedule (decryption)
829 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200830#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200832 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000833{
Arto Kinnunen14804442019-10-16 13:43:59 +0300834#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
835 (void) ctx;
836 (void) key;
837 (void) keybits;
838
839 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
840#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200841 volatile unsigned int i = 0, j = 0;
842 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200843 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000844 uint32_t *RK;
845 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200846
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100847 AES_VALIDATE_RET( ctx != NULL );
848 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000853 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100854 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000855
856 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000858 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000859#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000860 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000861
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200862 /* Also checks keybits */
863 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200864 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000865
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200866 ctx->nr = cty.nr;
867
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100869 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100870 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200871 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100872 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200873 i = 0;
874 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200875 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100876 }
877#endif
878
Paul Bakker5121ce52009-01-03 21:22:43 +0000879 SK = cty.rk + cty.nr * 4;
880
881 *RK++ = *SK++;
882 *RK++ = *SK++;
883 *RK++ = *SK++;
884 *RK++ = *SK++;
885
886 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
887 {
888 for( j = 0; j < 4; j++, SK++ )
889 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200890 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
891 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
892 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
893 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 }
895 }
896
897 *RK++ = *SK++;
898 *RK++ = *SK++;
899 *RK++ = *SK++;
900 *RK++ = *SK++;
901
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200902exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000904
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200905 if( ret != 0 )
906 {
907 return( ret );
908 }
909 else if( ( i == 0 ) && ( j == 4 ) )
910 {
911 return( ret );
912 }
913 else
914 {
915 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
916 }
917
Arto Kinnunen14804442019-10-16 13:43:59 +0300918#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000919}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100920
921#if defined(MBEDTLS_CIPHER_MODE_XTS)
922static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
923 unsigned int keybits,
924 const unsigned char **key1,
925 unsigned int *key1bits,
926 const unsigned char **key2,
927 unsigned int *key2bits )
928{
929 const unsigned int half_keybits = keybits / 2;
930 const unsigned int half_keybytes = half_keybits / 8;
931
932 switch( keybits )
933 {
934 case 256: break;
935 case 512: break;
936 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
937 }
938
939 *key1bits = half_keybits;
940 *key2bits = half_keybits;
941 *key1 = &key[0];
942 *key2 = &key[half_keybytes];
943
944 return 0;
945}
946
947int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
948 const unsigned char *key,
949 unsigned int keybits)
950{
951 int ret;
952 const unsigned char *key1, *key2;
953 unsigned int key1bits, key2bits;
954
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100955 AES_VALIDATE_RET( ctx != NULL );
956 AES_VALIDATE_RET( key != NULL );
957
Jaeden Amero9366feb2018-05-29 18:55:17 +0100958 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
959 &key2, &key2bits );
960 if( ret != 0 )
961 return( ret );
962
963 /* Set the tweak key. Always set tweak key for the encryption mode. */
964 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
965 if( ret != 0 )
966 return( ret );
967
968 /* Set crypt key for encryption. */
969 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
970}
971
972int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
973 const unsigned char *key,
974 unsigned int keybits)
975{
976 int ret;
977 const unsigned char *key1, *key2;
978 unsigned int key1bits, key2bits;
979
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100980 AES_VALIDATE_RET( ctx != NULL );
981 AES_VALIDATE_RET( key != NULL );
982
Jaeden Amero9366feb2018-05-29 18:55:17 +0100983 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
984 &key2, &key2bits );
985 if( ret != 0 )
986 return( ret );
987
988 /* Set the tweak key. Always set tweak key for encryption. */
989 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
990 if( ret != 0 )
991 return( ret );
992
993 /* Set crypt key for decryption. */
994 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
995}
996#endif /* MBEDTLS_CIPHER_MODE_XTS */
997
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200998#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000999
Paul Bakker5121ce52009-01-03 21:22:43 +00001000/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001001 * AES-ECB block encryption
1002 */
1003#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001004
Arto Kinnunen311ab592020-01-16 17:20:51 +02001005#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001006static uint32_t *aes_fround( uint32_t *R,
1007 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1008 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1009{
1010 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1011 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1012 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1013 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1014
1015 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1016 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1017 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1018 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1019
1020 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1021 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1022 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1023 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1024
1025 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1026 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1027 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1028 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1029
1030 return R;
1031}
1032
1033static void aes_fround_final( uint32_t *R,
1034 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1035 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1036{
1037 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1038 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1039 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1040 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1041
1042 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1043 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1044 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1045 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1046
1047 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1048 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1049 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1050 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1051
1052 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1053 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1054 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1055 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1056}
1057
Andres AGf5bf7182017-03-03 14:09:56 +00001058int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1059 const unsigned char input[16],
1060 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001061{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001062 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001063 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001064 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001065 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001066 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001067 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001068 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001069 // control bytes for AES calculation rounds,
1070 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1071 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001072
Arto Kinnunen172836a2019-11-28 13:34:13 +02001073 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001074 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001075 aes_data_table[0] = &aes_data_real;
1076 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001077
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001078 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001079 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1080 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001081 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001082
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001083 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001084 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001085
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001086 // SCA countermeasure, randomize secret data location by initializing it in
1087 // a random order and writing randomized fake data between the real data
1088 // writes.
1089 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001090 i = offset;
1091 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001092 {
1093 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Andrzej Kurek11ddf252020-06-24 17:33:39 -04001094 aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32();
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001095 flow_control++;
1096 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001097
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001098 tindex = 0;
1099 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001100 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001101 // Get pointer to the real or fake data
1102 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1103 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001104
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001105 // initial round key addition
1106 for( i = 0; i < 4; i++ )
1107 {
1108 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1109 }
1110 tindex++;
1111 flow_control++;
1112 } while( stop_mark == 0 );
1113
1114 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1115 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001116 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001117 // Get pointer to the real or fake data
1118 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1119 offset = round_ctrl_table[tindex] & 0x04;
1120 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001121
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001122 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1123 &aes_data_ptr->xy_values[0 + offset],
1124 &aes_data_ptr->xy_values[1 + offset],
1125 &aes_data_ptr->xy_values[2 + offset],
1126 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001127 aes_data_ptr->xy_values[4 - offset],
1128 aes_data_ptr->xy_values[5 - offset],
1129 aes_data_ptr->xy_values[6 - offset],
1130 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001131 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001132 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001133 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001134
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001135 // Calculate final AES round + dummy rounds
1136 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001137 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001138 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1139 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001140 aes_fround_final( aes_data_ptr->rk_ptr,
1141 &aes_data_ptr->xy_values[0],
1142 &aes_data_ptr->xy_values[1],
1143 &aes_data_ptr->xy_values[2],
1144 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001145 aes_data_ptr->xy_values[4],
1146 aes_data_ptr->xy_values[5],
1147 aes_data_ptr->xy_values[6],
1148 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001149 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001150 tindex++;
1151 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001152
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001153 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001154 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001155
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001156 // SCA countermeasure, randomize secret data location by writing to it in
1157 // a random order.
1158 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001159 i = offset;
1160 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001161 {
1162 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1163 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001164 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001165
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001166 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001167 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001168 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001169 }
1170
Andrzej Kurekca609372020-07-08 03:19:02 -04001171 // Clear the output in case of a FI
1172 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001173 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001174}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001175
1176#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1177
1178#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1179 do \
1180 { \
1181 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1182 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1183 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1184 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1185 \
1186 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1187 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1188 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1189 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1190 \
1191 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1192 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1193 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1194 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1195 \
1196 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1197 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1198 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1199 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1200 } while( 0 )
1201
1202int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1203 const unsigned char input[16],
1204 unsigned char output[16] )
1205{
1206 int i;
1207 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1208
1209 RK = ctx->rk;
1210
1211 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1212 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1213 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1214 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1215
1216 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1217 {
1218 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1219 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1220 }
1221
1222 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1223
1224 X0 = *RK++ ^ \
1225 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1226 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1227 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1228 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1229
1230 X1 = *RK++ ^ \
1231 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1232 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1233 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1234 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1235
1236 X2 = *RK++ ^ \
1237 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1238 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1239 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1240 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1241
1242 X3 = *RK++ ^ \
1243 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1244 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1245 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1246 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1247
1248 PUT_UINT32_LE( X0, output, 0 );
1249 PUT_UINT32_LE( X1, output, 4 );
1250 PUT_UINT32_LE( X2, output, 8 );
1251 PUT_UINT32_LE( X3, output, 12 );
1252
Andrzej Kureka8405442019-11-12 03:34:03 -05001253 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1254 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1255 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1256 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1257
1258 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1259 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1260 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1261 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1262
1263 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1264
Arto Kinnunen311ab592020-01-16 17:20:51 +02001265 return( 0 );
1266}
1267#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001268#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1269
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001270#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001271void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1272 const unsigned char input[16],
1273 unsigned char output[16] )
1274{
1275 mbedtls_internal_aes_encrypt( ctx, input, output );
1276}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001277#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001278
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001279/*
1280 * AES-ECB block decryption
1281 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001282
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001283#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001284#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001285
Arto Kinnunen311ab592020-01-16 17:20:51 +02001286#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001287static uint32_t *aes_rround( uint32_t *R,
1288 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1289 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1290{
1291 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1292 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1293 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1294 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1295
1296 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1297 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1298 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1299 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1300
1301 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1302 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1303 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1304 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1305
1306 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1307 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1308 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1309 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1310 return R;
1311}
1312
1313static void aes_rround_final( uint32_t *R,
1314 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1315 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1316{
1317 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1318 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1319 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1320 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1321
1322 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1323 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1324 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1325 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1326
1327 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1328 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1329 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1330 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1331
1332 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1333 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1334 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1335 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1336}
1337
Andres AGf5bf7182017-03-03 14:09:56 +00001338int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1339 const unsigned char input[16],
1340 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001341{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001342 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001343 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001344 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001345 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001346 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001347 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001348 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001349 // control bytes for AES calculation rounds,
1350 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1351 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001352
Arto Kinnunen172836a2019-11-28 13:34:13 +02001353 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001354 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001355 aes_data_table[0] = &aes_data_real;
1356 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001357
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001358 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001359 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001360 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001361 flow_control = dummy_rounds;
1362
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001363 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001364 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001365
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001366 // SCA countermeasure, randomize secret data location by initializing it in
1367 // a random order and writing randomized fake data between the real data
1368 // writes.
1369 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001370 i = offset;
1371 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001372 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001373 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001374 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001375 flow_control++;
1376 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001377
1378 tindex = 0;
1379 do
1380 {
1381 // Get pointer to the real or fake data
1382 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1383 stop_mark = round_ctrl_table[tindex] & 0x03;
1384
1385 // initial round key addition
1386 for( i = 0; i < 4; i++ )
1387 {
1388 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1389 }
1390 tindex++;
1391 flow_control++;
1392 } while( stop_mark == 0 );
1393
1394 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1395 do
1396 {
1397 // Get pointer to the real or fake data
1398 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1399 offset = round_ctrl_table[tindex] & 0x04;
1400 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001401
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001402 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1403 &aes_data_ptr->xy_values[0 + offset],
1404 &aes_data_ptr->xy_values[1 + offset],
1405 &aes_data_ptr->xy_values[2 + offset],
1406 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001407 aes_data_ptr->xy_values[4 - offset],
1408 aes_data_ptr->xy_values[5 - offset],
1409 aes_data_ptr->xy_values[6 - offset],
1410 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001411 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001412 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001413 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001414
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001415 // Calculate final AES round + dummy rounds
1416 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001417 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001418 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1419 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001420 aes_rround_final( aes_data_ptr->rk_ptr,
1421 &aes_data_ptr->xy_values[0],
1422 &aes_data_ptr->xy_values[1],
1423 &aes_data_ptr->xy_values[2],
1424 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001425 aes_data_ptr->xy_values[4],
1426 aes_data_ptr->xy_values[5],
1427 aes_data_ptr->xy_values[6],
1428 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001429 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001430 tindex++;
1431 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001432
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001433 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001434 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001435
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001436 // SCA countermeasure, randomize secret data location by writing to it in
1437 // a random order.
1438 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001439 i = offset;
1440 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001441 {
1442 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001443 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001444 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001445
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001446 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001447 {
Andrzej Kurekafec8852020-07-15 16:31:27 -04001448 return 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001449 }
1450
Andrzej Kurekca609372020-07-08 03:19:02 -04001451 // Clear the output in case of a FI
1452 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001453 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001454}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001455
1456#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1457
1458#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1459 do \
1460 { \
1461 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1462 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1463 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1464 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1465 \
1466 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1467 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1468 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1469 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1470 \
1471 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1472 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1473 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1474 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1475 \
1476 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1477 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1478 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1479 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1480 } while( 0 )
1481
1482int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1483 const unsigned char input[16],
1484 unsigned char output[16] )
1485{
1486 int i;
1487 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1488
1489 RK = ctx->rk;
1490
1491 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1492 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1493 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1494 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1495
1496 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1497 {
1498 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1499 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1500 }
1501
1502 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1503
1504 X0 = *RK++ ^ \
1505 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1506 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1507 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1508 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1509
1510 X1 = *RK++ ^ \
1511 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1512 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1513 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1514 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1515
1516 X2 = *RK++ ^ \
1517 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1518 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1519 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1520 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1521
1522 X3 = *RK++ ^ \
1523 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1524 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1525 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1526 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1527
1528 PUT_UINT32_LE( X0, output, 0 );
1529 PUT_UINT32_LE( X1, output, 4 );
1530 PUT_UINT32_LE( X2, output, 8 );
1531 PUT_UINT32_LE( X3, output, 12 );
1532
Andrzej Kureka8405442019-11-12 03:34:03 -05001533 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1534 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1535 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1536 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1537
1538 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1539 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1540 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1541 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1542
1543 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1544
Arto Kinnunen311ab592020-01-16 17:20:51 +02001545 return( 0 );
1546}
1547#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1548
Arto Kinnunen14804442019-10-16 13:43:59 +03001549#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001550#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1551
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001552#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001553void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1554 const unsigned char input[16],
1555 unsigned char output[16] )
1556{
Arto Kinnunen14804442019-10-16 13:43:59 +03001557#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1558 (void) ctx;
1559 (void) input;
1560 (void) output;
1561#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001562 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001563#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001564}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001565#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001566
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001567/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001568 * AES-ECB block encryption/decryption
1569 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001570int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001571 int mode,
1572 const unsigned char input[16],
1573 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001574{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001575 AES_VALIDATE_RET( ctx != NULL );
1576 AES_VALIDATE_RET( input != NULL );
1577 AES_VALIDATE_RET( output != NULL );
1578 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1579 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001580 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001581
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001582#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001583 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001584 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001585#endif
1586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001587#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001588 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001589 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001590 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001591 return( 0 );
1592
1593 // If padlock data misaligned, we just fall back to
1594 // unaccelerated mode
1595 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001596 }
1597#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001598
Arto Kinnunen14804442019-10-16 13:43:59 +03001599#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1600 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1601#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001602
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001603 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001604 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001605 else
Andres AGf5bf7182017-03-03 14:09:56 +00001606 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001607#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001608}
1609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001610#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001611/*
1612 * AES-CBC buffer encryption/decryption
1613 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001614int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001615 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001616 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001617 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001618 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001619 unsigned char *output )
1620{
1621 int i;
1622 unsigned char temp[16];
1623
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001624 AES_VALIDATE_RET( ctx != NULL );
1625 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1626 mode == MBEDTLS_AES_DECRYPT );
1627 AES_VALIDATE_RET( iv != NULL );
1628 AES_VALIDATE_RET( input != NULL );
1629 AES_VALIDATE_RET( output != NULL );
1630
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001631 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001632 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001633
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001635 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001636 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001637 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001638 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001639
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001640 // If padlock data misaligned, we just fall back to
1641 // unaccelerated mode
1642 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001643 }
1644#endif
1645
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001646 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001647 {
1648 while( length > 0 )
1649 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001650 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001651 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001652
1653 for( i = 0; i < 16; i++ )
1654 output[i] = (unsigned char)( output[i] ^ iv[i] );
1655
Teppo Järvelin91d79382019-10-02 09:09:31 +03001656 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001657
1658 input += 16;
1659 output += 16;
1660 length -= 16;
1661 }
1662 }
1663 else
1664 {
1665 while( length > 0 )
1666 {
1667 for( i = 0; i < 16; i++ )
1668 output[i] = (unsigned char)( input[i] ^ iv[i] );
1669
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001670 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001671 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001672
1673 input += 16;
1674 output += 16;
1675 length -= 16;
1676 }
1677 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001678
1679 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001680}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001681#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001682
Aorimn5f778012016-06-09 23:22:58 +02001683#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001684
1685/* Endianess with 64 bits values */
1686#ifndef GET_UINT64_LE
1687#define GET_UINT64_LE(n,b,i) \
1688{ \
1689 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1690 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1691 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1692 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1693 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1694 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1695 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1696 | ( (uint64_t) (b)[(i) ] ); \
1697}
1698#endif
1699
1700#ifndef PUT_UINT64_LE
1701#define PUT_UINT64_LE(n,b,i) \
1702{ \
1703 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1704 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1705 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1706 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1707 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1708 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1709 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1710 (b)[(i) ] = (unsigned char) ( (n) ); \
1711}
1712#endif
1713
1714typedef unsigned char mbedtls_be128[16];
1715
1716/*
1717 * GF(2^128) multiplication function
1718 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001719 * This function multiplies a field element by x in the polynomial field
1720 * representation. It uses 64-bit word operations to gain speed but compensates
1721 * for machine endianess and hence works correctly on both big and little
1722 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001723 */
1724static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001725 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001726{
1727 uint64_t a, b, ra, rb;
1728
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001729 GET_UINT64_LE( a, x, 0 );
1730 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001731
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001732 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1733 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001734
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001735 PUT_UINT64_LE( ra, r, 0 );
1736 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001737}
1738
Aorimn5f778012016-06-09 23:22:58 +02001739/*
1740 * AES-XTS buffer encryption/decryption
1741 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001742int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1743 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001744 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001745 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001746 const unsigned char *input,
1747 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001748{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001749 int ret;
1750 size_t blocks = length / 16;
1751 size_t leftover = length % 16;
1752 unsigned char tweak[16];
1753 unsigned char prev_tweak[16];
1754 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001755
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001756 AES_VALIDATE_RET( ctx != NULL );
1757 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1758 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001759 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001760 AES_VALIDATE_RET( input != NULL );
1761 AES_VALIDATE_RET( output != NULL );
1762
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001763 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001764 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001765 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001766
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001767 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001768 if( length > ( 1 << 20 ) * 16 )
1769 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001770
Jaeden Amerod82cd862018-04-28 15:02:45 +01001771 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001772 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1773 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001774 if( ret != 0 )
1775 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001776
Jaeden Amerod82cd862018-04-28 15:02:45 +01001777 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001778 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001779 size_t i;
1780
1781 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1782 {
1783 /* We are on the last block in a decrypt operation that has
1784 * leftover bytes, so we need to use the next tweak for this block,
1785 * and this tweak for the lefover bytes. Save the current tweak for
1786 * the leftovers and then update the current tweak for use on this,
1787 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001788 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001789 mbedtls_gf128mul_x_ble( tweak, tweak );
1790 }
1791
1792 for( i = 0; i < 16; i++ )
1793 tmp[i] = input[i] ^ tweak[i];
1794
1795 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1796 if( ret != 0 )
1797 return( ret );
1798
1799 for( i = 0; i < 16; i++ )
1800 output[i] = tmp[i] ^ tweak[i];
1801
1802 /* Update the tweak for the next block. */
1803 mbedtls_gf128mul_x_ble( tweak, tweak );
1804
1805 output += 16;
1806 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001807 }
1808
Jaeden Amerod82cd862018-04-28 15:02:45 +01001809 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001810 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001811 /* If we are on the leftover bytes in a decrypt operation, we need to
1812 * use the previous tweak for these bytes (as saved in prev_tweak). */
1813 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001814
Jaeden Amerod82cd862018-04-28 15:02:45 +01001815 /* We are now on the final part of the data unit, which doesn't divide
1816 * evenly by 16. It's time for ciphertext stealing. */
1817 size_t i;
1818 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001819
Jaeden Amerod82cd862018-04-28 15:02:45 +01001820 /* Copy ciphertext bytes from the previous block to our output for each
1821 * byte of cyphertext we won't steal. At the same time, copy the
1822 * remainder of the input for this final round (since the loop bounds
1823 * are the same). */
1824 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001825 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001826 output[i] = prev_output[i];
1827 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001828 }
Aorimn5f778012016-06-09 23:22:58 +02001829
Jaeden Amerod82cd862018-04-28 15:02:45 +01001830 /* Copy ciphertext bytes from the previous block for input in this
1831 * round. */
1832 for( ; i < 16; i++ )
1833 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001834
Jaeden Amerod82cd862018-04-28 15:02:45 +01001835 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1836 if( ret != 0 )
1837 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001838
Jaeden Amerod82cd862018-04-28 15:02:45 +01001839 /* Write the result back to the previous block, overriding the previous
1840 * output we copied. */
1841 for( i = 0; i < 16; i++ )
1842 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001843 }
1844
1845 return( 0 );
1846}
1847#endif /* MBEDTLS_CIPHER_MODE_XTS */
1848
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001849#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001850/*
1851 * AES-CFB128 buffer encryption/decryption
1852 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001853int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001854 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001855 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001856 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001857 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001858 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001859 unsigned char *output )
1860{
Paul Bakker27fdf462011-06-09 13:55:13 +00001861 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001862 size_t n;
1863
1864 AES_VALIDATE_RET( ctx != NULL );
1865 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1866 mode == MBEDTLS_AES_DECRYPT );
1867 AES_VALIDATE_RET( iv_off != NULL );
1868 AES_VALIDATE_RET( iv != NULL );
1869 AES_VALIDATE_RET( input != NULL );
1870 AES_VALIDATE_RET( output != NULL );
1871
1872 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001873
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001874 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001875 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1876
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001877 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001878 {
1879 while( length-- )
1880 {
1881 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001882 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001883
1884 c = *input++;
1885 *output++ = (unsigned char)( c ^ iv[n] );
1886 iv[n] = (unsigned char) c;
1887
Paul Bakker66d5d072014-06-17 16:39:18 +02001888 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001889 }
1890 }
1891 else
1892 {
1893 while( length-- )
1894 {
1895 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001896 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001897
1898 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1899
Paul Bakker66d5d072014-06-17 16:39:18 +02001900 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001901 }
1902 }
1903
1904 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001905
1906 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001907}
Paul Bakker556efba2014-01-24 15:38:12 +01001908
1909/*
1910 * AES-CFB8 buffer encryption/decryption
1911 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001912int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001913 int mode,
1914 size_t length,
1915 unsigned char iv[16],
1916 const unsigned char *input,
1917 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001918{
1919 unsigned char c;
1920 unsigned char ov[17];
1921
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001922 AES_VALIDATE_RET( ctx != NULL );
1923 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1924 mode == MBEDTLS_AES_DECRYPT );
1925 AES_VALIDATE_RET( iv != NULL );
1926 AES_VALIDATE_RET( input != NULL );
1927 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001928 while( length-- )
1929 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001930 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001931 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001933 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001934 ov[16] = *input;
1935
1936 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1937
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001938 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001939 ov[16] = c;
1940
Teppo Järvelin91d79382019-10-02 09:09:31 +03001941 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001942 }
1943
1944 return( 0 );
1945}
Simon Butcher76a5b222018-04-22 22:57:27 +01001946#endif /* MBEDTLS_CIPHER_MODE_CFB */
1947
1948#if defined(MBEDTLS_CIPHER_MODE_OFB)
1949/*
1950 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1951 */
1952int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001953 size_t length,
1954 size_t *iv_off,
1955 unsigned char iv[16],
1956 const unsigned char *input,
1957 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001958{
Simon Butcherad4e4932018-04-29 00:43:47 +01001959 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001960 size_t n;
1961
1962 AES_VALIDATE_RET( ctx != NULL );
1963 AES_VALIDATE_RET( iv_off != NULL );
1964 AES_VALIDATE_RET( iv != NULL );
1965 AES_VALIDATE_RET( input != NULL );
1966 AES_VALIDATE_RET( output != NULL );
1967
1968 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001969
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001970 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001971 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1972
Simon Butcher76a5b222018-04-22 22:57:27 +01001973 while( length-- )
1974 {
1975 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001976 {
1977 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1978 if( ret != 0 )
1979 goto exit;
1980 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001981 *output++ = *input++ ^ iv[n];
1982
1983 n = ( n + 1 ) & 0x0F;
1984 }
1985
1986 *iv_off = n;
1987
Simon Butcherad4e4932018-04-29 00:43:47 +01001988exit:
1989 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001990}
1991#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001993#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001994/*
1995 * AES-CTR buffer encryption/decryption
1996 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001997int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001998 size_t length,
1999 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002000 unsigned char nonce_counter[16],
2001 unsigned char stream_block[16],
2002 const unsigned char *input,
2003 unsigned char *output )
2004{
Paul Bakker369e14b2012-04-18 14:16:09 +00002005 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002006 size_t n;
2007
2008 AES_VALIDATE_RET( ctx != NULL );
2009 AES_VALIDATE_RET( nc_off != NULL );
2010 AES_VALIDATE_RET( nonce_counter != NULL );
2011 AES_VALIDATE_RET( stream_block != NULL );
2012 AES_VALIDATE_RET( input != NULL );
2013 AES_VALIDATE_RET( output != NULL );
2014
2015 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002016
Arto Kinnunen75439012019-12-03 14:12:10 +02002017 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002018 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2019
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002020 while( length-- )
2021 {
2022 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002023 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002024
Paul Bakker369e14b2012-04-18 14:16:09 +00002025 for( i = 16; i > 0; i-- )
2026 if( ++nonce_counter[i - 1] != 0 )
2027 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002028 }
2029 c = *input++;
2030 *output++ = (unsigned char)( c ^ stream_block[n] );
2031
Paul Bakker66d5d072014-06-17 16:39:18 +02002032 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002033 }
2034
2035 *nc_off = n;
2036
2037 return( 0 );
2038}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002044/*
2045 * AES test vectors from:
2046 *
2047 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2048 */
2049static const unsigned char aes_test_ecb_dec[3][16] =
2050{
2051 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2052 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2053 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2054 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2055 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2056 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2057};
2058
2059static const unsigned char aes_test_ecb_enc[3][16] =
2060{
2061 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2062 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2063 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2064 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2065 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2066 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2067};
2068
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002069#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002070static const unsigned char aes_test_cbc_dec[3][16] =
2071{
2072 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2073 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2074 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2075 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2076 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2077 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2078};
2079
2080static const unsigned char aes_test_cbc_enc[3][16] =
2081{
2082 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2083 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2084 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2085 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2086 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2087 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2088};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002091#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002092/*
2093 * AES-CFB128 test vectors from:
2094 *
2095 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2096 */
2097static const unsigned char aes_test_cfb128_key[3][32] =
2098{
2099 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2100 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2101 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2102 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2103 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2104 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2105 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2106 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2107 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2108};
2109
2110static const unsigned char aes_test_cfb128_iv[16] =
2111{
2112 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2113 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2114};
2115
2116static const unsigned char aes_test_cfb128_pt[64] =
2117{
2118 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2119 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2120 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2121 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2122 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2123 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2124 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2125 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2126};
2127
2128static const unsigned char aes_test_cfb128_ct[3][64] =
2129{
2130 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2131 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2132 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2133 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2134 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2135 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2136 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2137 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2138 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2139 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2140 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2141 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2142 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2143 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2144 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2145 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2146 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2147 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2148 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2149 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2150 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2151 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2152 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2153 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2154};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002155#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002156
Simon Butcherad4e4932018-04-29 00:43:47 +01002157#if defined(MBEDTLS_CIPHER_MODE_OFB)
2158/*
2159 * AES-OFB test vectors from:
2160 *
Simon Butcher5db13622018-06-04 22:11:25 +01002161 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002162 */
2163static const unsigned char aes_test_ofb_key[3][32] =
2164{
2165 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2166 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2167 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2168 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2169 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2170 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2171 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2172 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2173 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2174};
2175
2176static const unsigned char aes_test_ofb_iv[16] =
2177{
2178 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2179 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2180};
2181
2182static const unsigned char aes_test_ofb_pt[64] =
2183{
2184 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2185 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2186 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2187 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2188 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2189 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2190 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2191 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2192};
2193
2194static const unsigned char aes_test_ofb_ct[3][64] =
2195{
2196 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2197 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2198 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2199 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2200 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2201 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2202 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2203 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2204 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2205 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2206 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2207 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2208 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2209 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2210 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2211 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2212 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2213 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2214 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2215 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2216 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2217 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2218 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2219 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2220};
2221#endif /* MBEDTLS_CIPHER_MODE_OFB */
2222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002223#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002224/*
2225 * AES-CTR test vectors from:
2226 *
2227 * http://www.faqs.org/rfcs/rfc3686.html
2228 */
2229
2230static const unsigned char aes_test_ctr_key[3][16] =
2231{
2232 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2233 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2234 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2235 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2236 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2237 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2238};
2239
2240static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2241{
2242 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2244 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2245 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2246 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2247 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2248};
2249
2250static const unsigned char aes_test_ctr_pt[3][48] =
2251{
2252 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2253 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2254
2255 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2256 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2257 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2258 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2259
2260 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2261 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2262 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2263 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2264 0x20, 0x21, 0x22, 0x23 }
2265};
2266
2267static const unsigned char aes_test_ctr_ct[3][48] =
2268{
2269 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2270 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2271 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2272 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2273 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2274 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2275 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2276 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2277 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2278 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2279 0x25, 0xB2, 0x07, 0x2F }
2280};
2281
2282static const int aes_test_ctr_len[3] =
2283 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002285
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002286#if defined(MBEDTLS_CIPHER_MODE_XTS)
2287/*
2288 * AES-XTS test vectors from:
2289 *
2290 * IEEE P1619/D16 Annex B
2291 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2292 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2293 */
2294static const unsigned char aes_test_xts_key[][32] =
2295{
2296 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2300 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2301 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2302 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2303 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2304 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2305 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2306 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2307 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2308};
2309
2310static const unsigned char aes_test_xts_pt32[][32] =
2311{
2312 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2316 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2317 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2318 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2319 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2320 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2321 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2322 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2323 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2324};
2325
2326static const unsigned char aes_test_xts_ct32[][32] =
2327{
2328 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2329 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2330 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2331 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2332 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2333 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2334 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2335 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2336 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2337 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2338 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2339 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2340};
2341
2342static const unsigned char aes_test_xts_data_unit[][16] =
2343{
2344 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2346 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2348 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2350};
2351
2352#endif /* MBEDTLS_CIPHER_MODE_XTS */
2353
Paul Bakker5121ce52009-01-03 21:22:43 +00002354/*
2355 * Checkup routine
2356 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002357int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002358{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002359 int ret = 0, i, j, u, mode;
2360 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002361 unsigned char key[32];
2362 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002363 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002364#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002365 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002366#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002367#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002368 unsigned char prv[16];
2369#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002370#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2371 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002372 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002373#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002374#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002375 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002376#endif
2377#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002378 unsigned char nonce_counter[16];
2379 unsigned char stream_block[16];
2380#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002381 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002382
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002383 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002384 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002385
2386 /*
2387 * ECB mode
2388 */
2389 for( i = 0; i < 6; i++ )
2390 {
2391 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002392 keybits = 128 + u * 64;
2393 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
2395 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002396 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2397 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002398
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002399#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2400 if( keybits > 128 )
2401 {
2402 mbedtls_printf( "skipped\n" );
2403 continue;
2404 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002405#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2406
2407#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2408 if( mode == MBEDTLS_AES_DECRYPT )
2409 {
2410 mbedtls_printf( "skipped\n" );
2411 continue;
2412 }
2413#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002414
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002415 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002416
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002417 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002418 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002419 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2420 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002421 }
2422 else
2423 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002424 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2425 aes_tests = aes_test_ecb_enc[u];
2426 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002427
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002428 /*
2429 * AES-192 is an optional feature that may be unavailable when
2430 * there is an alternative underlying implementation i.e. when
2431 * MBEDTLS_AES_ALT is defined.
2432 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002433 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002434 {
2435 mbedtls_printf( "skipped\n" );
2436 continue;
2437 }
2438 else if( ret != 0 )
2439 {
2440 goto exit;
2441 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002442
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002443 for( j = 0; j < 10000; j++ )
2444 {
2445 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2446 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002447 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002448 }
2449
2450 if( memcmp( buf, aes_tests, 16 ) != 0 )
2451 {
2452 ret = 1;
2453 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 }
2455
2456 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002457 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002458 }
2459
2460 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002461 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002463#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002464 /*
2465 * CBC mode
2466 */
2467 for( i = 0; i < 6; i++ )
2468 {
2469 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002470 keybits = 128 + u * 64;
2471 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002472
2473 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002474 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2475 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002476
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002477#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2478 if( keybits > 128 )
2479 {
2480 mbedtls_printf( "skipped\n" );
2481 continue;
2482 }
2483#endif
2484
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002485#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2486 if( mode == MBEDTLS_AES_DECRYPT )
2487 {
2488 mbedtls_printf( "skipped\n" );
2489 continue;
2490 }
2491#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2492
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002493 memset( iv , 0, 16 );
2494 memset( prv, 0, 16 );
2495 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002496
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002497 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002498 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002499 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2500 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002501 }
2502 else
2503 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002504 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2505 aes_tests = aes_test_cbc_enc[u];
2506 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002507
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002508 /*
2509 * AES-192 is an optional feature that may be unavailable when
2510 * there is an alternative underlying implementation i.e. when
2511 * MBEDTLS_AES_ALT is defined.
2512 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002513 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002514 {
2515 mbedtls_printf( "skipped\n" );
2516 continue;
2517 }
2518 else if( ret != 0 )
2519 {
2520 goto exit;
2521 }
2522
2523 for( j = 0; j < 10000; j++ )
2524 {
2525 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002526 {
2527 unsigned char tmp[16];
2528
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002529 memcpy( tmp, prv, 16 );
2530 memcpy( prv, buf, 16 );
2531 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002532 }
2533
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002534 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2535 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002536 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002537
2538 }
2539
2540 if( memcmp( buf, aes_tests, 16 ) != 0 )
2541 {
2542 ret = 1;
2543 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002544 }
2545
2546 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002547 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002548 }
2549
2550 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002551 mbedtls_printf( "\n" );
2552#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002553
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002554#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002555 /*
2556 * CFB128 mode
2557 */
2558 for( i = 0; i < 6; i++ )
2559 {
2560 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002561 keybits = 128 + u * 64;
2562 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002563
2564 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002565 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2566 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002567
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002568#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2569 if( keybits > 128 )
2570 {
2571 mbedtls_printf( "skipped\n" );
2572 continue;
2573 }
2574#endif
2575
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002576#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2577 if( mode == MBEDTLS_AES_DECRYPT )
2578 {
2579 mbedtls_printf( "skipped\n" );
2580 continue;
2581 }
2582#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2583
Paul Bakker5121ce52009-01-03 21:22:43 +00002584 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002585 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002586
2587 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002588 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002589 /*
2590 * AES-192 is an optional feature that may be unavailable when
2591 * there is an alternative underlying implementation i.e. when
2592 * MBEDTLS_AES_ALT is defined.
2593 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002594 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002595 {
2596 mbedtls_printf( "skipped\n" );
2597 continue;
2598 }
2599 else if( ret != 0 )
2600 {
2601 goto exit;
2602 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002603
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002604 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002605 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002606 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002607 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002608 }
2609 else
2610 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002611 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002612 aes_tests = aes_test_cfb128_ct[u];
2613 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002614
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002615 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2616 if( ret != 0 )
2617 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002618
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002619 if( memcmp( buf, aes_tests, 64 ) != 0 )
2620 {
2621 ret = 1;
2622 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002623 }
2624
2625 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002626 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002627 }
2628
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002629 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002630 mbedtls_printf( "\n" );
2631#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002632
Simon Butcherad4e4932018-04-29 00:43:47 +01002633#if defined(MBEDTLS_CIPHER_MODE_OFB)
2634 /*
2635 * OFB mode
2636 */
2637 for( i = 0; i < 6; i++ )
2638 {
2639 u = i >> 1;
2640 keybits = 128 + u * 64;
2641 mode = i & 1;
2642
2643 if( verbose != 0 )
2644 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2645 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2646
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002647#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2648 if( keybits > 128 )
2649 {
2650 mbedtls_printf( "skipped\n" );
2651 continue;
2652 }
2653#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002654
2655#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2656 if( mode == MBEDTLS_AES_DECRYPT )
2657 {
2658 mbedtls_printf( "skipped\n" );
2659 continue;
2660 }
2661#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2662
Simon Butcherad4e4932018-04-29 00:43:47 +01002663 memcpy( iv, aes_test_ofb_iv, 16 );
2664 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2665
2666 offset = 0;
2667 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2668 /*
2669 * AES-192 is an optional feature that may be unavailable when
2670 * there is an alternative underlying implementation i.e. when
2671 * MBEDTLS_AES_ALT is defined.
2672 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002673 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002674 {
2675 mbedtls_printf( "skipped\n" );
2676 continue;
2677 }
2678 else if( ret != 0 )
2679 {
2680 goto exit;
2681 }
2682
2683 if( mode == MBEDTLS_AES_DECRYPT )
2684 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002685 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002686 aes_tests = aes_test_ofb_pt;
2687 }
2688 else
2689 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002690 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002691 aes_tests = aes_test_ofb_ct[u];
2692 }
2693
2694 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2695 if( ret != 0 )
2696 goto exit;
2697
2698 if( memcmp( buf, aes_tests, 64 ) != 0 )
2699 {
2700 ret = 1;
2701 goto exit;
2702 }
2703
2704 if( verbose != 0 )
2705 mbedtls_printf( "passed\n" );
2706 }
2707
2708 if( verbose != 0 )
2709 mbedtls_printf( "\n" );
2710#endif /* MBEDTLS_CIPHER_MODE_OFB */
2711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002712#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002713 /*
2714 * CTR mode
2715 */
2716 for( i = 0; i < 6; i++ )
2717 {
2718 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002719 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002720
2721 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002722 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002723 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002724
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002725#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2726 if( keybits > 128 )
2727 {
2728 mbedtls_printf( "skipped\n" );
2729 continue;
2730 }
2731#endif
2732
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002733#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2734 if( mode == MBEDTLS_AES_DECRYPT )
2735 {
2736 mbedtls_printf( "skipped\n" );
2737 continue;
2738 }
2739#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2740
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002741 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2742 memcpy( key, aes_test_ctr_key[u], 16 );
2743
2744 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002745 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2746 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002747
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002748 len = aes_test_ctr_len[u];
2749
2750 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002751 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002752 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002753 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002754 }
2755 else
2756 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002757 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002758 aes_tests = aes_test_ctr_ct[u];
2759 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002760
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002761 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2762 stream_block, buf, buf );
2763 if( ret != 0 )
2764 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002765
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002766 if( memcmp( buf, aes_tests, len ) != 0 )
2767 {
2768 ret = 1;
2769 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002770 }
2771
2772 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002773 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002774 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002775
2776 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002777 mbedtls_printf( "\n" );
2778#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002779
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002780#if defined(MBEDTLS_CIPHER_MODE_XTS)
2781 {
2782 static const int num_tests =
2783 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2784 mbedtls_aes_xts_context ctx_xts;
2785
2786 /*
2787 * XTS mode
2788 */
2789 mbedtls_aes_xts_init( &ctx_xts );
2790
2791 for( i = 0; i < num_tests << 1; i++ )
2792 {
2793 const unsigned char *data_unit;
2794 u = i >> 1;
2795 mode = i & 1;
2796
2797 if( verbose != 0 )
2798 mbedtls_printf( " AES-XTS-128 (%s): ",
2799 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2800
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002801#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2802 if( mode == MBEDTLS_AES_DECRYPT )
2803 {
2804 mbedtls_printf( "skipped\n" );
2805 continue;
2806 }
2807#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2808
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002809 memset( key, 0, sizeof( key ) );
2810 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002811 data_unit = aes_test_xts_data_unit[u];
2812
2813 len = sizeof( *aes_test_xts_ct32 );
2814
2815 if( mode == MBEDTLS_AES_DECRYPT )
2816 {
2817 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2818 if( ret != 0)
2819 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002820 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002821 aes_tests = aes_test_xts_pt32[u];
2822 }
2823 else
2824 {
2825 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2826 if( ret != 0)
2827 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002828 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002829 aes_tests = aes_test_xts_ct32[u];
2830 }
2831
2832
2833 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2834 buf, buf );
2835 if( ret != 0 )
2836 goto exit;
2837
2838 if( memcmp( buf, aes_tests, len ) != 0 )
2839 {
2840 ret = 1;
2841 goto exit;
2842 }
2843
2844 if( verbose != 0 )
2845 mbedtls_printf( "passed\n" );
2846 }
2847
2848 if( verbose != 0 )
2849 mbedtls_printf( "\n" );
2850
2851 mbedtls_aes_xts_free( &ctx_xts );
2852 }
2853#endif /* MBEDTLS_CIPHER_MODE_XTS */
2854
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002855 ret = 0;
2856
2857exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002858 if( ret != 0 && verbose != 0 )
2859 mbedtls_printf( "failed\n" );
2860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002861 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002862
2863 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002864}
2865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002866#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002867
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002868#endif /* MBEDTLS_AES_C */