blob: ece7a82d2f43e80a3911eaeb8677553689d500bc [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)
97/* Number of additional AES calculation rounds added for SCA CM */
Arto Kinnunen2eb678f2020-01-13 16:44:13 +020098#define AES_SCA_CM_ROUNDS 4
Arto Kinnunen172836a2019-11-28 13:34:13 +020099#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100#define AES_SCA_CM_ROUNDS 0
101#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200103#if defined(MBEDTLS_PADLOCK_C) && \
104 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000105static int aes_padlock_ace = -1;
106#endif
107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000109/*
110 * Forward S-box
111 */
112static const unsigned char FSb[256] =
113{
114 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
115 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
116 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
117 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
118 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
119 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
120 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
121 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
122 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
123 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
124 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
125 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
126 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
127 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
128 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
129 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
130 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
131 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
132 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
133 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
134 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
135 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
136 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
137 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
138 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
139 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
140 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
141 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
142 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
143 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
144 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
145 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
146};
147
148/*
149 * Forward tables
150 */
151#define FT \
152\
153 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
154 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
155 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
156 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
157 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
158 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
159 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
160 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
161 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
162 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
163 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
164 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
165 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
166 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
167 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
168 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
169 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
170 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
171 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
172 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
173 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
174 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
175 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
176 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
177 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
178 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
179 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
180 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
181 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
182 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
183 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
184 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
185 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
186 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
187 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
188 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
189 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
190 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
191 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
192 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
193 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
194 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
195 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
196 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
197 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
198 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
199 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
200 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
201 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
202 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
203 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
204 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
205 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
206 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
207 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
208 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
209 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
210 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
211 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
212 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
213 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
214 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
215 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
216 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
217
218#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000219static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000220#undef V
221
Hanno Beckerad049a92017-06-19 16:31:54 +0100222#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200223
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000225static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000226#undef V
227
228#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000229static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000230#undef V
231
232#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000233static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000234#undef V
235
Hanno Becker177d3cf2017-06-07 15:52:48 +0100236#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200237
Paul Bakker5121ce52009-01-03 21:22:43 +0000238#undef FT
239
Arto Kinnunen14804442019-10-16 13:43:59 +0300240#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000241/*
242 * Reverse S-box
243 */
244static const unsigned char RSb[256] =
245{
246 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
247 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
248 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
249 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
250 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
251 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
252 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
253 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
254 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
255 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
256 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
257 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
258 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
259 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
260 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
261 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
262 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
263 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
264 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
265 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
266 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
267 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
268 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
269 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
270 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
271 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
272 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
273 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
274 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
275 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
276 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
277 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
278};
Arto Kinnunen14804442019-10-16 13:43:59 +0300279#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000280
281/*
282 * Reverse tables
283 */
284#define RT \
285\
286 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
287 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
288 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
289 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
290 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
291 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
292 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
293 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
294 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
295 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
296 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
297 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
298 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
299 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
300 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
301 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
302 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
303 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
304 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
305 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
306 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
307 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
308 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
309 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
310 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
311 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
312 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
313 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
314 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
315 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
316 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
317 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
318 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
319 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
320 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
321 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
322 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
323 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
324 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
325 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
326 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
327 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
328 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
329 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
330 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
331 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
332 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
333 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
334 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
335 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
336 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
337 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
338 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
339 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
340 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
341 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
342 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
343 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
344 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
345 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
346 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
347 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
348 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
349 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
350
Arto Kinnunen14804442019-10-16 13:43:59 +0300351#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000354#undef V
355
Hanno Beckerad049a92017-06-19 16:31:54 +0100356#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000359static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000360#undef V
361
362#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000363static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000364#undef V
365
366#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000367static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000368#undef V
369
Hanno Becker177d3cf2017-06-07 15:52:48 +0100370#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300371#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200372
Paul Bakker5121ce52009-01-03 21:22:43 +0000373#undef RT
374
375/*
376 * Round constants
377 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000379{
380 0x00000001, 0x00000002, 0x00000004, 0x00000008,
381 0x00000010, 0x00000020, 0x00000040, 0x00000080,
382 0x0000001B, 0x00000036
383};
384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000386
387/*
388 * Forward S-box & tables
389 */
390static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100392#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200393static uint32_t FT1[256];
394static uint32_t FT2[256];
395static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100396#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000397
398/*
399 * Reverse S-box & tables
400 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300401#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000402static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100404#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000405static uint32_t RT1[256];
406static uint32_t RT2[256];
407static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100408#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300409#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
411/*
412 * Round constants
413 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000414static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
416/*
417 * Tables generation code
418 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100419#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
420#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100421#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423static int aes_init_done = 0;
424
425static void aes_gen_tables( void )
426{
427 int i, x, y, z;
428 int pow[256];
429 int log[256];
430
431 /*
432 * compute pow and log tables over GF(2^8)
433 */
434 for( i = 0, x = 1; i < 256; i++ )
435 {
436 pow[i] = x;
437 log[x] = i;
438 x = ( x ^ XTIME( x ) ) & 0xFF;
439 }
440
441 /*
442 * calculate the round constants
443 */
444 for( i = 0, x = 1; i < 10; i++ )
445 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000446 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000447 x = XTIME( x ) & 0xFF;
448 }
449
450 /*
451 * generate the forward and reverse S-boxes
452 */
453 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000455 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300456#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000457
458 for( i = 1; i < 256; i++ )
459 {
460 x = pow[255 - log[i]];
461
Paul Bakker66d5d072014-06-17 16:39:18 +0200462 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
464 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
465 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 x ^= y ^ 0x63;
467
468 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300471#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000472 }
473
474 /*
475 * generate the forward and reverse tables
476 */
477 for( i = 0; i < 256; i++ )
478 {
479 x = FSb[i];
480 y = XTIME( x ) & 0xFF;
481 z = ( y ^ x ) & 0xFF;
482
Paul Bakker5c2364c2012-10-01 14:41:15 +0000483 FT0[i] = ( (uint32_t) y ) ^
484 ( (uint32_t) x << 8 ) ^
485 ( (uint32_t) x << 16 ) ^
486 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000487
Hanno Beckerad049a92017-06-19 16:31:54 +0100488#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000489 FT1[i] = ROTL8( FT0[i] );
490 FT2[i] = ROTL8( FT1[i] );
491 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100492#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000493
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300494#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000495 x = RSb[i];
496
Paul Bakker5c2364c2012-10-01 14:41:15 +0000497 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
498 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
499 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
500 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000501
Hanno Beckerad049a92017-06-19 16:31:54 +0100502#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000503 RT1[i] = ROTL8( RT0[i] );
504 RT2[i] = ROTL8( RT1[i] );
505 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100506#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300507#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000508 }
509}
510
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200511#undef ROTL8
512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000514
Arto Kinnunen172836a2019-11-28 13:34:13 +0200515/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200516 * Randomize positions for AES SCA countermeasures if AES countermeasures are
517 * enabled. If countermeasures are not enabled then fill given table with real
518 * data values.
519 *
520 * Dummy rounds are added as follows:
521 * 1. One dummy round added to the initial round key addition (executed in
522 * random order).
523 * 2. Random number of dummy rounds added as first and/or last AES calculation
524 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
525 *
526 * Description of the bytes in the table are as follows:
527 * - 2 bytes for initial round key addition
528 * - remaining bytes for AES calculation with real or dummy data
529 *
530 * Each byte indicates one AES calculation round:
531 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
532 * -bit 2 = offset for even/odd rounds
533 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200534 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200535 * Return Number of additional AES rounds
536 *
537 * Example of the control bytes:
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200538 * 1. No countermeasures enabled and AES-128, only real data (R) used:
539 * | Ri | R | R | R | R | R | R | R | R | R | R |
540 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200541 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200542 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
543 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
544 * |0x10|0x03 |0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200545 */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200546static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200547{
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200548 int i = 0, j = 0, is_even_pos;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200549#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen172836a2019-11-28 13:34:13 +0200550 int num;
551#endif
552
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200553 mbedtls_platform_memset( tbl, 0, tbl_len );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200554
555#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200556 num = mbedtls_platform_random_in_range( 0x1f );
557
558 // Randomize execution order of initial round key addition
559 if ( ( num & 0x10 ) == 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 Kinnunen2eb678f2020-01-13 16:44:13 +0200568 // Randomize AES rounds
569 num = num % ( AES_SCA_CM_ROUNDS + 1 );
570
571 // add dummy rounds to the start (if needed)
572 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200573 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200574 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200575 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576
577 // add dummy rounds to the last, (AES_SCA_CM_ROUNDS - num) rounds if needed
578 for ( j = tbl_len - AES_SCA_CM_ROUNDS + num; j < tbl_len; j++ )
579 {
580 tbl[j] = 0x10; // dummy data
581 }
582#else /* AES_SCA_CM_ROUNDS != 0 */
583 tbl[i++] = 0x03; // real data + stop marker for the round key addition
Arto Kinnunen172836a2019-11-28 13:34:13 +0200584#endif /* AES_SCA_CM_ROUNDS != 0 */
585
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200586 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200587 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200588 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200589 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200590 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200591 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200592 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200593 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200594 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200595 is_even_pos = 0;
596 }
597 else
598 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200599 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200600 is_even_pos = 1;
601 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200602 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200603 }
604 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200605
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200606 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
607 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
608
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200609 return( AES_SCA_CM_ROUNDS );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200610}
611
Hanno Beckerad049a92017-06-19 16:31:54 +0100612#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200613
614#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
615#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
616#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
617
618#define AES_RT0(idx) RT0[idx]
619#define AES_RT1(idx) ROTL8( RT0[idx] )
620#define AES_RT2(idx) ROTL16( RT0[idx] )
621#define AES_RT3(idx) ROTL24( RT0[idx] )
622
623#define AES_FT0(idx) FT0[idx]
624#define AES_FT1(idx) ROTL8( FT0[idx] )
625#define AES_FT2(idx) ROTL16( FT0[idx] )
626#define AES_FT3(idx) ROTL24( FT0[idx] )
627
Hanno Becker177d3cf2017-06-07 15:52:48 +0100628#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200629
630#define AES_RT0(idx) RT0[idx]
631#define AES_RT1(idx) RT1[idx]
632#define AES_RT2(idx) RT2[idx]
633#define AES_RT3(idx) RT3[idx]
634
635#define AES_FT0(idx) FT0[idx]
636#define AES_FT1(idx) FT1[idx]
637#define AES_FT2(idx) FT2[idx]
638#define AES_FT3(idx) FT3[idx]
639
Hanno Becker177d3cf2017-06-07 15:52:48 +0100640#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200641
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200642void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200643{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100644 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000645
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200646 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200647}
648
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200650{
651 if( ctx == NULL )
652 return;
653
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500654 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200655}
656
Jaeden Amero9366feb2018-05-29 18:55:17 +0100657#if defined(MBEDTLS_CIPHER_MODE_XTS)
658void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
659{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100660 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000661
Jaeden Amero9366feb2018-05-29 18:55:17 +0100662 mbedtls_aes_init( &ctx->crypt );
663 mbedtls_aes_init( &ctx->tweak );
664}
665
666void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
667{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100668 if( ctx == NULL )
669 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000670
Jaeden Amero9366feb2018-05-29 18:55:17 +0100671 mbedtls_aes_free( &ctx->crypt );
672 mbedtls_aes_free( &ctx->tweak );
673}
674#endif /* MBEDTLS_CIPHER_MODE_XTS */
675
Paul Bakker5121ce52009-01-03 21:22:43 +0000676/*
677 * AES key schedule (encryption)
678 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200679#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200681 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000682{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200683 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200684 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200685 volatile unsigned int i = 0;
686 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000687 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200688 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000689
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100690 AES_VALIDATE_RET( ctx != NULL );
691 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000692
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200693 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000694 {
695 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300696#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000697 case 192: ctx->nr = 12; break;
698 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300699#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000701 }
702
Simon Butcher5201e412018-12-06 17:40:14 +0000703#if !defined(MBEDTLS_AES_ROM_TABLES)
704 if( aes_init_done == 0 )
705 {
706 aes_gen_tables();
707 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000708 }
709#endif
710
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000712 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100713 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000714
715 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000717 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000718#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000719 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000720
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100722 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200723 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100724#endif
725
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200726 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
727 offset = mbedtls_platform_random_in_range( keybits >> 5 );
728
729 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000730 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200731 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200732 flow_ctrl++;
733 }
734
735 for( j = 0; j < offset; j++ )
736 {
737 GET_UINT32_LE( RK[j], key, j << 2 );
738 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000739 }
740
741 switch( ctx->nr )
742 {
743 case 10:
744
745 for( i = 0; i < 10; i++, RK += 4 )
746 {
747 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000748 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
749 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
750 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
751 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000752
753 RK[5] = RK[1] ^ RK[4];
754 RK[6] = RK[2] ^ RK[5];
755 RK[7] = RK[3] ^ RK[6];
756 }
757 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300758#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000759 case 12:
760
761 for( i = 0; i < 8; i++, RK += 6 )
762 {
763 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000764 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
765 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
766 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
767 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000768
769 RK[7] = RK[1] ^ RK[6];
770 RK[8] = RK[2] ^ RK[7];
771 RK[9] = RK[3] ^ RK[8];
772 RK[10] = RK[4] ^ RK[9];
773 RK[11] = RK[5] ^ RK[10];
774 }
775 break;
776
777 case 14:
778
779 for( i = 0; i < 7; i++, RK += 8 )
780 {
781 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000782 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
783 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
784 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
785 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000786
787 RK[9] = RK[1] ^ RK[8];
788 RK[10] = RK[2] ^ RK[9];
789 RK[11] = RK[3] ^ RK[10];
790
791 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000792 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
793 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
794 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
795 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000796
797 RK[13] = RK[5] ^ RK[12];
798 RK[14] = RK[6] ^ RK[13];
799 RK[15] = RK[7] ^ RK[14];
800 }
801 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300802#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000803 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000804
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200805 ret = 0;
806
807 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200808 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200809#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
810 || ( ctx->nr == 12 && i == 8 )
811 || ( ctx->nr == 14 && i == 7 )
812#endif
813 ) )
814 {
815 return ret;
816 }
817
818 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000819}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200820#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000821
822/*
823 * AES key schedule (decryption)
824 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200825#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200827 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000828{
Arto Kinnunen14804442019-10-16 13:43:59 +0300829#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
830 (void) ctx;
831 (void) key;
832 (void) keybits;
833
834 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
835#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200836 volatile unsigned int i = 0, j = 0;
837 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200838 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000839 uint32_t *RK;
840 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200841
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100842 AES_VALIDATE_RET( ctx != NULL );
843 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000844
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000846
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000848 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100849 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000850
851 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000853 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000854#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000855 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000856
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200857 /* Also checks keybits */
858 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200859 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000860
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200861 ctx->nr = cty.nr;
862
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100864 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100865 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100867 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200868 i = 0;
869 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200870 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100871 }
872#endif
873
Paul Bakker5121ce52009-01-03 21:22:43 +0000874 SK = cty.rk + cty.nr * 4;
875
876 *RK++ = *SK++;
877 *RK++ = *SK++;
878 *RK++ = *SK++;
879 *RK++ = *SK++;
880
881 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
882 {
883 for( j = 0; j < 4; j++, SK++ )
884 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200885 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
886 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
887 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
888 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000889 }
890 }
891
892 *RK++ = *SK++;
893 *RK++ = *SK++;
894 *RK++ = *SK++;
895 *RK++ = *SK++;
896
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200897exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200898 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000899
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200900 if( ret != 0 )
901 {
902 return( ret );
903 }
904 else if( ( i == 0 ) && ( j == 4 ) )
905 {
906 return( ret );
907 }
908 else
909 {
910 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
911 }
912
Arto Kinnunen14804442019-10-16 13:43:59 +0300913#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000914}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100915
916#if defined(MBEDTLS_CIPHER_MODE_XTS)
917static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
918 unsigned int keybits,
919 const unsigned char **key1,
920 unsigned int *key1bits,
921 const unsigned char **key2,
922 unsigned int *key2bits )
923{
924 const unsigned int half_keybits = keybits / 2;
925 const unsigned int half_keybytes = half_keybits / 8;
926
927 switch( keybits )
928 {
929 case 256: break;
930 case 512: break;
931 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
932 }
933
934 *key1bits = half_keybits;
935 *key2bits = half_keybits;
936 *key1 = &key[0];
937 *key2 = &key[half_keybytes];
938
939 return 0;
940}
941
942int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
943 const unsigned char *key,
944 unsigned int keybits)
945{
946 int ret;
947 const unsigned char *key1, *key2;
948 unsigned int key1bits, key2bits;
949
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100950 AES_VALIDATE_RET( ctx != NULL );
951 AES_VALIDATE_RET( key != NULL );
952
Jaeden Amero9366feb2018-05-29 18:55:17 +0100953 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
954 &key2, &key2bits );
955 if( ret != 0 )
956 return( ret );
957
958 /* Set the tweak key. Always set tweak key for the encryption mode. */
959 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
960 if( ret != 0 )
961 return( ret );
962
963 /* Set crypt key for encryption. */
964 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
965}
966
967int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
968 const unsigned char *key,
969 unsigned int keybits)
970{
971 int ret;
972 const unsigned char *key1, *key2;
973 unsigned int key1bits, key2bits;
974
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100975 AES_VALIDATE_RET( ctx != NULL );
976 AES_VALIDATE_RET( key != NULL );
977
Jaeden Amero9366feb2018-05-29 18:55:17 +0100978 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
979 &key2, &key2bits );
980 if( ret != 0 )
981 return( ret );
982
983 /* Set the tweak key. Always set tweak key for encryption. */
984 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
985 if( ret != 0 )
986 return( ret );
987
988 /* Set crypt key for decryption. */
989 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
990}
991#endif /* MBEDTLS_CIPHER_MODE_XTS */
992
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200993#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000994
Paul Bakker5121ce52009-01-03 21:22:43 +0000995/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200996 * AES-ECB block encryption
997 */
998#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +0200999
1000static uint32_t *aes_fround( uint32_t *R,
1001 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1002 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1003{
1004 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1005 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1006 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1007 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1008
1009 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1010 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1011 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1012 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1013
1014 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1015 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1016 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1017 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1018
1019 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1020 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1021 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1022 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1023
1024 return R;
1025}
1026
1027static void aes_fround_final( uint32_t *R,
1028 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1029 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1030{
1031 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1032 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1033 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1034 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1035
1036 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1037 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1038 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1039 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1040
1041 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1042 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1043 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1044 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1045
1046 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1047 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1048 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1049 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1050}
1051
Andres AGf5bf7182017-03-03 14:09:56 +00001052int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1053 const unsigned char input[16],
1054 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001055{
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001056 int i, tindex, offset, stop_mark;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001057 aes_r_data_t aes_data_real; // real data
1058#if AES_SCA_CM_ROUNDS != 0
1059 aes_r_data_t aes_data_fake; // fake data
1060#endif /* AES_SCA_CM_ROUNDS != 0 */
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001061 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001062 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001063 int round_ctrl_table_len = ctx->nr + 1;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001064 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001065 // control bytes for AES calculation rounds,
1066 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1067 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001068
Arto Kinnunen172836a2019-11-28 13:34:13 +02001069 aes_data_real.rk_ptr = ctx->rk;
1070 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001071
Arto Kinnunen172836a2019-11-28 13:34:13 +02001072#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001073 round_ctrl_table_len += ( AES_SCA_CM_ROUNDS + 1 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001074 aes_data_table[1] = &aes_data_fake;
1075 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001076 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001077 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001078#endif
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001079
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001080 // Get AES calculation control bytes
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001081 flow_control = aes_sca_cm_data_randomize( round_ctrl_table,
1082 round_ctrl_table_len );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001083
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001084 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1085 offset = mbedtls_platform_random_in_range( 4 );
1086
1087 for( i = offset; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001088 {
1089 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001090 }
1091
1092 for( i = 0; i < offset; i++ )
1093 {
1094 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
1095 }
1096
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001097 tindex = 0;
1098 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001099 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001100 // Get pointer to the real or fake data
1101 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1102 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001103
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001104 // initial round key addition
1105 for( i = 0; i < 4; i++ )
1106 {
1107 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1108 }
1109 tindex++;
1110 flow_control++;
1111 } while( stop_mark == 0 );
1112
1113 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1114 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001115 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001116 // Get pointer to the real or fake data
1117 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1118 offset = round_ctrl_table[tindex] & 0x04;
1119 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001120
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001121 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1122 &aes_data_ptr->xy_values[0 + offset],
1123 &aes_data_ptr->xy_values[1 + offset],
1124 &aes_data_ptr->xy_values[2 + offset],
1125 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001126 aes_data_ptr->xy_values[4 - offset],
1127 aes_data_ptr->xy_values[5 - offset],
1128 aes_data_ptr->xy_values[6 - offset],
1129 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001130 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001131 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001132 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001133
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001134 // Calculate final AES round + dummy rounds
1135 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001136 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001137 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1138 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001139 aes_fround_final( aes_data_ptr->rk_ptr,
1140 &aes_data_ptr->xy_values[0],
1141 &aes_data_ptr->xy_values[1],
1142 &aes_data_ptr->xy_values[2],
1143 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001144 aes_data_ptr->xy_values[4],
1145 aes_data_ptr->xy_values[5],
1146 aes_data_ptr->xy_values[6],
1147 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001148 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001149 tindex++;
1150 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001151
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001152 mbedtls_platform_memset( output, 0, 16 );
1153 offset = mbedtls_platform_random_in_range( 4 );
1154
1155 for( i = offset; i < 4; i++ )
1156 {
1157 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1158 flow_control++;
1159 }
1160
1161 for( i = 0; i < offset; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001162 {
1163 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001164 flow_control++;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001165 }
Andres AGf5bf7182017-03-03 14:09:56 +00001166
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001167 if( flow_control == round_ctrl_table_len + AES_SCA_CM_ROUNDS + 4 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001168 {
1169 /* Validate control path due possible fault injection */
1170 return 0;
1171 }
1172
1173 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001174}
1175#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1176
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001177#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001178void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1179 const unsigned char input[16],
1180 unsigned char output[16] )
1181{
1182 mbedtls_internal_aes_encrypt( ctx, input, output );
1183}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001184#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001185
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001186/*
1187 * AES-ECB block decryption
1188 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001189
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001190#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001191#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001192
1193static uint32_t *aes_rround( uint32_t *R,
1194 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1195 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1196{
1197 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1198 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1199 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1200 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1201
1202 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1203 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1204 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1205 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1206
1207 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1208 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1209 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1210 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1211
1212 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1213 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1214 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1215 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1216 return R;
1217}
1218
1219static void aes_rround_final( uint32_t *R,
1220 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1221 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1222{
1223 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1224 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1225 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1226 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1227
1228 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1229 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1230 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1231 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1232
1233 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1234 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1235 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1236 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1237
1238 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1239 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1240 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1241 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1242}
1243
Andres AGf5bf7182017-03-03 14:09:56 +00001244int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1245 const unsigned char input[16],
1246 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001247{
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001248 int i, tindex, offset, stop_mark;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001249 aes_r_data_t aes_data_real; // real data
1250#if AES_SCA_CM_ROUNDS != 0
1251 aes_r_data_t aes_data_fake; // fake data
1252#endif /* AES_SCA_CM_ROUNDS != 0 */
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001253 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001254 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001255 int round_ctrl_table_len = ctx->nr + 1;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001256 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001257 // control bytes for AES calculation rounds,
1258 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1259 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001260
Arto Kinnunen172836a2019-11-28 13:34:13 +02001261 aes_data_real.rk_ptr = ctx->rk;
1262 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001263
Arto Kinnunen172836a2019-11-28 13:34:13 +02001264#if AES_SCA_CM_ROUNDS != 0
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001265 round_ctrl_table_len += ( AES_SCA_CM_ROUNDS + 1 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001266 aes_data_table[1] = &aes_data_fake;
1267 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001268 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001269 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
1270#endif
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001271
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001272 // Get AES calculation control bytes
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001273 flow_control = aes_sca_cm_data_randomize( round_ctrl_table,
1274 round_ctrl_table_len );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001275
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001276 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
1277 offset = mbedtls_platform_random_in_range( 4 );
1278
1279 for( i = offset; i < 4; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001280 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001281 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001282 }
1283
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001284 for( i = 0; i < offset; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001285 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001286 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
1287 }
1288
1289 tindex = 0;
1290 do
1291 {
1292 // Get pointer to the real or fake data
1293 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1294 stop_mark = round_ctrl_table[tindex] & 0x03;
1295
1296 // initial round key addition
1297 for( i = 0; i < 4; i++ )
1298 {
1299 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1300 }
1301 tindex++;
1302 flow_control++;
1303 } while( stop_mark == 0 );
1304
1305 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1306 do
1307 {
1308 // Get pointer to the real or fake data
1309 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1310 offset = round_ctrl_table[tindex] & 0x04;
1311 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001312
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001313 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1314 &aes_data_ptr->xy_values[0 + offset],
1315 &aes_data_ptr->xy_values[1 + offset],
1316 &aes_data_ptr->xy_values[2 + offset],
1317 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001318 aes_data_ptr->xy_values[4 - offset],
1319 aes_data_ptr->xy_values[5 - offset],
1320 aes_data_ptr->xy_values[6 - offset],
1321 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001322 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001323 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001324 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001325
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001326 // Calculate final AES round + dummy rounds
1327 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001328 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001329 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1330 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001331 aes_rround_final( aes_data_ptr->rk_ptr,
1332 &aes_data_ptr->xy_values[0],
1333 &aes_data_ptr->xy_values[1],
1334 &aes_data_ptr->xy_values[2],
1335 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001336 aes_data_ptr->xy_values[4],
1337 aes_data_ptr->xy_values[5],
1338 aes_data_ptr->xy_values[6],
1339 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001340 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001341 tindex++;
1342 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001343
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001344 mbedtls_platform_memset( output, 0, 16 );
1345 offset = mbedtls_platform_random_in_range( 4 );
1346
1347 for( i = offset; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001348 {
1349 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001350 flow_control++;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001351 }
Andres AGf5bf7182017-03-03 14:09:56 +00001352
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001353 for( i = 0; i < offset; i++ )
1354 {
1355 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1356 flow_control++;
1357 }
1358
1359 if( flow_control == round_ctrl_table_len + AES_SCA_CM_ROUNDS + 4 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001360 {
1361 /* Validate control path due possible fault injection */
1362 return 0;
1363 }
1364
1365 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001366}
Arto Kinnunen14804442019-10-16 13:43:59 +03001367#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001368#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1369
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001370#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001371void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1372 const unsigned char input[16],
1373 unsigned char output[16] )
1374{
Arto Kinnunen14804442019-10-16 13:43:59 +03001375#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1376 (void) ctx;
1377 (void) input;
1378 (void) output;
1379#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001380 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001381#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001382}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001383#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001384
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001385/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001386 * AES-ECB block encryption/decryption
1387 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001389 int mode,
1390 const unsigned char input[16],
1391 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001392{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001393 AES_VALIDATE_RET( ctx != NULL );
1394 AES_VALIDATE_RET( input != NULL );
1395 AES_VALIDATE_RET( output != NULL );
1396 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1397 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001398 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001401 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001403#endif
1404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001405#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001406 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001407 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001408 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001409 return( 0 );
1410
1411 // If padlock data misaligned, we just fall back to
1412 // unaccelerated mode
1413 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001414 }
1415#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001416
Arto Kinnunen14804442019-10-16 13:43:59 +03001417#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1418 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1419#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001420
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001421 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001422 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001423 else
Andres AGf5bf7182017-03-03 14:09:56 +00001424 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001425#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001426}
1427
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001428#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001429/*
1430 * AES-CBC buffer encryption/decryption
1431 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001432int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001433 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001434 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001435 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001436 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001437 unsigned char *output )
1438{
1439 int i;
1440 unsigned char temp[16];
1441
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001442 AES_VALIDATE_RET( ctx != NULL );
1443 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1444 mode == MBEDTLS_AES_DECRYPT );
1445 AES_VALIDATE_RET( iv != NULL );
1446 AES_VALIDATE_RET( input != NULL );
1447 AES_VALIDATE_RET( output != NULL );
1448
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001449 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001450 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001453 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001454 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001456 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001457
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001458 // If padlock data misaligned, we just fall back to
1459 // unaccelerated mode
1460 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001461 }
1462#endif
1463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001465 {
1466 while( length > 0 )
1467 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001468 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001470
1471 for( i = 0; i < 16; i++ )
1472 output[i] = (unsigned char)( output[i] ^ iv[i] );
1473
Teppo Järvelin91d79382019-10-02 09:09:31 +03001474 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001475
1476 input += 16;
1477 output += 16;
1478 length -= 16;
1479 }
1480 }
1481 else
1482 {
1483 while( length > 0 )
1484 {
1485 for( i = 0; i < 16; i++ )
1486 output[i] = (unsigned char)( input[i] ^ iv[i] );
1487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001488 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001489 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001490
1491 input += 16;
1492 output += 16;
1493 length -= 16;
1494 }
1495 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001496
1497 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001498}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001499#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001500
Aorimn5f778012016-06-09 23:22:58 +02001501#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001502
1503/* Endianess with 64 bits values */
1504#ifndef GET_UINT64_LE
1505#define GET_UINT64_LE(n,b,i) \
1506{ \
1507 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1508 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1509 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1510 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1511 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1512 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1513 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1514 | ( (uint64_t) (b)[(i) ] ); \
1515}
1516#endif
1517
1518#ifndef PUT_UINT64_LE
1519#define PUT_UINT64_LE(n,b,i) \
1520{ \
1521 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1522 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1523 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1524 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1525 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1526 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1527 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1528 (b)[(i) ] = (unsigned char) ( (n) ); \
1529}
1530#endif
1531
1532typedef unsigned char mbedtls_be128[16];
1533
1534/*
1535 * GF(2^128) multiplication function
1536 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001537 * This function multiplies a field element by x in the polynomial field
1538 * representation. It uses 64-bit word operations to gain speed but compensates
1539 * for machine endianess and hence works correctly on both big and little
1540 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001541 */
1542static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001543 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001544{
1545 uint64_t a, b, ra, rb;
1546
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001547 GET_UINT64_LE( a, x, 0 );
1548 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001549
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001550 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1551 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001552
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001553 PUT_UINT64_LE( ra, r, 0 );
1554 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001555}
1556
Aorimn5f778012016-06-09 23:22:58 +02001557/*
1558 * AES-XTS buffer encryption/decryption
1559 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001560int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1561 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001562 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001563 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001564 const unsigned char *input,
1565 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001566{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001567 int ret;
1568 size_t blocks = length / 16;
1569 size_t leftover = length % 16;
1570 unsigned char tweak[16];
1571 unsigned char prev_tweak[16];
1572 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001573
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001574 AES_VALIDATE_RET( ctx != NULL );
1575 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1576 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001577 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001578 AES_VALIDATE_RET( input != NULL );
1579 AES_VALIDATE_RET( output != NULL );
1580
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001581 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001582 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001583 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001584
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001585 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001586 if( length > ( 1 << 20 ) * 16 )
1587 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001588
Jaeden Amerod82cd862018-04-28 15:02:45 +01001589 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001590 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1591 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001592 if( ret != 0 )
1593 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001594
Jaeden Amerod82cd862018-04-28 15:02:45 +01001595 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001596 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001597 size_t i;
1598
1599 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1600 {
1601 /* We are on the last block in a decrypt operation that has
1602 * leftover bytes, so we need to use the next tweak for this block,
1603 * and this tweak for the lefover bytes. Save the current tweak for
1604 * the leftovers and then update the current tweak for use on this,
1605 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001606 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001607 mbedtls_gf128mul_x_ble( tweak, tweak );
1608 }
1609
1610 for( i = 0; i < 16; i++ )
1611 tmp[i] = input[i] ^ tweak[i];
1612
1613 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1614 if( ret != 0 )
1615 return( ret );
1616
1617 for( i = 0; i < 16; i++ )
1618 output[i] = tmp[i] ^ tweak[i];
1619
1620 /* Update the tweak for the next block. */
1621 mbedtls_gf128mul_x_ble( tweak, tweak );
1622
1623 output += 16;
1624 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001625 }
1626
Jaeden Amerod82cd862018-04-28 15:02:45 +01001627 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001628 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001629 /* If we are on the leftover bytes in a decrypt operation, we need to
1630 * use the previous tweak for these bytes (as saved in prev_tweak). */
1631 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001632
Jaeden Amerod82cd862018-04-28 15:02:45 +01001633 /* We are now on the final part of the data unit, which doesn't divide
1634 * evenly by 16. It's time for ciphertext stealing. */
1635 size_t i;
1636 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001637
Jaeden Amerod82cd862018-04-28 15:02:45 +01001638 /* Copy ciphertext bytes from the previous block to our output for each
1639 * byte of cyphertext we won't steal. At the same time, copy the
1640 * remainder of the input for this final round (since the loop bounds
1641 * are the same). */
1642 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001643 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001644 output[i] = prev_output[i];
1645 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001646 }
Aorimn5f778012016-06-09 23:22:58 +02001647
Jaeden Amerod82cd862018-04-28 15:02:45 +01001648 /* Copy ciphertext bytes from the previous block for input in this
1649 * round. */
1650 for( ; i < 16; i++ )
1651 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001652
Jaeden Amerod82cd862018-04-28 15:02:45 +01001653 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1654 if( ret != 0 )
1655 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001656
Jaeden Amerod82cd862018-04-28 15:02:45 +01001657 /* Write the result back to the previous block, overriding the previous
1658 * output we copied. */
1659 for( i = 0; i < 16; i++ )
1660 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001661 }
1662
1663 return( 0 );
1664}
1665#endif /* MBEDTLS_CIPHER_MODE_XTS */
1666
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001667#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001668/*
1669 * AES-CFB128 buffer encryption/decryption
1670 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001671int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001672 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001673 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001674 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001675 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001676 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001677 unsigned char *output )
1678{
Paul Bakker27fdf462011-06-09 13:55:13 +00001679 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001680 size_t n;
1681
1682 AES_VALIDATE_RET( ctx != NULL );
1683 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1684 mode == MBEDTLS_AES_DECRYPT );
1685 AES_VALIDATE_RET( iv_off != NULL );
1686 AES_VALIDATE_RET( iv != NULL );
1687 AES_VALIDATE_RET( input != NULL );
1688 AES_VALIDATE_RET( output != NULL );
1689
1690 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001691
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001692 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001693 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1694
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001695 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001696 {
1697 while( length-- )
1698 {
1699 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001700 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001701
1702 c = *input++;
1703 *output++ = (unsigned char)( c ^ iv[n] );
1704 iv[n] = (unsigned char) c;
1705
Paul Bakker66d5d072014-06-17 16:39:18 +02001706 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001707 }
1708 }
1709 else
1710 {
1711 while( length-- )
1712 {
1713 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001715
1716 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1717
Paul Bakker66d5d072014-06-17 16:39:18 +02001718 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001719 }
1720 }
1721
1722 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001723
1724 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001725}
Paul Bakker556efba2014-01-24 15:38:12 +01001726
1727/*
1728 * AES-CFB8 buffer encryption/decryption
1729 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001730int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001731 int mode,
1732 size_t length,
1733 unsigned char iv[16],
1734 const unsigned char *input,
1735 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001736{
1737 unsigned char c;
1738 unsigned char ov[17];
1739
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001740 AES_VALIDATE_RET( ctx != NULL );
1741 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1742 mode == MBEDTLS_AES_DECRYPT );
1743 AES_VALIDATE_RET( iv != NULL );
1744 AES_VALIDATE_RET( input != NULL );
1745 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001746 while( length-- )
1747 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001748 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001749 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001751 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001752 ov[16] = *input;
1753
1754 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1755
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001756 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001757 ov[16] = c;
1758
Teppo Järvelin91d79382019-10-02 09:09:31 +03001759 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001760 }
1761
1762 return( 0 );
1763}
Simon Butcher76a5b222018-04-22 22:57:27 +01001764#endif /* MBEDTLS_CIPHER_MODE_CFB */
1765
1766#if defined(MBEDTLS_CIPHER_MODE_OFB)
1767/*
1768 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1769 */
1770int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001771 size_t length,
1772 size_t *iv_off,
1773 unsigned char iv[16],
1774 const unsigned char *input,
1775 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001776{
Simon Butcherad4e4932018-04-29 00:43:47 +01001777 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001778 size_t n;
1779
1780 AES_VALIDATE_RET( ctx != NULL );
1781 AES_VALIDATE_RET( iv_off != NULL );
1782 AES_VALIDATE_RET( iv != NULL );
1783 AES_VALIDATE_RET( input != NULL );
1784 AES_VALIDATE_RET( output != NULL );
1785
1786 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001787
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001788 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001789 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1790
Simon Butcher76a5b222018-04-22 22:57:27 +01001791 while( length-- )
1792 {
1793 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001794 {
1795 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1796 if( ret != 0 )
1797 goto exit;
1798 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001799 *output++ = *input++ ^ iv[n];
1800
1801 n = ( n + 1 ) & 0x0F;
1802 }
1803
1804 *iv_off = n;
1805
Simon Butcherad4e4932018-04-29 00:43:47 +01001806exit:
1807 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001808}
1809#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001811#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001812/*
1813 * AES-CTR buffer encryption/decryption
1814 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001815int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001816 size_t length,
1817 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001818 unsigned char nonce_counter[16],
1819 unsigned char stream_block[16],
1820 const unsigned char *input,
1821 unsigned char *output )
1822{
Paul Bakker369e14b2012-04-18 14:16:09 +00001823 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001824 size_t n;
1825
1826 AES_VALIDATE_RET( ctx != NULL );
1827 AES_VALIDATE_RET( nc_off != NULL );
1828 AES_VALIDATE_RET( nonce_counter != NULL );
1829 AES_VALIDATE_RET( stream_block != NULL );
1830 AES_VALIDATE_RET( input != NULL );
1831 AES_VALIDATE_RET( output != NULL );
1832
1833 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001834
Arto Kinnunen75439012019-12-03 14:12:10 +02001835 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001836 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1837
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001838 while( length-- )
1839 {
1840 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001841 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001842
Paul Bakker369e14b2012-04-18 14:16:09 +00001843 for( i = 16; i > 0; i-- )
1844 if( ++nonce_counter[i - 1] != 0 )
1845 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001846 }
1847 c = *input++;
1848 *output++ = (unsigned char)( c ^ stream_block[n] );
1849
Paul Bakker66d5d072014-06-17 16:39:18 +02001850 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001851 }
1852
1853 *nc_off = n;
1854
1855 return( 0 );
1856}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001857#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001861#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001862/*
1863 * AES test vectors from:
1864 *
1865 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1866 */
1867static const unsigned char aes_test_ecb_dec[3][16] =
1868{
1869 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1870 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1871 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1872 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1873 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1874 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1875};
1876
1877static const unsigned char aes_test_ecb_enc[3][16] =
1878{
1879 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1880 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1881 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1882 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1883 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1884 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1885};
1886
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001887#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001888static const unsigned char aes_test_cbc_dec[3][16] =
1889{
1890 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1891 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1892 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1893 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1894 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1895 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1896};
1897
1898static const unsigned char aes_test_cbc_enc[3][16] =
1899{
1900 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1901 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1902 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1903 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1904 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1905 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1906};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001907#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001909#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001910/*
1911 * AES-CFB128 test vectors from:
1912 *
1913 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1914 */
1915static const unsigned char aes_test_cfb128_key[3][32] =
1916{
1917 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1918 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1919 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1920 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1921 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1922 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1923 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1924 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1925 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1926};
1927
1928static const unsigned char aes_test_cfb128_iv[16] =
1929{
1930 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1931 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1932};
1933
1934static const unsigned char aes_test_cfb128_pt[64] =
1935{
1936 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1937 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1938 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1939 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1940 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1941 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1942 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1943 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1944};
1945
1946static const unsigned char aes_test_cfb128_ct[3][64] =
1947{
1948 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1949 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1950 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1951 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1952 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1953 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1954 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1955 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1956 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1957 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1958 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1959 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1960 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1961 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1962 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1963 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1964 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1965 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1966 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1967 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1968 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1969 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1970 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1971 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1972};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001973#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001974
Simon Butcherad4e4932018-04-29 00:43:47 +01001975#if defined(MBEDTLS_CIPHER_MODE_OFB)
1976/*
1977 * AES-OFB test vectors from:
1978 *
Simon Butcher5db13622018-06-04 22:11:25 +01001979 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001980 */
1981static const unsigned char aes_test_ofb_key[3][32] =
1982{
1983 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1984 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1985 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1986 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1987 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1988 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1989 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1990 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1991 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1992};
1993
1994static const unsigned char aes_test_ofb_iv[16] =
1995{
1996 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1997 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1998};
1999
2000static const unsigned char aes_test_ofb_pt[64] =
2001{
2002 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2003 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2004 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2005 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2006 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2007 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2008 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2009 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2010};
2011
2012static const unsigned char aes_test_ofb_ct[3][64] =
2013{
2014 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2015 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2016 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2017 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2018 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2019 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2020 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2021 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2022 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2023 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2024 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2025 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2026 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2027 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2028 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2029 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2030 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2031 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2032 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2033 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2034 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2035 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2036 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2037 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2038};
2039#endif /* MBEDTLS_CIPHER_MODE_OFB */
2040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002042/*
2043 * AES-CTR test vectors from:
2044 *
2045 * http://www.faqs.org/rfcs/rfc3686.html
2046 */
2047
2048static const unsigned char aes_test_ctr_key[3][16] =
2049{
2050 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2051 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2052 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2053 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2054 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2055 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2056};
2057
2058static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2059{
2060 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2062 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2063 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2064 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2065 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2066};
2067
2068static const unsigned char aes_test_ctr_pt[3][48] =
2069{
2070 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2071 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2072
2073 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2074 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2075 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2076 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2077
2078 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2079 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2080 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2081 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2082 0x20, 0x21, 0x22, 0x23 }
2083};
2084
2085static const unsigned char aes_test_ctr_ct[3][48] =
2086{
2087 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2088 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2089 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2090 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2091 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2092 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2093 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2094 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2095 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2096 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2097 0x25, 0xB2, 0x07, 0x2F }
2098};
2099
2100static const int aes_test_ctr_len[3] =
2101 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002102#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002103
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002104#if defined(MBEDTLS_CIPHER_MODE_XTS)
2105/*
2106 * AES-XTS test vectors from:
2107 *
2108 * IEEE P1619/D16 Annex B
2109 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2110 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2111 */
2112static const unsigned char aes_test_xts_key[][32] =
2113{
2114 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2118 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2119 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2120 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2121 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2122 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2123 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2124 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2125 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2126};
2127
2128static const unsigned char aes_test_xts_pt32[][32] =
2129{
2130 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2134 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2135 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2136 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2137 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2138 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2139 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2140 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2141 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2142};
2143
2144static const unsigned char aes_test_xts_ct32[][32] =
2145{
2146 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2147 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2148 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2149 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2150 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2151 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2152 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2153 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2154 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2155 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2156 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2157 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2158};
2159
2160static const unsigned char aes_test_xts_data_unit[][16] =
2161{
2162 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2164 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2166 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2168};
2169
2170#endif /* MBEDTLS_CIPHER_MODE_XTS */
2171
Paul Bakker5121ce52009-01-03 21:22:43 +00002172/*
2173 * Checkup routine
2174 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002176{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002177 int ret = 0, i, j, u, mode;
2178 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002179 unsigned char key[32];
2180 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002181 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002182#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002183 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002184#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002185#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002186 unsigned char prv[16];
2187#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002188#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2189 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002190 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002191#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002192#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002193 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002194#endif
2195#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002196 unsigned char nonce_counter[16];
2197 unsigned char stream_block[16];
2198#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002199 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002200
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002201 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002202 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002203
2204 /*
2205 * ECB mode
2206 */
2207 for( i = 0; i < 6; i++ )
2208 {
2209 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002210 keybits = 128 + u * 64;
2211 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002212
2213 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002214 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2215 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002216
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002217#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2218 if( keybits > 128 )
2219 {
2220 mbedtls_printf( "skipped\n" );
2221 continue;
2222 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002223#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2224
2225#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2226 if( mode == MBEDTLS_AES_DECRYPT )
2227 {
2228 mbedtls_printf( "skipped\n" );
2229 continue;
2230 }
2231#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002232
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002233 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002235 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002236 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002237 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2238 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002239 }
2240 else
2241 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002242 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2243 aes_tests = aes_test_ecb_enc[u];
2244 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002245
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002246 /*
2247 * AES-192 is an optional feature that may be unavailable when
2248 * there is an alternative underlying implementation i.e. when
2249 * MBEDTLS_AES_ALT is defined.
2250 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002251 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002252 {
2253 mbedtls_printf( "skipped\n" );
2254 continue;
2255 }
2256 else if( ret != 0 )
2257 {
2258 goto exit;
2259 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002260
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002261 for( j = 0; j < 10000; j++ )
2262 {
2263 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2264 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002265 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002266 }
2267
2268 if( memcmp( buf, aes_tests, 16 ) != 0 )
2269 {
2270 ret = 1;
2271 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002272 }
2273
2274 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002275 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002276 }
2277
2278 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002281#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002282 /*
2283 * CBC mode
2284 */
2285 for( i = 0; i < 6; i++ )
2286 {
2287 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002288 keybits = 128 + u * 64;
2289 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002290
2291 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002292 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2293 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002294
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002295#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2296 if( keybits > 128 )
2297 {
2298 mbedtls_printf( "skipped\n" );
2299 continue;
2300 }
2301#endif
2302
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002303#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2304 if( mode == MBEDTLS_AES_DECRYPT )
2305 {
2306 mbedtls_printf( "skipped\n" );
2307 continue;
2308 }
2309#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2310
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002311 memset( iv , 0, 16 );
2312 memset( prv, 0, 16 );
2313 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002314
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002315 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002316 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002317 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2318 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002319 }
2320 else
2321 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002322 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2323 aes_tests = aes_test_cbc_enc[u];
2324 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002325
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002326 /*
2327 * AES-192 is an optional feature that may be unavailable when
2328 * there is an alternative underlying implementation i.e. when
2329 * MBEDTLS_AES_ALT is defined.
2330 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002331 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002332 {
2333 mbedtls_printf( "skipped\n" );
2334 continue;
2335 }
2336 else if( ret != 0 )
2337 {
2338 goto exit;
2339 }
2340
2341 for( j = 0; j < 10000; j++ )
2342 {
2343 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002344 {
2345 unsigned char tmp[16];
2346
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002347 memcpy( tmp, prv, 16 );
2348 memcpy( prv, buf, 16 );
2349 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002350 }
2351
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002352 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2353 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002354 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002355
2356 }
2357
2358 if( memcmp( buf, aes_tests, 16 ) != 0 )
2359 {
2360 ret = 1;
2361 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002362 }
2363
2364 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002365 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002366 }
2367
2368 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002369 mbedtls_printf( "\n" );
2370#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002372#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002373 /*
2374 * CFB128 mode
2375 */
2376 for( i = 0; i < 6; i++ )
2377 {
2378 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002379 keybits = 128 + u * 64;
2380 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002381
2382 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002383 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2384 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002385
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002386#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2387 if( keybits > 128 )
2388 {
2389 mbedtls_printf( "skipped\n" );
2390 continue;
2391 }
2392#endif
2393
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002394#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2395 if( mode == MBEDTLS_AES_DECRYPT )
2396 {
2397 mbedtls_printf( "skipped\n" );
2398 continue;
2399 }
2400#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2401
Paul Bakker5121ce52009-01-03 21:22:43 +00002402 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002403 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
2405 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002406 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002407 /*
2408 * AES-192 is an optional feature that may be unavailable when
2409 * there is an alternative underlying implementation i.e. when
2410 * MBEDTLS_AES_ALT is defined.
2411 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002412 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002413 {
2414 mbedtls_printf( "skipped\n" );
2415 continue;
2416 }
2417 else if( ret != 0 )
2418 {
2419 goto exit;
2420 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002421
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002422 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002423 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002424 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002425 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002426 }
2427 else
2428 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002429 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002430 aes_tests = aes_test_cfb128_ct[u];
2431 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002432
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002433 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2434 if( ret != 0 )
2435 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002436
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002437 if( memcmp( buf, aes_tests, 64 ) != 0 )
2438 {
2439 ret = 1;
2440 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002441 }
2442
2443 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002444 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002445 }
2446
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002447 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002448 mbedtls_printf( "\n" );
2449#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002450
Simon Butcherad4e4932018-04-29 00:43:47 +01002451#if defined(MBEDTLS_CIPHER_MODE_OFB)
2452 /*
2453 * OFB mode
2454 */
2455 for( i = 0; i < 6; i++ )
2456 {
2457 u = i >> 1;
2458 keybits = 128 + u * 64;
2459 mode = i & 1;
2460
2461 if( verbose != 0 )
2462 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2463 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2464
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002465#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2466 if( keybits > 128 )
2467 {
2468 mbedtls_printf( "skipped\n" );
2469 continue;
2470 }
2471#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002472
2473#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2474 if( mode == MBEDTLS_AES_DECRYPT )
2475 {
2476 mbedtls_printf( "skipped\n" );
2477 continue;
2478 }
2479#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2480
Simon Butcherad4e4932018-04-29 00:43:47 +01002481 memcpy( iv, aes_test_ofb_iv, 16 );
2482 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2483
2484 offset = 0;
2485 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2486 /*
2487 * AES-192 is an optional feature that may be unavailable when
2488 * there is an alternative underlying implementation i.e. when
2489 * MBEDTLS_AES_ALT is defined.
2490 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002491 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002492 {
2493 mbedtls_printf( "skipped\n" );
2494 continue;
2495 }
2496 else if( ret != 0 )
2497 {
2498 goto exit;
2499 }
2500
2501 if( mode == MBEDTLS_AES_DECRYPT )
2502 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002503 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002504 aes_tests = aes_test_ofb_pt;
2505 }
2506 else
2507 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002508 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002509 aes_tests = aes_test_ofb_ct[u];
2510 }
2511
2512 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2513 if( ret != 0 )
2514 goto exit;
2515
2516 if( memcmp( buf, aes_tests, 64 ) != 0 )
2517 {
2518 ret = 1;
2519 goto exit;
2520 }
2521
2522 if( verbose != 0 )
2523 mbedtls_printf( "passed\n" );
2524 }
2525
2526 if( verbose != 0 )
2527 mbedtls_printf( "\n" );
2528#endif /* MBEDTLS_CIPHER_MODE_OFB */
2529
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002530#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002531 /*
2532 * CTR mode
2533 */
2534 for( i = 0; i < 6; i++ )
2535 {
2536 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002537 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002538
2539 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002540 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002541 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002542
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002543#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2544 if( keybits > 128 )
2545 {
2546 mbedtls_printf( "skipped\n" );
2547 continue;
2548 }
2549#endif
2550
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002551#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2552 if( mode == MBEDTLS_AES_DECRYPT )
2553 {
2554 mbedtls_printf( "skipped\n" );
2555 continue;
2556 }
2557#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2558
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002559 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2560 memcpy( key, aes_test_ctr_key[u], 16 );
2561
2562 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002563 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2564 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002565
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002566 len = aes_test_ctr_len[u];
2567
2568 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002569 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002570 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002571 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002572 }
2573 else
2574 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002575 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002576 aes_tests = aes_test_ctr_ct[u];
2577 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002578
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002579 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2580 stream_block, buf, buf );
2581 if( ret != 0 )
2582 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002583
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002584 if( memcmp( buf, aes_tests, len ) != 0 )
2585 {
2586 ret = 1;
2587 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002588 }
2589
2590 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002591 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002592 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002593
2594 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002595 mbedtls_printf( "\n" );
2596#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002597
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002598#if defined(MBEDTLS_CIPHER_MODE_XTS)
2599 {
2600 static const int num_tests =
2601 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2602 mbedtls_aes_xts_context ctx_xts;
2603
2604 /*
2605 * XTS mode
2606 */
2607 mbedtls_aes_xts_init( &ctx_xts );
2608
2609 for( i = 0; i < num_tests << 1; i++ )
2610 {
2611 const unsigned char *data_unit;
2612 u = i >> 1;
2613 mode = i & 1;
2614
2615 if( verbose != 0 )
2616 mbedtls_printf( " AES-XTS-128 (%s): ",
2617 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2618
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002619#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2620 if( mode == MBEDTLS_AES_DECRYPT )
2621 {
2622 mbedtls_printf( "skipped\n" );
2623 continue;
2624 }
2625#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2626
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002627 memset( key, 0, sizeof( key ) );
2628 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002629 data_unit = aes_test_xts_data_unit[u];
2630
2631 len = sizeof( *aes_test_xts_ct32 );
2632
2633 if( mode == MBEDTLS_AES_DECRYPT )
2634 {
2635 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2636 if( ret != 0)
2637 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002638 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002639 aes_tests = aes_test_xts_pt32[u];
2640 }
2641 else
2642 {
2643 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2644 if( ret != 0)
2645 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002646 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002647 aes_tests = aes_test_xts_ct32[u];
2648 }
2649
2650
2651 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2652 buf, buf );
2653 if( ret != 0 )
2654 goto exit;
2655
2656 if( memcmp( buf, aes_tests, len ) != 0 )
2657 {
2658 ret = 1;
2659 goto exit;
2660 }
2661
2662 if( verbose != 0 )
2663 mbedtls_printf( "passed\n" );
2664 }
2665
2666 if( verbose != 0 )
2667 mbedtls_printf( "\n" );
2668
2669 mbedtls_aes_xts_free( &ctx_xts );
2670 }
2671#endif /* MBEDTLS_CIPHER_MODE_XTS */
2672
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002673 ret = 0;
2674
2675exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002676 if( ret != 0 && verbose != 0 )
2677 mbedtls_printf( "failed\n" );
2678
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002679 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002680
2681 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002682}
2683
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002684#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002686#endif /* MBEDTLS_AES_C */