blob: 8cfb4ba2f998dfc07e89a6ef7bbb43029baa71f6 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
23 *
24 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
25 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Rich Evans00ab4702015-02-06 13:43:58 +000036#include <string.h>
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030039#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050040#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_SELF_TEST)
49#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#else
Rich Evans00ab4702015-02-06 13:43:58 +000052#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#define mbedtls_printf printf
54#endif /* MBEDTLS_PLATFORM_C */
55#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010059/* Parameter validation macros based on platform_util.h */
60#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010061 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010062#define AES_VALIDATE( cond ) \
63 MBEDTLS_INTERNAL_VALIDATE( cond )
64
Paul Bakker5121ce52009-01-03 21:22:43 +000065/*
66 * 32-bit integer manipulation macros (little endian)
67 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef GET_UINT32_LE
69#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000071 (n) = ( (uint32_t) (b)[(i) ] ) \
72 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
73 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
74 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
76#endif
77
Paul Bakker5c2364c2012-10-01 14:41:15 +000078#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000079#define PUT_UINT32_LE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
82 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
83 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
84 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000085}
86#endif
87
Arto Kinnunen172836a2019-11-28 13:34:13 +020088/*
89 * Data structure for AES round data
90 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020091typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020092 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020093 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020094} aes_r_data_t;
95
96#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen17540ab2020-01-20 11:46:34 +020097/* Number of additional AES dummy rounds added for SCA countermeasures */
Arto Kinnunen98c93af2020-01-14 13:31:03 +020098#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +020099#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101#if defined(MBEDTLS_PADLOCK_C) && \
102 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000103static int aes_padlock_ace = -1;
104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000107/*
108 * Forward S-box
109 */
110static const unsigned char FSb[256] =
111{
112 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
113 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
114 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
115 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
116 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
117 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
118 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
119 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
120 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
121 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
122 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
123 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
124 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
125 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
126 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
127 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
128 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
129 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
130 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
131 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
132 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
133 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
134 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
135 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
136 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
137 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
138 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
139 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
140 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
141 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
142 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
143 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
144};
145
146/*
147 * Forward tables
148 */
149#define FT \
150\
151 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
152 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
153 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
154 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
155 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
156 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
157 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
158 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
159 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
160 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
161 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
162 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
163 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
164 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
165 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
166 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
167 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
168 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
169 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
170 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
171 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
172 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
173 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
174 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
175 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
176 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
177 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
178 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
179 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
180 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
181 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
182 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
183 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
184 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
185 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
186 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
187 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
188 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
189 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
190 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
191 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
192 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
193 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
194 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
195 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
196 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
197 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
198 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
199 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
200 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
201 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
202 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
203 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
204 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
205 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
206 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
207 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
208 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
209 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
210 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
211 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
212 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
213 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
214 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
215
216#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000217static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000218#undef V
219
Hanno Beckerad049a92017-06-19 16:31:54 +0100220#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200221
Paul Bakker5121ce52009-01-03 21:22:43 +0000222#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000223static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#undef V
225
226#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000227static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000228#undef V
229
230#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000231static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000232#undef V
233
Hanno Becker177d3cf2017-06-07 15:52:48 +0100234#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200235
Paul Bakker5121ce52009-01-03 21:22:43 +0000236#undef FT
237
Arto Kinnunen14804442019-10-16 13:43:59 +0300238#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000239/*
240 * Reverse S-box
241 */
242static const unsigned char RSb[256] =
243{
244 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
245 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
246 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
247 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
248 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
249 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
250 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
251 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
252 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
253 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
254 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
255 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
256 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
257 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
258 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
259 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
260 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
261 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
262 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
263 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
264 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
265 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
266 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
267 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
268 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
269 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
270 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
271 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
272 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
273 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
274 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
275 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
276};
Arto Kinnunen14804442019-10-16 13:43:59 +0300277#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
279/*
280 * Reverse tables
281 */
282#define RT \
283\
284 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
285 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
286 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
287 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
288 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
289 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
290 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
291 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
292 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
293 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
294 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
295 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
296 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
297 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
298 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
299 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
300 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
301 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
302 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
303 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
304 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
305 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
306 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
307 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
308 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
309 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
310 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
311 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
312 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
313 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
314 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
315 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
316 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
317 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
318 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
319 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
320 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
321 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
322 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
323 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
324 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
325 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
326 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
327 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
328 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
329 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
330 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
331 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
332 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
333 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
334 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
335 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
336 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
337 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
338 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
339 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
340 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
341 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
342 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
343 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
344 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
345 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
346 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
347 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
348
Arto Kinnunen14804442019-10-16 13:43:59 +0300349#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000350#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000351static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#undef V
353
Hanno Beckerad049a92017-06-19 16:31:54 +0100354#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#undef V
359
360#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000362#undef V
363
364#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000365static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000366#undef V
367
Hanno Becker177d3cf2017-06-07 15:52:48 +0100368#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300369#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200370
Paul Bakker5121ce52009-01-03 21:22:43 +0000371#undef RT
372
373/*
374 * Round constants
375 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000376static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
378 0x00000001, 0x00000002, 0x00000004, 0x00000008,
379 0x00000010, 0x00000020, 0x00000040, 0x00000080,
380 0x0000001B, 0x00000036
381};
382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385/*
386 * Forward S-box & tables
387 */
388static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200389static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100390#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT1[256];
392static uint32_t FT2[256];
393static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100394#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
396/*
397 * Reverse S-box & tables
398 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300399#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000400static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100402#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT1[256];
404static uint32_t RT2[256];
405static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100406#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300407#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
409/*
410 * Round constants
411 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000412static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000413
414/*
415 * Tables generation code
416 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100417#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
418#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100419#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
421static int aes_init_done = 0;
422
423static void aes_gen_tables( void )
424{
425 int i, x, y, z;
426 int pow[256];
427 int log[256];
428
429 /*
430 * compute pow and log tables over GF(2^8)
431 */
432 for( i = 0, x = 1; i < 256; i++ )
433 {
434 pow[i] = x;
435 log[x] = i;
436 x = ( x ^ XTIME( x ) ) & 0xFF;
437 }
438
439 /*
440 * calculate the round constants
441 */
442 for( i = 0, x = 1; i < 10; i++ )
443 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000444 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 x = XTIME( x ) & 0xFF;
446 }
447
448 /*
449 * generate the forward and reverse S-boxes
450 */
451 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300452#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000455
456 for( i = 1; i < 256; i++ )
457 {
458 x = pow[255 - log[i]];
459
Paul Bakker66d5d072014-06-17 16:39:18 +0200460 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
461 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
462 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 x ^= y ^ 0x63;
465
466 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300467#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 }
471
472 /*
473 * generate the forward and reverse tables
474 */
475 for( i = 0; i < 256; i++ )
476 {
477 x = FSb[i];
478 y = XTIME( x ) & 0xFF;
479 z = ( y ^ x ) & 0xFF;
480
Paul Bakker5c2364c2012-10-01 14:41:15 +0000481 FT0[i] = ( (uint32_t) y ) ^
482 ( (uint32_t) x << 8 ) ^
483 ( (uint32_t) x << 16 ) ^
484 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
Hanno Beckerad049a92017-06-19 16:31:54 +0100486#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 FT1[i] = ROTL8( FT0[i] );
488 FT2[i] = ROTL8( FT1[i] );
489 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100490#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300492#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000493 x = RSb[i];
494
Paul Bakker5c2364c2012-10-01 14:41:15 +0000495 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
496 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
497 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
498 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
Hanno Beckerad049a92017-06-19 16:31:54 +0100500#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000501 RT1[i] = ROTL8( RT0[i] );
502 RT2[i] = ROTL8( RT1[i] );
503 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100504#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300505#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 }
507}
508
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200509#undef ROTL8
510
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Arto Kinnunen172836a2019-11-28 13:34:13 +0200513/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200514 * Randomize positions for AES SCA countermeasures if AES countermeasures are
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200515 * enabled. If the countermeasures are not enabled then we fill the given table
516 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200517 *
518 * Dummy rounds are added as follows:
519 * 1. One dummy round added to the initial round key addition (executed in
520 * random order).
521 * 2. Random number of dummy rounds added as first and/or last AES calculation
522 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
523 *
524 * Description of the bytes in the table are as follows:
525 * - 2 bytes for initial round key addition
526 * - remaining bytes for AES calculation with real or dummy data
527 *
528 * Each byte indicates one AES calculation round:
529 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
530 * -bit 2 = offset for even/odd rounds
531 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200532 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200533 * Return Number of additional AES rounds
534 *
535 * Example of the control bytes:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200536 * R = real data in actual AES calculation round
537 * Ri = Real data in initial round key addition phase
538 * F = fake data in actual AES calculation round
539 * Fi = fake data in initial round key addition phase
540 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200541 * 1. No countermeasures enabled and AES-128, only real data (R) used:
542 * | Ri | R | R | R | R | R | R | R | R | R | R |
543 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200544 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200545 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200546 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
547 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200548 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200549#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200550static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200551{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200552 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200553
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200554 mbedtls_platform_memset( tbl, 0, tbl_len );
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200555 // get random from 0x0fff (each f will be used separately)
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200556 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200557
558 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200559 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200560 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561 tbl[i++] = 0x10; // dummy data
562 tbl[i++] = 0x00 | 0x03; // real data + stop marker
563 } else {
564 tbl[i++] = 0x00; // real data
565 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200568 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200569 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200570 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200571
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 // randomize positions for the dummy rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200573 num = ( num & 0x000f ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200574
575 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200577 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200579 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200580
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200581 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200582 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200583 {
584 tbl[j] = 0x10; // dummy data
585 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200586
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200587 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200588 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200591 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200593 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200595 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 is_even_pos = 0;
597 }
598 else
599 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200600 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200601 is_even_pos = 1;
602 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200603 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200604 }
605 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200606
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200607 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
608 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
609
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200610 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200611}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200612#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200613
Hanno Beckerad049a92017-06-19 16:31:54 +0100614#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200615
616#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
617#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
618#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
619
620#define AES_RT0(idx) RT0[idx]
621#define AES_RT1(idx) ROTL8( RT0[idx] )
622#define AES_RT2(idx) ROTL16( RT0[idx] )
623#define AES_RT3(idx) ROTL24( RT0[idx] )
624
625#define AES_FT0(idx) FT0[idx]
626#define AES_FT1(idx) ROTL8( FT0[idx] )
627#define AES_FT2(idx) ROTL16( FT0[idx] )
628#define AES_FT3(idx) ROTL24( FT0[idx] )
629
Hanno Becker177d3cf2017-06-07 15:52:48 +0100630#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200631
632#define AES_RT0(idx) RT0[idx]
633#define AES_RT1(idx) RT1[idx]
634#define AES_RT2(idx) RT2[idx]
635#define AES_RT3(idx) RT3[idx]
636
637#define AES_FT0(idx) FT0[idx]
638#define AES_FT1(idx) FT1[idx]
639#define AES_FT2(idx) FT2[idx]
640#define AES_FT3(idx) FT3[idx]
641
Hanno Becker177d3cf2017-06-07 15:52:48 +0100642#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200645{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100646 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000647
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200648 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649}
650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200652{
653 if( ctx == NULL )
654 return;
655
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500656 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200657}
658
Jaeden Amero9366feb2018-05-29 18:55:17 +0100659#if defined(MBEDTLS_CIPHER_MODE_XTS)
660void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
661{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100662 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000663
Jaeden Amero9366feb2018-05-29 18:55:17 +0100664 mbedtls_aes_init( &ctx->crypt );
665 mbedtls_aes_init( &ctx->tweak );
666}
667
668void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
669{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100670 if( ctx == NULL )
671 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000672
Jaeden Amero9366feb2018-05-29 18:55:17 +0100673 mbedtls_aes_free( &ctx->crypt );
674 mbedtls_aes_free( &ctx->tweak );
675}
676#endif /* MBEDTLS_CIPHER_MODE_XTS */
677
Paul Bakker5121ce52009-01-03 21:22:43 +0000678/*
679 * AES key schedule (encryption)
680 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200681#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200683 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000684{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200685 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200686 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200687 volatile unsigned int i = 0;
688 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400689 volatile const unsigned char *key_dup = key;
690 volatile unsigned int keybits_dup = keybits;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000691 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200692 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000693
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100694 AES_VALIDATE_RET( ctx != NULL );
695 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000696
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200697 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000698 {
699 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300700#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000701 case 192: ctx->nr = 12; break;
702 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300703#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200704 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000705 }
706
Simon Butcher5201e412018-12-06 17:40:14 +0000707#if !defined(MBEDTLS_AES_ROM_TABLES)
708 if( aes_init_done == 0 )
709 {
710 aes_gen_tables();
711 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000712 }
713#endif
714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000716 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100717 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000718
719 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000721 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000722#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000723 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100726 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200727 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100728#endif
729
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200730 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
731 offset = mbedtls_platform_random_in_range( keybits >> 5 );
732
733 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000734 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200735 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200736 flow_ctrl++;
737 }
738
739 for( j = 0; j < offset; j++ )
740 {
741 GET_UINT32_LE( RK[j], key, j << 2 );
742 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000743 }
744
745 switch( ctx->nr )
746 {
747 case 10:
748
749 for( i = 0; i < 10; i++, RK += 4 )
750 {
751 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000752 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
753 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
754 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
755 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000756
757 RK[5] = RK[1] ^ RK[4];
758 RK[6] = RK[2] ^ RK[5];
759 RK[7] = RK[3] ^ RK[6];
760 }
761 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300762#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000763 case 12:
764
765 for( i = 0; i < 8; i++, RK += 6 )
766 {
767 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000768 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
769 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
770 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
771 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
773 RK[7] = RK[1] ^ RK[6];
774 RK[8] = RK[2] ^ RK[7];
775 RK[9] = RK[3] ^ RK[8];
776 RK[10] = RK[4] ^ RK[9];
777 RK[11] = RK[5] ^ RK[10];
778 }
779 break;
780
781 case 14:
782
783 for( i = 0; i < 7; i++, RK += 8 )
784 {
785 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000786 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
787 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
788 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
789 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000790
791 RK[9] = RK[1] ^ RK[8];
792 RK[10] = RK[2] ^ RK[9];
793 RK[11] = RK[3] ^ RK[10];
794
795 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000796 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
797 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
798 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
799 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000800
801 RK[13] = RK[5] ^ RK[12];
802 RK[14] = RK[6] ^ RK[13];
803 RK[15] = RK[7] ^ RK[14];
804 }
805 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300806#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000807 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000808
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200809 ret = 0;
810
811 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200812 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200813#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
814 || ( ctx->nr == 12 && i == 8 )
815 || ( ctx->nr == 14 && i == 7 )
816#endif
817 ) )
818 {
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400819 if( keybits_dup == keybits && key_dup == key )
820 {
821 return ret;
822 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200823 }
824
825 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000826}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200827#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000828
829/*
830 * AES key schedule (decryption)
831 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200832#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200834 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000835{
Arto Kinnunen14804442019-10-16 13:43:59 +0300836#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
837 (void) ctx;
838 (void) key;
839 (void) keybits;
840
841 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
842#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200843 volatile unsigned int i = 0, j = 0;
844 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000846 uint32_t *RK;
847 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200848
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100849 AES_VALIDATE_RET( ctx != NULL );
850 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000853
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000855 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100856 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000857
858 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200859 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000860 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000861#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000862 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000863
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200864 /* Also checks keybits */
865 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200866 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000867
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200868 ctx->nr = cty.nr;
869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100871 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100872 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100874 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200875 i = 0;
876 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200877 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100878 }
879#endif
880
Paul Bakker5121ce52009-01-03 21:22:43 +0000881 SK = cty.rk + cty.nr * 4;
882
883 *RK++ = *SK++;
884 *RK++ = *SK++;
885 *RK++ = *SK++;
886 *RK++ = *SK++;
887
888 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
889 {
890 for( j = 0; j < 4; j++, SK++ )
891 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200892 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
893 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
894 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
895 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000896 }
897 }
898
899 *RK++ = *SK++;
900 *RK++ = *SK++;
901 *RK++ = *SK++;
902 *RK++ = *SK++;
903
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200904exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000906
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200907 if( ret != 0 )
908 {
909 return( ret );
910 }
911 else if( ( i == 0 ) && ( j == 4 ) )
912 {
913 return( ret );
914 }
915 else
916 {
917 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
918 }
919
Arto Kinnunen14804442019-10-16 13:43:59 +0300920#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000921}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100922
923#if defined(MBEDTLS_CIPHER_MODE_XTS)
924static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
925 unsigned int keybits,
926 const unsigned char **key1,
927 unsigned int *key1bits,
928 const unsigned char **key2,
929 unsigned int *key2bits )
930{
931 const unsigned int half_keybits = keybits / 2;
932 const unsigned int half_keybytes = half_keybits / 8;
933
934 switch( keybits )
935 {
936 case 256: break;
937 case 512: break;
938 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
939 }
940
941 *key1bits = half_keybits;
942 *key2bits = half_keybits;
943 *key1 = &key[0];
944 *key2 = &key[half_keybytes];
945
946 return 0;
947}
948
949int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
950 const unsigned char *key,
951 unsigned int keybits)
952{
953 int ret;
954 const unsigned char *key1, *key2;
955 unsigned int key1bits, key2bits;
956
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100957 AES_VALIDATE_RET( ctx != NULL );
958 AES_VALIDATE_RET( key != NULL );
959
Jaeden Amero9366feb2018-05-29 18:55:17 +0100960 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
961 &key2, &key2bits );
962 if( ret != 0 )
963 return( ret );
964
965 /* Set the tweak key. Always set tweak key for the encryption mode. */
966 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
967 if( ret != 0 )
968 return( ret );
969
970 /* Set crypt key for encryption. */
971 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
972}
973
974int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
975 const unsigned char *key,
976 unsigned int keybits)
977{
978 int ret;
979 const unsigned char *key1, *key2;
980 unsigned int key1bits, key2bits;
981
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100982 AES_VALIDATE_RET( ctx != NULL );
983 AES_VALIDATE_RET( key != NULL );
984
Jaeden Amero9366feb2018-05-29 18:55:17 +0100985 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
986 &key2, &key2bits );
987 if( ret != 0 )
988 return( ret );
989
990 /* Set the tweak key. Always set tweak key for encryption. */
991 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
992 if( ret != 0 )
993 return( ret );
994
995 /* Set crypt key for decryption. */
996 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
997}
998#endif /* MBEDTLS_CIPHER_MODE_XTS */
999
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001000#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001001
Paul Bakker5121ce52009-01-03 21:22:43 +00001002/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001003 * AES-ECB block encryption
1004 */
1005#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001006
Arto Kinnunen311ab592020-01-16 17:20:51 +02001007#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001008static uint32_t *aes_fround( uint32_t *R,
1009 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1010 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1011{
1012 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1013 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1014 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1015 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1016
1017 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1018 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1019 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1020 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1021
1022 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1023 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1024 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1025 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1026
1027 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1028 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1029 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1030 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1031
1032 return R;
1033}
1034
1035static void aes_fround_final( uint32_t *R,
1036 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1037 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1038{
1039 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1040 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1041 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1042 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1043
1044 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1045 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1046 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1047 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1048
1049 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1050 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1051 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1052 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1053
1054 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1055 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1056 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1057 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1058}
1059
Andres AGf5bf7182017-03-03 14:09:56 +00001060int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1061 const unsigned char input[16],
1062 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001063{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001064 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001065 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001066 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001067 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001068 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001069 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001070 volatile int flow_control;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001071 volatile const unsigned char *input_dup = input;
1072 volatile unsigned char *output_dup = output;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001073 // control bytes for AES calculation rounds,
1074 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1075 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001076
Arto Kinnunen172836a2019-11-28 13:34:13 +02001077 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001078 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001079 aes_data_table[0] = &aes_data_real;
1080 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001081
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001082 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001083 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1084 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001085 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001086
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001087 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001088 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001089
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001090 // SCA countermeasure, randomize secret data location by initializing it in
1091 // a random order and writing randomized fake data between the real data
1092 // writes.
1093 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001094 i = offset;
1095 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001096 {
1097 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001098 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001099 flow_control++;
1100 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001101
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001102 tindex = 0;
1103 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001104 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001105 // Get pointer to the real or fake data
1106 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1107 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001108
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001109 // initial round key addition
1110 for( i = 0; i < 4; i++ )
1111 {
1112 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1113 }
1114 tindex++;
1115 flow_control++;
1116 } while( stop_mark == 0 );
1117
1118 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1119 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001120 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001121 // Get pointer to the real or fake data
1122 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1123 offset = round_ctrl_table[tindex] & 0x04;
1124 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001125
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001126 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1127 &aes_data_ptr->xy_values[0 + offset],
1128 &aes_data_ptr->xy_values[1 + offset],
1129 &aes_data_ptr->xy_values[2 + offset],
1130 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001131 aes_data_ptr->xy_values[4 - offset],
1132 aes_data_ptr->xy_values[5 - offset],
1133 aes_data_ptr->xy_values[6 - offset],
1134 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001135 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001136 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001137 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001138
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001139 // Calculate final AES round + dummy rounds
1140 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001141 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001142 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1143 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001144 aes_fround_final( aes_data_ptr->rk_ptr,
1145 &aes_data_ptr->xy_values[0],
1146 &aes_data_ptr->xy_values[1],
1147 &aes_data_ptr->xy_values[2],
1148 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001149 aes_data_ptr->xy_values[4],
1150 aes_data_ptr->xy_values[5],
1151 aes_data_ptr->xy_values[6],
1152 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001153 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001154 tindex++;
1155 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001156
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001157 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001158 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001159
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001160 // SCA countermeasure, randomize secret data location by writing to it in
1161 // a random order.
1162 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001163 i = offset;
1164 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001165 {
1166 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1167 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001168 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001169
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001170 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001171 {
1172 /* Validate control path due possible fault injection */
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001173 if( output_dup == output && input_dup == input )
1174 {
1175 return 0;
1176 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001177 }
1178
1179 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001180}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001181
1182#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1183
1184#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1185 do \
1186 { \
1187 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1188 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1189 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1190 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1191 \
1192 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1193 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1194 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1195 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1196 \
1197 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1198 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1199 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1200 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1201 \
1202 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1203 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1204 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1205 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1206 } while( 0 )
1207
1208int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1209 const unsigned char input[16],
1210 unsigned char output[16] )
1211{
1212 int i;
1213 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1214
1215 RK = ctx->rk;
1216
1217 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1218 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1219 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1220 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1221
1222 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1223 {
1224 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1225 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1226 }
1227
1228 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1229
1230 X0 = *RK++ ^ \
1231 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1232 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1233 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1234 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1235
1236 X1 = *RK++ ^ \
1237 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1238 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1239 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1240 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1241
1242 X2 = *RK++ ^ \
1243 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1244 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1245 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1246 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1247
1248 X3 = *RK++ ^ \
1249 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1250 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1251 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1252 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1253
1254 PUT_UINT32_LE( X0, output, 0 );
1255 PUT_UINT32_LE( X1, output, 4 );
1256 PUT_UINT32_LE( X2, output, 8 );
1257 PUT_UINT32_LE( X3, output, 12 );
1258
Andrzej Kureka8405442019-11-12 03:34:03 -05001259 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1260 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1261 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1262 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1263
1264 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1265 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1266 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1267 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1268
1269 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1270
Arto Kinnunen311ab592020-01-16 17:20:51 +02001271 return( 0 );
1272}
1273#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001274#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1275
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001276#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001277void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1278 const unsigned char input[16],
1279 unsigned char output[16] )
1280{
1281 mbedtls_internal_aes_encrypt( ctx, input, output );
1282}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001283#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001284
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001285/*
1286 * AES-ECB block decryption
1287 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001288
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001289#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001290#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001291
Arto Kinnunen311ab592020-01-16 17:20:51 +02001292#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001293static uint32_t *aes_rround( uint32_t *R,
1294 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1295 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1296{
1297 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1298 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1299 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1300 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1301
1302 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1303 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1304 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1305 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1306
1307 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1308 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1309 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1310 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1311
1312 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1313 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1314 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1315 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1316 return R;
1317}
1318
1319static void aes_rround_final( uint32_t *R,
1320 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1321 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1322{
1323 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1324 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1325 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1326 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1327
1328 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1329 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1330 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1331 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1332
1333 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1334 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1335 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1336 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1337
1338 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1339 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1340 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1341 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1342}
1343
Andres AGf5bf7182017-03-03 14:09:56 +00001344int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1345 const unsigned char input[16],
1346 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001347{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001348 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001349 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001350 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001351 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001352 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001353 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001354 volatile int flow_control;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001355 volatile const unsigned char *input_dup = input;
1356 volatile unsigned char *output_dup = output;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001357 // control bytes for AES calculation rounds,
1358 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1359 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001360
Arto Kinnunen172836a2019-11-28 13:34:13 +02001361 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001362 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001363 aes_data_table[0] = &aes_data_real;
1364 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001365
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001366 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001367 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001368 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001369 flow_control = dummy_rounds;
1370
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001371 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001372 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001373
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001374 // SCA countermeasure, randomize secret data location by initializing it in
1375 // a random order and writing randomized fake data between the real data
1376 // writes.
1377 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001378 i = offset;
1379 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001380 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001381 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001382 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001383 flow_control++;
1384 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001385
1386 tindex = 0;
1387 do
1388 {
1389 // Get pointer to the real or fake data
1390 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1391 stop_mark = round_ctrl_table[tindex] & 0x03;
1392
1393 // initial round key addition
1394 for( i = 0; i < 4; i++ )
1395 {
1396 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1397 }
1398 tindex++;
1399 flow_control++;
1400 } while( stop_mark == 0 );
1401
1402 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1403 do
1404 {
1405 // Get pointer to the real or fake data
1406 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1407 offset = round_ctrl_table[tindex] & 0x04;
1408 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001409
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001410 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1411 &aes_data_ptr->xy_values[0 + offset],
1412 &aes_data_ptr->xy_values[1 + offset],
1413 &aes_data_ptr->xy_values[2 + offset],
1414 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001415 aes_data_ptr->xy_values[4 - offset],
1416 aes_data_ptr->xy_values[5 - offset],
1417 aes_data_ptr->xy_values[6 - offset],
1418 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001419 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001420 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001421 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001422
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001423 // Calculate final AES round + dummy rounds
1424 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001425 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001426 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1427 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001428 aes_rround_final( aes_data_ptr->rk_ptr,
1429 &aes_data_ptr->xy_values[0],
1430 &aes_data_ptr->xy_values[1],
1431 &aes_data_ptr->xy_values[2],
1432 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001433 aes_data_ptr->xy_values[4],
1434 aes_data_ptr->xy_values[5],
1435 aes_data_ptr->xy_values[6],
1436 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001437 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001438 tindex++;
1439 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001440
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001441 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001442 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001443
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001444 // SCA countermeasure, randomize secret data location by writing to it in
1445 // a random order.
1446 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001447 i = offset;
1448 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001449 {
1450 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001451 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001452 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001453
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001454 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001455 {
1456 /* Validate control path due possible fault injection */
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -04001457 if( output_dup == output && input_dup == input )
1458 {
1459 return 0;
1460 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001461 }
1462
1463 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001464}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001465
1466#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1467
1468#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1469 do \
1470 { \
1471 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1472 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1473 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1474 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1475 \
1476 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1477 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1478 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1479 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1480 \
1481 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1482 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1483 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1484 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1485 \
1486 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1487 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1488 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1489 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1490 } while( 0 )
1491
1492int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1493 const unsigned char input[16],
1494 unsigned char output[16] )
1495{
1496 int i;
1497 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1498
1499 RK = ctx->rk;
1500
1501 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1502 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1503 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1504 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1505
1506 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1507 {
1508 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1509 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1510 }
1511
1512 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1513
1514 X0 = *RK++ ^ \
1515 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1516 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1517 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1518 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1519
1520 X1 = *RK++ ^ \
1521 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1522 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1523 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1524 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1525
1526 X2 = *RK++ ^ \
1527 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1528 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1529 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1530 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1531
1532 X3 = *RK++ ^ \
1533 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1534 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1535 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1536 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1537
1538 PUT_UINT32_LE( X0, output, 0 );
1539 PUT_UINT32_LE( X1, output, 4 );
1540 PUT_UINT32_LE( X2, output, 8 );
1541 PUT_UINT32_LE( X3, output, 12 );
1542
Andrzej Kureka8405442019-11-12 03:34:03 -05001543 mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
1544 mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
1545 mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
1546 mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
1547
1548 mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
1549 mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
1550 mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
1551 mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
1552
1553 mbedtls_platform_zeroize( &RK, sizeof( RK ) );
1554
Arto Kinnunen311ab592020-01-16 17:20:51 +02001555 return( 0 );
1556}
1557#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1558
Arto Kinnunen14804442019-10-16 13:43:59 +03001559#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001560#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1561
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001562#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001563void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1564 const unsigned char input[16],
1565 unsigned char output[16] )
1566{
Arto Kinnunen14804442019-10-16 13:43:59 +03001567#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1568 (void) ctx;
1569 (void) input;
1570 (void) output;
1571#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001572 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001573#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001574}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001575#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001576
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001577/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001578 * AES-ECB block encryption/decryption
1579 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001580int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001581 int mode,
1582 const unsigned char input[16],
1583 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001584{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001585 AES_VALIDATE_RET( ctx != NULL );
1586 AES_VALIDATE_RET( input != NULL );
1587 AES_VALIDATE_RET( output != NULL );
1588 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1589 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001590 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001592#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001593 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001594 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001595#endif
1596
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001597#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001598 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001599 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001600 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001601 return( 0 );
1602
1603 // If padlock data misaligned, we just fall back to
1604 // unaccelerated mode
1605 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001606 }
1607#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001608
Arto Kinnunen14804442019-10-16 13:43:59 +03001609#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1610 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1611#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001612
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001613 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001614 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001615 else
Andres AGf5bf7182017-03-03 14:09:56 +00001616 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001617#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001618}
1619
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001620#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001621/*
1622 * AES-CBC buffer encryption/decryption
1623 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001624int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001625 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001626 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001627 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001628 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001629 unsigned char *output )
1630{
1631 int i;
1632 unsigned char temp[16];
1633
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001634 AES_VALIDATE_RET( ctx != NULL );
1635 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1636 mode == MBEDTLS_AES_DECRYPT );
1637 AES_VALIDATE_RET( iv != NULL );
1638 AES_VALIDATE_RET( input != NULL );
1639 AES_VALIDATE_RET( output != NULL );
1640
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001641 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001642 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001644#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001645 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001646 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001647 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001648 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001649
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001650 // If padlock data misaligned, we just fall back to
1651 // unaccelerated mode
1652 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001653 }
1654#endif
1655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001657 {
1658 while( length > 0 )
1659 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001660 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001661 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001662
1663 for( i = 0; i < 16; i++ )
1664 output[i] = (unsigned char)( output[i] ^ iv[i] );
1665
Teppo Järvelin91d79382019-10-02 09:09:31 +03001666 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001667
1668 input += 16;
1669 output += 16;
1670 length -= 16;
1671 }
1672 }
1673 else
1674 {
1675 while( length > 0 )
1676 {
1677 for( i = 0; i < 16; i++ )
1678 output[i] = (unsigned char)( input[i] ^ iv[i] );
1679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001680 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001681 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001682
1683 input += 16;
1684 output += 16;
1685 length -= 16;
1686 }
1687 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001688
1689 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001690}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
Aorimn5f778012016-06-09 23:22:58 +02001693#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001694
1695/* Endianess with 64 bits values */
1696#ifndef GET_UINT64_LE
1697#define GET_UINT64_LE(n,b,i) \
1698{ \
1699 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1700 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1701 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1702 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1703 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1704 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1705 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1706 | ( (uint64_t) (b)[(i) ] ); \
1707}
1708#endif
1709
1710#ifndef PUT_UINT64_LE
1711#define PUT_UINT64_LE(n,b,i) \
1712{ \
1713 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1714 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1715 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1716 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1717 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1718 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1719 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1720 (b)[(i) ] = (unsigned char) ( (n) ); \
1721}
1722#endif
1723
1724typedef unsigned char mbedtls_be128[16];
1725
1726/*
1727 * GF(2^128) multiplication function
1728 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001729 * This function multiplies a field element by x in the polynomial field
1730 * representation. It uses 64-bit word operations to gain speed but compensates
1731 * for machine endianess and hence works correctly on both big and little
1732 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001733 */
1734static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001735 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001736{
1737 uint64_t a, b, ra, rb;
1738
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001739 GET_UINT64_LE( a, x, 0 );
1740 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001741
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001742 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1743 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001744
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001745 PUT_UINT64_LE( ra, r, 0 );
1746 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001747}
1748
Aorimn5f778012016-06-09 23:22:58 +02001749/*
1750 * AES-XTS buffer encryption/decryption
1751 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001752int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1753 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001754 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001755 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001756 const unsigned char *input,
1757 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001758{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001759 int ret;
1760 size_t blocks = length / 16;
1761 size_t leftover = length % 16;
1762 unsigned char tweak[16];
1763 unsigned char prev_tweak[16];
1764 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001765
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001766 AES_VALIDATE_RET( ctx != NULL );
1767 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1768 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001769 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001770 AES_VALIDATE_RET( input != NULL );
1771 AES_VALIDATE_RET( output != NULL );
1772
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001773 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001774 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001775 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001776
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001777 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001778 if( length > ( 1 << 20 ) * 16 )
1779 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001780
Jaeden Amerod82cd862018-04-28 15:02:45 +01001781 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001782 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1783 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001784 if( ret != 0 )
1785 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001786
Jaeden Amerod82cd862018-04-28 15:02:45 +01001787 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001788 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001789 size_t i;
1790
1791 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1792 {
1793 /* We are on the last block in a decrypt operation that has
1794 * leftover bytes, so we need to use the next tweak for this block,
1795 * and this tweak for the lefover bytes. Save the current tweak for
1796 * the leftovers and then update the current tweak for use on this,
1797 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001798 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001799 mbedtls_gf128mul_x_ble( tweak, tweak );
1800 }
1801
1802 for( i = 0; i < 16; i++ )
1803 tmp[i] = input[i] ^ tweak[i];
1804
1805 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1806 if( ret != 0 )
1807 return( ret );
1808
1809 for( i = 0; i < 16; i++ )
1810 output[i] = tmp[i] ^ tweak[i];
1811
1812 /* Update the tweak for the next block. */
1813 mbedtls_gf128mul_x_ble( tweak, tweak );
1814
1815 output += 16;
1816 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001817 }
1818
Jaeden Amerod82cd862018-04-28 15:02:45 +01001819 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001820 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001821 /* If we are on the leftover bytes in a decrypt operation, we need to
1822 * use the previous tweak for these bytes (as saved in prev_tweak). */
1823 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001824
Jaeden Amerod82cd862018-04-28 15:02:45 +01001825 /* We are now on the final part of the data unit, which doesn't divide
1826 * evenly by 16. It's time for ciphertext stealing. */
1827 size_t i;
1828 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001829
Jaeden Amerod82cd862018-04-28 15:02:45 +01001830 /* Copy ciphertext bytes from the previous block to our output for each
1831 * byte of cyphertext we won't steal. At the same time, copy the
1832 * remainder of the input for this final round (since the loop bounds
1833 * are the same). */
1834 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001835 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001836 output[i] = prev_output[i];
1837 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001838 }
Aorimn5f778012016-06-09 23:22:58 +02001839
Jaeden Amerod82cd862018-04-28 15:02:45 +01001840 /* Copy ciphertext bytes from the previous block for input in this
1841 * round. */
1842 for( ; i < 16; i++ )
1843 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001844
Jaeden Amerod82cd862018-04-28 15:02:45 +01001845 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1846 if( ret != 0 )
1847 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001848
Jaeden Amerod82cd862018-04-28 15:02:45 +01001849 /* Write the result back to the previous block, overriding the previous
1850 * output we copied. */
1851 for( i = 0; i < 16; i++ )
1852 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001853 }
1854
1855 return( 0 );
1856}
1857#endif /* MBEDTLS_CIPHER_MODE_XTS */
1858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001860/*
1861 * AES-CFB128 buffer encryption/decryption
1862 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001863int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001864 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001865 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001866 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001867 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001868 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001869 unsigned char *output )
1870{
Paul Bakker27fdf462011-06-09 13:55:13 +00001871 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001872 size_t n;
1873
1874 AES_VALIDATE_RET( ctx != NULL );
1875 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1876 mode == MBEDTLS_AES_DECRYPT );
1877 AES_VALIDATE_RET( iv_off != NULL );
1878 AES_VALIDATE_RET( iv != NULL );
1879 AES_VALIDATE_RET( input != NULL );
1880 AES_VALIDATE_RET( output != NULL );
1881
1882 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001883
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001884 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001885 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1886
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001887 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001888 {
1889 while( length-- )
1890 {
1891 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001892 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001893
1894 c = *input++;
1895 *output++ = (unsigned char)( c ^ iv[n] );
1896 iv[n] = (unsigned char) c;
1897
Paul Bakker66d5d072014-06-17 16:39:18 +02001898 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001899 }
1900 }
1901 else
1902 {
1903 while( length-- )
1904 {
1905 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001906 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001907
1908 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1909
Paul Bakker66d5d072014-06-17 16:39:18 +02001910 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001911 }
1912 }
1913
1914 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001915
1916 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001917}
Paul Bakker556efba2014-01-24 15:38:12 +01001918
1919/*
1920 * AES-CFB8 buffer encryption/decryption
1921 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001922int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001923 int mode,
1924 size_t length,
1925 unsigned char iv[16],
1926 const unsigned char *input,
1927 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001928{
1929 unsigned char c;
1930 unsigned char ov[17];
1931
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001932 AES_VALIDATE_RET( ctx != NULL );
1933 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1934 mode == MBEDTLS_AES_DECRYPT );
1935 AES_VALIDATE_RET( iv != NULL );
1936 AES_VALIDATE_RET( input != NULL );
1937 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001938 while( length-- )
1939 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001940 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001941 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001943 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001944 ov[16] = *input;
1945
1946 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001949 ov[16] = c;
1950
Teppo Järvelin91d79382019-10-02 09:09:31 +03001951 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001952 }
1953
1954 return( 0 );
1955}
Simon Butcher76a5b222018-04-22 22:57:27 +01001956#endif /* MBEDTLS_CIPHER_MODE_CFB */
1957
1958#if defined(MBEDTLS_CIPHER_MODE_OFB)
1959/*
1960 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1961 */
1962int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001963 size_t length,
1964 size_t *iv_off,
1965 unsigned char iv[16],
1966 const unsigned char *input,
1967 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001968{
Simon Butcherad4e4932018-04-29 00:43:47 +01001969 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001970 size_t n;
1971
1972 AES_VALIDATE_RET( ctx != NULL );
1973 AES_VALIDATE_RET( iv_off != NULL );
1974 AES_VALIDATE_RET( iv != NULL );
1975 AES_VALIDATE_RET( input != NULL );
1976 AES_VALIDATE_RET( output != NULL );
1977
1978 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001979
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001980 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001981 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1982
Simon Butcher76a5b222018-04-22 22:57:27 +01001983 while( length-- )
1984 {
1985 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001986 {
1987 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1988 if( ret != 0 )
1989 goto exit;
1990 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001991 *output++ = *input++ ^ iv[n];
1992
1993 n = ( n + 1 ) & 0x0F;
1994 }
1995
1996 *iv_off = n;
1997
Simon Butcherad4e4932018-04-29 00:43:47 +01001998exit:
1999 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01002000}
2001#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002002
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002003#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002004/*
2005 * AES-CTR buffer encryption/decryption
2006 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002007int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00002008 size_t length,
2009 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002010 unsigned char nonce_counter[16],
2011 unsigned char stream_block[16],
2012 const unsigned char *input,
2013 unsigned char *output )
2014{
Paul Bakker369e14b2012-04-18 14:16:09 +00002015 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01002016 size_t n;
2017
2018 AES_VALIDATE_RET( ctx != NULL );
2019 AES_VALIDATE_RET( nc_off != NULL );
2020 AES_VALIDATE_RET( nonce_counter != NULL );
2021 AES_VALIDATE_RET( stream_block != NULL );
2022 AES_VALIDATE_RET( input != NULL );
2023 AES_VALIDATE_RET( output != NULL );
2024
2025 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002026
Arto Kinnunen75439012019-12-03 14:12:10 +02002027 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00002028 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
2029
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002030 while( length-- )
2031 {
2032 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002033 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002034
Paul Bakker369e14b2012-04-18 14:16:09 +00002035 for( i = 16; i > 0; i-- )
2036 if( ++nonce_counter[i - 1] != 0 )
2037 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002038 }
2039 c = *input++;
2040 *output++ = (unsigned char)( c ^ stream_block[n] );
2041
Paul Bakker66d5d072014-06-17 16:39:18 +02002042 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002043 }
2044
2045 *nc_off = n;
2046
2047 return( 0 );
2048}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002049#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002050
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002051#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002054/*
2055 * AES test vectors from:
2056 *
2057 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2058 */
2059static const unsigned char aes_test_ecb_dec[3][16] =
2060{
2061 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2062 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2063 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2064 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2065 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2066 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2067};
2068
2069static const unsigned char aes_test_ecb_enc[3][16] =
2070{
2071 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2072 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2073 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2074 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2075 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2076 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2077};
2078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002079#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002080static const unsigned char aes_test_cbc_dec[3][16] =
2081{
2082 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2083 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2084 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2085 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2086 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2087 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2088};
2089
2090static const unsigned char aes_test_cbc_enc[3][16] =
2091{
2092 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2093 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2094 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2095 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2096 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2097 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2098};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002099#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002101#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002102/*
2103 * AES-CFB128 test vectors from:
2104 *
2105 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2106 */
2107static const unsigned char aes_test_cfb128_key[3][32] =
2108{
2109 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2110 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2111 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2112 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2113 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2114 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2115 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2116 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2117 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2118};
2119
2120static const unsigned char aes_test_cfb128_iv[16] =
2121{
2122 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2123 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2124};
2125
2126static const unsigned char aes_test_cfb128_pt[64] =
2127{
2128 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2129 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2130 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2131 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2132 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2133 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2134 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2135 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2136};
2137
2138static const unsigned char aes_test_cfb128_ct[3][64] =
2139{
2140 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2141 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2142 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2143 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2144 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2145 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2146 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2147 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2148 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2149 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2150 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2151 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2152 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2153 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2154 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2155 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2156 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2157 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2158 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2159 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2160 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2161 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2162 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2163 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2164};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002165#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002166
Simon Butcherad4e4932018-04-29 00:43:47 +01002167#if defined(MBEDTLS_CIPHER_MODE_OFB)
2168/*
2169 * AES-OFB test vectors from:
2170 *
Simon Butcher5db13622018-06-04 22:11:25 +01002171 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002172 */
2173static const unsigned char aes_test_ofb_key[3][32] =
2174{
2175 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2176 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2177 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2178 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2179 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2180 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2181 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2182 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2183 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2184};
2185
2186static const unsigned char aes_test_ofb_iv[16] =
2187{
2188 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2189 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2190};
2191
2192static const unsigned char aes_test_ofb_pt[64] =
2193{
2194 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2195 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2196 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2197 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2198 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2199 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2200 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2201 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2202};
2203
2204static const unsigned char aes_test_ofb_ct[3][64] =
2205{
2206 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2207 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2208 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2209 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2210 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2211 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2212 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2213 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2214 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2215 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2216 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2217 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2218 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2219 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2220 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2221 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2222 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2223 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2224 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2225 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2226 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2227 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2228 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2229 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2230};
2231#endif /* MBEDTLS_CIPHER_MODE_OFB */
2232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002233#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002234/*
2235 * AES-CTR test vectors from:
2236 *
2237 * http://www.faqs.org/rfcs/rfc3686.html
2238 */
2239
2240static const unsigned char aes_test_ctr_key[3][16] =
2241{
2242 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2243 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2244 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2245 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2246 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2247 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2248};
2249
2250static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2251{
2252 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2254 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2255 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2256 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2257 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2258};
2259
2260static const unsigned char aes_test_ctr_pt[3][48] =
2261{
2262 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2263 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2264
2265 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2266 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2267 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2268 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2269
2270 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2271 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2272 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2273 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2274 0x20, 0x21, 0x22, 0x23 }
2275};
2276
2277static const unsigned char aes_test_ctr_ct[3][48] =
2278{
2279 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2280 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2281 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2282 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2283 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2284 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2285 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2286 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2287 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2288 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2289 0x25, 0xB2, 0x07, 0x2F }
2290};
2291
2292static const int aes_test_ctr_len[3] =
2293 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002294#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002295
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002296#if defined(MBEDTLS_CIPHER_MODE_XTS)
2297/*
2298 * AES-XTS test vectors from:
2299 *
2300 * IEEE P1619/D16 Annex B
2301 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2302 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2303 */
2304static const unsigned char aes_test_xts_key[][32] =
2305{
2306 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2310 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2311 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2312 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2313 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2314 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2315 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2316 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2317 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2318};
2319
2320static const unsigned char aes_test_xts_pt32[][32] =
2321{
2322 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2326 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2327 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2328 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2329 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2330 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2331 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2332 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2333 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2334};
2335
2336static const unsigned char aes_test_xts_ct32[][32] =
2337{
2338 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2339 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2340 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2341 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2342 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2343 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2344 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2345 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2346 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2347 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2348 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2349 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2350};
2351
2352static const unsigned char aes_test_xts_data_unit[][16] =
2353{
2354 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2356 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2358 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2360};
2361
2362#endif /* MBEDTLS_CIPHER_MODE_XTS */
2363
Paul Bakker5121ce52009-01-03 21:22:43 +00002364/*
2365 * Checkup routine
2366 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002367int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002368{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002369 int ret = 0, i, j, u, mode;
2370 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002371 unsigned char key[32];
2372 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002373 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002374#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002375 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002376#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002377#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002378 unsigned char prv[16];
2379#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002380#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2381 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002382 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002383#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002384#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002385 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002386#endif
2387#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002388 unsigned char nonce_counter[16];
2389 unsigned char stream_block[16];
2390#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002391 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002393 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002394 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002395
2396 /*
2397 * ECB mode
2398 */
2399 for( i = 0; i < 6; i++ )
2400 {
2401 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002402 keybits = 128 + u * 64;
2403 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
2405 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002406 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2407 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002408
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002409#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2410 if( keybits > 128 )
2411 {
2412 mbedtls_printf( "skipped\n" );
2413 continue;
2414 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002415#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2416
2417#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2418 if( mode == MBEDTLS_AES_DECRYPT )
2419 {
2420 mbedtls_printf( "skipped\n" );
2421 continue;
2422 }
2423#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002424
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002425 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002427 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002429 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2430 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002431 }
2432 else
2433 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002434 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2435 aes_tests = aes_test_ecb_enc[u];
2436 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002437
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002438 /*
2439 * AES-192 is an optional feature that may be unavailable when
2440 * there is an alternative underlying implementation i.e. when
2441 * MBEDTLS_AES_ALT is defined.
2442 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002443 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002444 {
2445 mbedtls_printf( "skipped\n" );
2446 continue;
2447 }
2448 else if( ret != 0 )
2449 {
2450 goto exit;
2451 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002452
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002453 for( j = 0; j < 10000; j++ )
2454 {
2455 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2456 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002457 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002458 }
2459
2460 if( memcmp( buf, aes_tests, 16 ) != 0 )
2461 {
2462 ret = 1;
2463 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002464 }
2465
2466 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002467 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002468 }
2469
2470 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002471 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002473#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002474 /*
2475 * CBC mode
2476 */
2477 for( i = 0; i < 6; i++ )
2478 {
2479 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002480 keybits = 128 + u * 64;
2481 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002482
2483 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002484 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2485 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002486
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002487#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2488 if( keybits > 128 )
2489 {
2490 mbedtls_printf( "skipped\n" );
2491 continue;
2492 }
2493#endif
2494
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002495#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2496 if( mode == MBEDTLS_AES_DECRYPT )
2497 {
2498 mbedtls_printf( "skipped\n" );
2499 continue;
2500 }
2501#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2502
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002503 memset( iv , 0, 16 );
2504 memset( prv, 0, 16 );
2505 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002506
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002507 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002508 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002509 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2510 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002511 }
2512 else
2513 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002514 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2515 aes_tests = aes_test_cbc_enc[u];
2516 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002517
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002518 /*
2519 * AES-192 is an optional feature that may be unavailable when
2520 * there is an alternative underlying implementation i.e. when
2521 * MBEDTLS_AES_ALT is defined.
2522 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002523 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002524 {
2525 mbedtls_printf( "skipped\n" );
2526 continue;
2527 }
2528 else if( ret != 0 )
2529 {
2530 goto exit;
2531 }
2532
2533 for( j = 0; j < 10000; j++ )
2534 {
2535 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002536 {
2537 unsigned char tmp[16];
2538
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002539 memcpy( tmp, prv, 16 );
2540 memcpy( prv, buf, 16 );
2541 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002542 }
2543
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002544 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2545 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002546 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002547
2548 }
2549
2550 if( memcmp( buf, aes_tests, 16 ) != 0 )
2551 {
2552 ret = 1;
2553 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002554 }
2555
2556 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002557 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002558 }
2559
2560 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002561 mbedtls_printf( "\n" );
2562#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002563
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002564#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002565 /*
2566 * CFB128 mode
2567 */
2568 for( i = 0; i < 6; i++ )
2569 {
2570 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002571 keybits = 128 + u * 64;
2572 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002573
2574 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002575 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2576 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002577
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002578#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2579 if( keybits > 128 )
2580 {
2581 mbedtls_printf( "skipped\n" );
2582 continue;
2583 }
2584#endif
2585
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002586#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2587 if( mode == MBEDTLS_AES_DECRYPT )
2588 {
2589 mbedtls_printf( "skipped\n" );
2590 continue;
2591 }
2592#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2593
Paul Bakker5121ce52009-01-03 21:22:43 +00002594 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002595 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002596
2597 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002598 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002599 /*
2600 * AES-192 is an optional feature that may be unavailable when
2601 * there is an alternative underlying implementation i.e. when
2602 * MBEDTLS_AES_ALT is defined.
2603 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002604 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002605 {
2606 mbedtls_printf( "skipped\n" );
2607 continue;
2608 }
2609 else if( ret != 0 )
2610 {
2611 goto exit;
2612 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002613
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002614 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002615 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002616 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002617 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002618 }
2619 else
2620 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002621 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002622 aes_tests = aes_test_cfb128_ct[u];
2623 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002624
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002625 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2626 if( ret != 0 )
2627 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002628
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002629 if( memcmp( buf, aes_tests, 64 ) != 0 )
2630 {
2631 ret = 1;
2632 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002633 }
2634
2635 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002636 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002637 }
2638
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002639 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002640 mbedtls_printf( "\n" );
2641#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002642
Simon Butcherad4e4932018-04-29 00:43:47 +01002643#if defined(MBEDTLS_CIPHER_MODE_OFB)
2644 /*
2645 * OFB mode
2646 */
2647 for( i = 0; i < 6; i++ )
2648 {
2649 u = i >> 1;
2650 keybits = 128 + u * 64;
2651 mode = i & 1;
2652
2653 if( verbose != 0 )
2654 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2655 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2656
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002657#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2658 if( keybits > 128 )
2659 {
2660 mbedtls_printf( "skipped\n" );
2661 continue;
2662 }
2663#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002664
2665#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2666 if( mode == MBEDTLS_AES_DECRYPT )
2667 {
2668 mbedtls_printf( "skipped\n" );
2669 continue;
2670 }
2671#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2672
Simon Butcherad4e4932018-04-29 00:43:47 +01002673 memcpy( iv, aes_test_ofb_iv, 16 );
2674 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2675
2676 offset = 0;
2677 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2678 /*
2679 * AES-192 is an optional feature that may be unavailable when
2680 * there is an alternative underlying implementation i.e. when
2681 * MBEDTLS_AES_ALT is defined.
2682 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002683 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002684 {
2685 mbedtls_printf( "skipped\n" );
2686 continue;
2687 }
2688 else if( ret != 0 )
2689 {
2690 goto exit;
2691 }
2692
2693 if( mode == MBEDTLS_AES_DECRYPT )
2694 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002695 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002696 aes_tests = aes_test_ofb_pt;
2697 }
2698 else
2699 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002700 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002701 aes_tests = aes_test_ofb_ct[u];
2702 }
2703
2704 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2705 if( ret != 0 )
2706 goto exit;
2707
2708 if( memcmp( buf, aes_tests, 64 ) != 0 )
2709 {
2710 ret = 1;
2711 goto exit;
2712 }
2713
2714 if( verbose != 0 )
2715 mbedtls_printf( "passed\n" );
2716 }
2717
2718 if( verbose != 0 )
2719 mbedtls_printf( "\n" );
2720#endif /* MBEDTLS_CIPHER_MODE_OFB */
2721
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002722#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002723 /*
2724 * CTR mode
2725 */
2726 for( i = 0; i < 6; i++ )
2727 {
2728 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002729 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002730
2731 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002732 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002733 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002734
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002735#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2736 if( keybits > 128 )
2737 {
2738 mbedtls_printf( "skipped\n" );
2739 continue;
2740 }
2741#endif
2742
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002743#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2744 if( mode == MBEDTLS_AES_DECRYPT )
2745 {
2746 mbedtls_printf( "skipped\n" );
2747 continue;
2748 }
2749#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2750
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002751 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2752 memcpy( key, aes_test_ctr_key[u], 16 );
2753
2754 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002755 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2756 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002757
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002758 len = aes_test_ctr_len[u];
2759
2760 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002761 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002762 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002763 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002764 }
2765 else
2766 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002767 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002768 aes_tests = aes_test_ctr_ct[u];
2769 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002770
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002771 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2772 stream_block, buf, buf );
2773 if( ret != 0 )
2774 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002775
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002776 if( memcmp( buf, aes_tests, len ) != 0 )
2777 {
2778 ret = 1;
2779 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002780 }
2781
2782 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002783 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002784 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002785
2786 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002787 mbedtls_printf( "\n" );
2788#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002789
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002790#if defined(MBEDTLS_CIPHER_MODE_XTS)
2791 {
2792 static const int num_tests =
2793 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2794 mbedtls_aes_xts_context ctx_xts;
2795
2796 /*
2797 * XTS mode
2798 */
2799 mbedtls_aes_xts_init( &ctx_xts );
2800
2801 for( i = 0; i < num_tests << 1; i++ )
2802 {
2803 const unsigned char *data_unit;
2804 u = i >> 1;
2805 mode = i & 1;
2806
2807 if( verbose != 0 )
2808 mbedtls_printf( " AES-XTS-128 (%s): ",
2809 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2810
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002811#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2812 if( mode == MBEDTLS_AES_DECRYPT )
2813 {
2814 mbedtls_printf( "skipped\n" );
2815 continue;
2816 }
2817#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2818
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002819 memset( key, 0, sizeof( key ) );
2820 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002821 data_unit = aes_test_xts_data_unit[u];
2822
2823 len = sizeof( *aes_test_xts_ct32 );
2824
2825 if( mode == MBEDTLS_AES_DECRYPT )
2826 {
2827 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2828 if( ret != 0)
2829 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002830 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002831 aes_tests = aes_test_xts_pt32[u];
2832 }
2833 else
2834 {
2835 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2836 if( ret != 0)
2837 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002838 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002839 aes_tests = aes_test_xts_ct32[u];
2840 }
2841
2842
2843 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2844 buf, buf );
2845 if( ret != 0 )
2846 goto exit;
2847
2848 if( memcmp( buf, aes_tests, len ) != 0 )
2849 {
2850 ret = 1;
2851 goto exit;
2852 }
2853
2854 if( verbose != 0 )
2855 mbedtls_printf( "passed\n" );
2856 }
2857
2858 if( verbose != 0 )
2859 mbedtls_printf( "\n" );
2860
2861 mbedtls_aes_xts_free( &ctx_xts );
2862 }
2863#endif /* MBEDTLS_CIPHER_MODE_XTS */
2864
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002865 ret = 0;
2866
2867exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002868 if( ret != 0 && verbose != 0 )
2869 mbedtls_printf( "failed\n" );
2870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002871 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002872
2873 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002874}
2875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002876#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002878#endif /* MBEDTLS_AES_C */