blob: 9098d4795bf3558104f884bc09479910038e596f [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
23 *
24 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
25 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Rich Evans00ab4702015-02-06 13:43:58 +000036#include <string.h>
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030039#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050040#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_SELF_TEST)
49#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#else
Rich Evans00ab4702015-02-06 13:43:58 +000052#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#define mbedtls_printf printf
54#endif /* MBEDTLS_PLATFORM_C */
55#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010059/* Parameter validation macros based on platform_util.h */
60#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010061 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010062#define AES_VALIDATE( cond ) \
63 MBEDTLS_INTERNAL_VALIDATE( cond )
64
Paul Bakker5121ce52009-01-03 21:22:43 +000065/*
66 * 32-bit integer manipulation macros (little endian)
67 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef GET_UINT32_LE
69#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000071 (n) = ( (uint32_t) (b)[(i) ] ) \
72 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
73 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
74 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
76#endif
77
Paul Bakker5c2364c2012-10-01 14:41:15 +000078#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000079#define PUT_UINT32_LE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
82 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
83 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
84 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000085}
86#endif
87
Arto Kinnunen172836a2019-11-28 13:34:13 +020088/*
89 * Data structure for AES round data
90 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020091typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020092 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020093 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020094} aes_r_data_t;
95
96#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen17540ab2020-01-20 11:46:34 +020097/* Number of additional AES dummy rounds added for SCA countermeasures */
Arto Kinnunen98c93af2020-01-14 13:31:03 +020098#define AES_SCA_CM_ROUNDS 5
Arto Kinnunen172836a2019-11-28 13:34:13 +020099#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101#if defined(MBEDTLS_PADLOCK_C) && \
102 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000103static int aes_padlock_ace = -1;
104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000107/*
108 * Forward S-box
109 */
110static const unsigned char FSb[256] =
111{
112 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
113 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
114 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
115 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
116 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
117 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
118 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
119 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
120 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
121 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
122 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
123 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
124 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
125 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
126 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
127 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
128 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
129 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
130 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
131 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
132 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
133 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
134 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
135 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
136 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
137 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
138 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
139 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
140 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
141 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
142 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
143 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
144};
145
146/*
147 * Forward tables
148 */
149#define FT \
150\
151 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
152 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
153 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
154 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
155 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
156 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
157 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
158 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
159 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
160 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
161 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
162 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
163 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
164 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
165 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
166 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
167 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
168 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
169 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
170 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
171 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
172 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
173 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
174 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
175 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
176 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
177 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
178 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
179 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
180 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
181 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
182 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
183 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
184 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
185 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
186 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
187 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
188 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
189 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
190 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
191 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
192 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
193 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
194 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
195 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
196 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
197 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
198 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
199 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
200 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
201 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
202 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
203 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
204 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
205 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
206 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
207 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
208 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
209 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
210 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
211 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
212 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
213 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
214 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
215
216#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000217static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000218#undef V
219
Hanno Beckerad049a92017-06-19 16:31:54 +0100220#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200221
Paul Bakker5121ce52009-01-03 21:22:43 +0000222#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000223static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#undef V
225
226#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000227static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000228#undef V
229
230#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000231static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000232#undef V
233
Hanno Becker177d3cf2017-06-07 15:52:48 +0100234#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200235
Paul Bakker5121ce52009-01-03 21:22:43 +0000236#undef FT
237
Arto Kinnunen14804442019-10-16 13:43:59 +0300238#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000239/*
240 * Reverse S-box
241 */
242static const unsigned char RSb[256] =
243{
244 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
245 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
246 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
247 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
248 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
249 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
250 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
251 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
252 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
253 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
254 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
255 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
256 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
257 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
258 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
259 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
260 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
261 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
262 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
263 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
264 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
265 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
266 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
267 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
268 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
269 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
270 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
271 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
272 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
273 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
274 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
275 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
276};
Arto Kinnunen14804442019-10-16 13:43:59 +0300277#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
279/*
280 * Reverse tables
281 */
282#define RT \
283\
284 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
285 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
286 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
287 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
288 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
289 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
290 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
291 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
292 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
293 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
294 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
295 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
296 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
297 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
298 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
299 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
300 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
301 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
302 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
303 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
304 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
305 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
306 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
307 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
308 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
309 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
310 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
311 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
312 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
313 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
314 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
315 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
316 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
317 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
318 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
319 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
320 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
321 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
322 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
323 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
324 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
325 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
326 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
327 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
328 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
329 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
330 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
331 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
332 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
333 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
334 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
335 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
336 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
337 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
338 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
339 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
340 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
341 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
342 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
343 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
344 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
345 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
346 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
347 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
348
Arto Kinnunen14804442019-10-16 13:43:59 +0300349#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000350#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000351static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#undef V
353
Hanno Beckerad049a92017-06-19 16:31:54 +0100354#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#undef V
359
360#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000361static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000362#undef V
363
364#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000365static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000366#undef V
367
Hanno Becker177d3cf2017-06-07 15:52:48 +0100368#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300369#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200370
Paul Bakker5121ce52009-01-03 21:22:43 +0000371#undef RT
372
373/*
374 * Round constants
375 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000376static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
378 0x00000001, 0x00000002, 0x00000004, 0x00000008,
379 0x00000010, 0x00000020, 0x00000040, 0x00000080,
380 0x0000001B, 0x00000036
381};
382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385/*
386 * Forward S-box & tables
387 */
388static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200389static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100390#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT1[256];
392static uint32_t FT2[256];
393static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100394#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
396/*
397 * Reverse S-box & tables
398 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300399#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000400static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100402#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT1[256];
404static uint32_t RT2[256];
405static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100406#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300407#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
409/*
410 * Round constants
411 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000412static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000413
414/*
415 * Tables generation code
416 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100417#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
418#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100419#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
421static int aes_init_done = 0;
422
423static void aes_gen_tables( void )
424{
425 int i, x, y, z;
426 int pow[256];
427 int log[256];
428
429 /*
430 * compute pow and log tables over GF(2^8)
431 */
432 for( i = 0, x = 1; i < 256; i++ )
433 {
434 pow[i] = x;
435 log[x] = i;
436 x = ( x ^ XTIME( x ) ) & 0xFF;
437 }
438
439 /*
440 * calculate the round constants
441 */
442 for( i = 0, x = 1; i < 10; i++ )
443 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000444 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 x = XTIME( x ) & 0xFF;
446 }
447
448 /*
449 * generate the forward and reverse S-boxes
450 */
451 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300452#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000455
456 for( i = 1; i < 256; i++ )
457 {
458 x = pow[255 - log[i]];
459
Paul Bakker66d5d072014-06-17 16:39:18 +0200460 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
461 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
462 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 x ^= y ^ 0x63;
465
466 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300467#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 }
471
472 /*
473 * generate the forward and reverse tables
474 */
475 for( i = 0; i < 256; i++ )
476 {
477 x = FSb[i];
478 y = XTIME( x ) & 0xFF;
479 z = ( y ^ x ) & 0xFF;
480
Paul Bakker5c2364c2012-10-01 14:41:15 +0000481 FT0[i] = ( (uint32_t) y ) ^
482 ( (uint32_t) x << 8 ) ^
483 ( (uint32_t) x << 16 ) ^
484 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
Hanno Beckerad049a92017-06-19 16:31:54 +0100486#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 FT1[i] = ROTL8( FT0[i] );
488 FT2[i] = ROTL8( FT1[i] );
489 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100490#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300492#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000493 x = RSb[i];
494
Paul Bakker5c2364c2012-10-01 14:41:15 +0000495 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
496 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
497 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
498 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
Hanno Beckerad049a92017-06-19 16:31:54 +0100500#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000501 RT1[i] = ROTL8( RT0[i] );
502 RT2[i] = ROTL8( RT1[i] );
503 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100504#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300505#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 }
507}
508
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200509#undef ROTL8
510
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Arto Kinnunen172836a2019-11-28 13:34:13 +0200513/**
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200514 * Randomize positions for AES SCA countermeasures if AES countermeasures are
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200515 * enabled. If the countermeasures are not enabled then we fill the given table
516 * with only real AES rounds to be executed.
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200517 *
518 * Dummy rounds are added as follows:
519 * 1. One dummy round added to the initial round key addition (executed in
520 * random order).
521 * 2. Random number of dummy rounds added as first and/or last AES calculation
522 * round. Total number of dummy rounds is AES_SCA_CM_ROUNDS.
523 *
524 * Description of the bytes in the table are as follows:
525 * - 2 bytes for initial round key addition
526 * - remaining bytes for AES calculation with real or dummy data
527 *
528 * Each byte indicates one AES calculation round:
529 * -4 high bit = table to use 0x10 for dummy data, 0x00 real data
530 * -bit 2 = offset for even/odd rounds
531 * -bit 0-1: stop mark (0x03) to indicate calculation end
Arto Kinnunen172836a2019-11-28 13:34:13 +0200532 *
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200533 * Return Number of additional AES rounds
534 *
535 * Example of the control bytes:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200536 * R = real data in actual AES calculation round
537 * Ri = Real data in initial round key addition phase
538 * F = fake data in actual AES calculation round
539 * Fi = fake data in initial round key addition phase
540 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200541 * 1. No countermeasures enabled and AES-128, only real data (R) used:
542 * | Ri | R | R | R | R | R | R | R | R | R | R |
543 * |0x03|0x04|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x07|0x03|
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200544 *
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200545 * 2. Countermeasures enabled, 3 (F) dummy rounds in start and 1 at end:
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200546 * | Fi | Ri | F | F | F | R | R | ... | R | R | R | R | F |
547 * |0x10|0x03|0x10|0x10|0x10|0x04|0x00| ... |0x04|0x00|0x04|0x03|0x07|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200548 */
Arto Kinnunen311ab592020-01-16 17:20:51 +0200549#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200550static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200551{
Arto Kinnunen311ab592020-01-16 17:20:51 +0200552 int i = 0, j, is_even_pos, dummy_rounds, num;
Arto Kinnunen172836a2019-11-28 13:34:13 +0200553
Jarno Lamsa8f8c0bd2020-01-08 15:07:41 +0200554 mbedtls_platform_memset( tbl, 0, tbl_len );
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200555 // get random from 0x0fff (each f will be used separately)
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200556 num = mbedtls_platform_random_in_range( 0x1000 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200557
558 // Randomize execution order of initial round key addition
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200559 if ( ( num & 0x0100 ) == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200560 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200561 tbl[i++] = 0x10; // dummy data
562 tbl[i++] = 0x00 | 0x03; // real data + stop marker
563 } else {
564 tbl[i++] = 0x00; // real data
565 tbl[i++] = 0x10 | 0x03; // dummy data + stop marker
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200568 // Randomize number of dummy AES rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200569 dummy_rounds = AES_SCA_CM_ROUNDS - ( ( num & 0x0010 ) >> 4 );
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200570 tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds);
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200571
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200572 // randomize positions for the dummy rounds
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200573 num = ( num & 0x000f ) % ( dummy_rounds + 1 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200574
575 // add dummy rounds after initial round key addition (if needed)
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200576 for ( ; i < num + 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200577 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200578 tbl[i] = 0x10; // dummy data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200579 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200580
Arto Kinnunen2b24f422020-01-16 15:04:11 +0200581 // add dummy rounds to the end, (AES_SCA_CM_ROUNDS - num) rounds if needed
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200582 for ( j = tbl_len - dummy_rounds + num; j < tbl_len; j++ )
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200583 {
584 tbl[j] = 0x10; // dummy data
585 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200586
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200587 // Fill real AES data to the remaining places
Arto Kinnunen172836a2019-11-28 13:34:13 +0200588 is_even_pos = 1;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200589 for( ; i < tbl_len; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200591 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200593 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200595 tbl[i] = 0x04; // real data, offset for rounds 1,3,5, etc...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200596 is_even_pos = 0;
597 }
598 else
599 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200600 tbl[i] = 0x00; // real data, offset for rounds 2,4,6,...
Arto Kinnunen172836a2019-11-28 13:34:13 +0200601 is_even_pos = 1;
602 }
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200603 j = i; // remember the final round position in table
Arto Kinnunen172836a2019-11-28 13:34:13 +0200604 }
605 }
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200606
Arto Kinnunen2eb678f2020-01-13 16:44:13 +0200607 tbl[( tbl_len - 1)] |= 0x03; // Stop marker for the last item in tbl
608 tbl[( j - 1 )] |= 0x03; // stop marker for final - 1 real data
609
Arto Kinnunen98c93af2020-01-14 13:31:03 +0200610 return( dummy_rounds );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200611}
Arto Kinnunen17540ab2020-01-20 11:46:34 +0200612#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Arto Kinnunen172836a2019-11-28 13:34:13 +0200613
Hanno Beckerad049a92017-06-19 16:31:54 +0100614#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200615
616#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
617#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
618#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
619
620#define AES_RT0(idx) RT0[idx]
621#define AES_RT1(idx) ROTL8( RT0[idx] )
622#define AES_RT2(idx) ROTL16( RT0[idx] )
623#define AES_RT3(idx) ROTL24( RT0[idx] )
624
625#define AES_FT0(idx) FT0[idx]
626#define AES_FT1(idx) ROTL8( FT0[idx] )
627#define AES_FT2(idx) ROTL16( FT0[idx] )
628#define AES_FT3(idx) ROTL24( FT0[idx] )
629
Hanno Becker177d3cf2017-06-07 15:52:48 +0100630#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200631
632#define AES_RT0(idx) RT0[idx]
633#define AES_RT1(idx) RT1[idx]
634#define AES_RT2(idx) RT2[idx]
635#define AES_RT3(idx) RT3[idx]
636
637#define AES_FT0(idx) FT0[idx]
638#define AES_FT1(idx) FT1[idx]
639#define AES_FT2(idx) FT2[idx]
640#define AES_FT3(idx) FT3[idx]
641
Hanno Becker177d3cf2017-06-07 15:52:48 +0100642#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200645{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100646 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000647
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200648 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649}
650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200652{
653 if( ctx == NULL )
654 return;
655
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500656 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200657}
658
Jaeden Amero9366feb2018-05-29 18:55:17 +0100659#if defined(MBEDTLS_CIPHER_MODE_XTS)
660void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
661{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100662 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000663
Jaeden Amero9366feb2018-05-29 18:55:17 +0100664 mbedtls_aes_init( &ctx->crypt );
665 mbedtls_aes_init( &ctx->tweak );
666}
667
668void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
669{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100670 if( ctx == NULL )
671 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000672
Jaeden Amero9366feb2018-05-29 18:55:17 +0100673 mbedtls_aes_free( &ctx->crypt );
674 mbedtls_aes_free( &ctx->tweak );
675}
676#endif /* MBEDTLS_CIPHER_MODE_XTS */
677
Paul Bakker5121ce52009-01-03 21:22:43 +0000678/*
679 * AES key schedule (encryption)
680 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200681#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200683 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000684{
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200685 unsigned int j = 0;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200686 unsigned int flow_ctrl = 0;
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200687 volatile unsigned int i = 0;
688 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000689 uint32_t *RK;
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200690 uint32_t offset = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000691
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100692 AES_VALIDATE_RET( ctx != NULL );
693 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000694
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200695 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 {
697 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300698#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000699 case 192: ctx->nr = 12; break;
700 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300701#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000703 }
704
Simon Butcher5201e412018-12-06 17:40:14 +0000705#if !defined(MBEDTLS_AES_ROM_TABLES)
706 if( aes_init_done == 0 )
707 {
708 aes_gen_tables();
709 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000710 }
711#endif
712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000714 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100715 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000716
717 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000719 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000720#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000721 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100724 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200725 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100726#endif
727
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200728 mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 );
729 offset = mbedtls_platform_random_in_range( keybits >> 5 );
730
731 for( j = offset; j < ( keybits >> 5 ); j++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000732 {
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200733 GET_UINT32_LE( RK[j], key, j << 2 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200734 flow_ctrl++;
735 }
736
737 for( j = 0; j < offset; j++ )
738 {
739 GET_UINT32_LE( RK[j], key, j << 2 );
740 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000741 }
742
743 switch( ctx->nr )
744 {
745 case 10:
746
747 for( i = 0; i < 10; i++, RK += 4 )
748 {
749 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000750 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
751 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
752 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
753 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000754
755 RK[5] = RK[1] ^ RK[4];
756 RK[6] = RK[2] ^ RK[5];
757 RK[7] = RK[3] ^ RK[6];
758 }
759 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300760#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000761 case 12:
762
763 for( i = 0; i < 8; i++, RK += 6 )
764 {
765 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000766 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
767 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
768 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
769 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000770
771 RK[7] = RK[1] ^ RK[6];
772 RK[8] = RK[2] ^ RK[7];
773 RK[9] = RK[3] ^ RK[8];
774 RK[10] = RK[4] ^ RK[9];
775 RK[11] = RK[5] ^ RK[10];
776 }
777 break;
778
779 case 14:
780
781 for( i = 0; i < 7; i++, RK += 8 )
782 {
783 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000784 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
785 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
786 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
787 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000788
789 RK[9] = RK[1] ^ RK[8];
790 RK[10] = RK[2] ^ RK[9];
791 RK[11] = RK[3] ^ RK[10];
792
793 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000794 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
795 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
796 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
797 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000798
799 RK[13] = RK[5] ^ RK[12];
800 RK[14] = RK[6] ^ RK[13];
801 RK[15] = RK[7] ^ RK[14];
802 }
803 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300804#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000805 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000806
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200807 ret = 0;
808
809 /* Validate execution path */
Jarno Lamsa282db8e2020-01-08 14:53:17 +0200810 if( ( flow_ctrl == keybits >> 5 ) && ( ( ctx->nr == 10 && i == 10 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200811#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
812 || ( ctx->nr == 12 && i == 8 )
813 || ( ctx->nr == 14 && i == 7 )
814#endif
815 ) )
816 {
817 return ret;
818 }
819
820 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000821}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200822#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
824/*
825 * AES key schedule (decryption)
826 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200827#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200829 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000830{
Arto Kinnunen14804442019-10-16 13:43:59 +0300831#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
832 (void) ctx;
833 (void) key;
834 (void) keybits;
835
836 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
837#else /* */
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200838 volatile unsigned int i = 0, j = 0;
839 volatile int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200840 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000841 uint32_t *RK;
842 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200843
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100844 AES_VALIDATE_RET( ctx != NULL );
845 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000846
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000848
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000850 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100851 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000852
853 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000855 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000856#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000857 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000858
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200859 /* Also checks keybits */
860 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200861 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000862
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200863 ctx->nr = cty.nr;
864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100866 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100867 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100869 (const unsigned char *) cty.rk, ctx->nr );
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200870 i = 0;
871 j = 4;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200872 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100873 }
874#endif
875
Paul Bakker5121ce52009-01-03 21:22:43 +0000876 SK = cty.rk + cty.nr * 4;
877
878 *RK++ = *SK++;
879 *RK++ = *SK++;
880 *RK++ = *SK++;
881 *RK++ = *SK++;
882
883 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
884 {
885 for( j = 0; j < 4; j++, SK++ )
886 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200887 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
888 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
889 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
890 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000891 }
892 }
893
894 *RK++ = *SK++;
895 *RK++ = *SK++;
896 *RK++ = *SK++;
897 *RK++ = *SK++;
898
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200899exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200900 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000901
Arto Kinnunen6ce49882019-12-03 13:56:06 +0200902 if( ret != 0 )
903 {
904 return( ret );
905 }
906 else if( ( i == 0 ) && ( j == 4 ) )
907 {
908 return( ret );
909 }
910 else
911 {
912 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
913 }
914
Arto Kinnunen14804442019-10-16 13:43:59 +0300915#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000916}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100917
918#if defined(MBEDTLS_CIPHER_MODE_XTS)
919static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
920 unsigned int keybits,
921 const unsigned char **key1,
922 unsigned int *key1bits,
923 const unsigned char **key2,
924 unsigned int *key2bits )
925{
926 const unsigned int half_keybits = keybits / 2;
927 const unsigned int half_keybytes = half_keybits / 8;
928
929 switch( keybits )
930 {
931 case 256: break;
932 case 512: break;
933 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
934 }
935
936 *key1bits = half_keybits;
937 *key2bits = half_keybits;
938 *key1 = &key[0];
939 *key2 = &key[half_keybytes];
940
941 return 0;
942}
943
944int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
945 const unsigned char *key,
946 unsigned int keybits)
947{
948 int ret;
949 const unsigned char *key1, *key2;
950 unsigned int key1bits, key2bits;
951
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100952 AES_VALIDATE_RET( ctx != NULL );
953 AES_VALIDATE_RET( key != NULL );
954
Jaeden Amero9366feb2018-05-29 18:55:17 +0100955 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
956 &key2, &key2bits );
957 if( ret != 0 )
958 return( ret );
959
960 /* Set the tweak key. Always set tweak key for the encryption mode. */
961 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
962 if( ret != 0 )
963 return( ret );
964
965 /* Set crypt key for encryption. */
966 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
967}
968
969int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
970 const unsigned char *key,
971 unsigned int keybits)
972{
973 int ret;
974 const unsigned char *key1, *key2;
975 unsigned int key1bits, key2bits;
976
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100977 AES_VALIDATE_RET( ctx != NULL );
978 AES_VALIDATE_RET( key != NULL );
979
Jaeden Amero9366feb2018-05-29 18:55:17 +0100980 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
981 &key2, &key2bits );
982 if( ret != 0 )
983 return( ret );
984
985 /* Set the tweak key. Always set tweak key for encryption. */
986 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
987 if( ret != 0 )
988 return( ret );
989
990 /* Set crypt key for decryption. */
991 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
992}
993#endif /* MBEDTLS_CIPHER_MODE_XTS */
994
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200995#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000996
Paul Bakker5121ce52009-01-03 21:22:43 +0000997/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200998 * AES-ECB block encryption
999 */
1000#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001001
Arto Kinnunen311ab592020-01-16 17:20:51 +02001002#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001003static uint32_t *aes_fround( uint32_t *R,
1004 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1005 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1006{
1007 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
1008 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
1009 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
1010 AES_FT3( ( Y3 >> 24 ) & 0xFF );
1011
1012 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
1013 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
1014 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
1015 AES_FT3( ( Y0 >> 24 ) & 0xFF );
1016
1017 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
1018 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
1019 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
1020 AES_FT3( ( Y1 >> 24 ) & 0xFF );
1021
1022 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
1023 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
1024 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
1025 AES_FT3( ( Y2 >> 24 ) & 0xFF );
1026
1027 return R;
1028}
1029
1030static void aes_fround_final( uint32_t *R,
1031 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1032 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1033{
1034 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
1035 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1036 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1037 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1038
1039 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
1040 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1041 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1042 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1043
1044 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
1045 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1046 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1047 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1048
1049 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
1050 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1051 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1052 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1053}
1054
Andres AGf5bf7182017-03-03 14:09:56 +00001055int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1056 const unsigned char input[16],
1057 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001058{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001059 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001060 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001061 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001062 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001063 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001064 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001065 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001066 // control bytes for AES calculation rounds,
1067 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1068 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001069
Arto Kinnunen172836a2019-11-28 13:34:13 +02001070 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001071 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001072 aes_data_table[0] = &aes_data_real;
1073 aes_data_table[1] = &aes_data_fake;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001074
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001075 // Get AES calculation control bytes
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001076 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
1077 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001078 flow_control = dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001079
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001080 // SCA countermeasure, safely clear the aes_data_real.xy_values
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001081 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001082
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001083 // SCA countermeasure, randomize secret data location by initializing it in
1084 // a random order and writing randomized fake data between the real data
1085 // writes.
1086 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001087 i = offset;
1088 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001089 {
1090 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001091 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001092 flow_control++;
1093 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001094
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001095 tindex = 0;
1096 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001097 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001098 // Get pointer to the real or fake data
1099 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1100 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001101
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001102 // initial round key addition
1103 for( i = 0; i < 4; i++ )
1104 {
1105 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1106 }
1107 tindex++;
1108 flow_control++;
1109 } while( stop_mark == 0 );
1110
1111 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1112 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001113 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001114 // Get pointer to the real or fake data
1115 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1116 offset = round_ctrl_table[tindex] & 0x04;
1117 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001118
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001119 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1120 &aes_data_ptr->xy_values[0 + offset],
1121 &aes_data_ptr->xy_values[1 + offset],
1122 &aes_data_ptr->xy_values[2 + offset],
1123 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001124 aes_data_ptr->xy_values[4 - offset],
1125 aes_data_ptr->xy_values[5 - offset],
1126 aes_data_ptr->xy_values[6 - offset],
1127 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001128 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001129 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001130 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001131
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001132 // Calculate final AES round + dummy rounds
1133 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001134 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001135 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1136 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001137 aes_fround_final( aes_data_ptr->rk_ptr,
1138 &aes_data_ptr->xy_values[0],
1139 &aes_data_ptr->xy_values[1],
1140 &aes_data_ptr->xy_values[2],
1141 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001142 aes_data_ptr->xy_values[4],
1143 aes_data_ptr->xy_values[5],
1144 aes_data_ptr->xy_values[6],
1145 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001146 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001147 tindex++;
1148 } while( stop_mark == 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +02001149
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001150 // SCA countermeasure, safely clear the output
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001151 mbedtls_platform_memset( output, 0, 16 );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001152
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001153 // SCA countermeasure, randomize secret data location by writing to it in
1154 // a random order.
1155 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001156 i = offset;
1157 do
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001158 {
1159 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1160 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001161 } while( ( i = ( i + 1 ) % 4 ) != offset );
Jarno Lamsa282db8e2020-01-08 14:53:17 +02001162
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001163 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001164 {
1165 /* Validate control path due possible fault injection */
1166 return 0;
1167 }
1168
1169 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001170}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001171
1172#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1173
1174#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1175 do \
1176 { \
1177 (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \
1178 AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1179 AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1180 AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \
1181 \
1182 (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \
1183 AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1184 AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1185 AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \
1186 \
1187 (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \
1188 AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1189 AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1190 AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \
1191 \
1192 (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \
1193 AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1194 AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1195 AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \
1196 } while( 0 )
1197
1198int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1199 const unsigned char input[16],
1200 unsigned char output[16] )
1201{
1202 int i;
1203 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1204
1205 RK = ctx->rk;
1206
1207 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1208 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1209 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1210 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1211
1212 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1213 {
1214 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1215 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1216 }
1217
1218 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1219
1220 X0 = *RK++ ^ \
1221 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
1222 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1223 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1224 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1225
1226 X1 = *RK++ ^ \
1227 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
1228 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1229 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1230 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1231
1232 X2 = *RK++ ^ \
1233 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
1234 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1235 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1236 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1237
1238 X3 = *RK++ ^ \
1239 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
1240 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1241 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1242 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1243
1244 PUT_UINT32_LE( X0, output, 0 );
1245 PUT_UINT32_LE( X1, output, 4 );
1246 PUT_UINT32_LE( X2, output, 8 );
1247 PUT_UINT32_LE( X3, output, 12 );
1248
1249 return( 0 );
1250}
1251#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001252#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1253
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001254#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001255void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1256 const unsigned char input[16],
1257 unsigned char output[16] )
1258{
1259 mbedtls_internal_aes_encrypt( ctx, input, output );
1260}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001261#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001262
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001263/*
1264 * AES-ECB block decryption
1265 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001266
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001267#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001268#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001269
Arto Kinnunen311ab592020-01-16 17:20:51 +02001270#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001271static uint32_t *aes_rround( uint32_t *R,
1272 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1273 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1274{
1275 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1276 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1277 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1278 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1279
1280 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1281 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1282 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1283 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1284
1285 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1286 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1287 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1288 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1289
1290 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1291 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1292 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1293 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1294 return R;
1295}
1296
1297static void aes_rround_final( uint32_t *R,
1298 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1299 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1300{
1301 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1302 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1303 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1304 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1305
1306 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1307 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1308 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1309 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1310
1311 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1312 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1313 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1314 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1315
1316 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1317 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1318 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1319 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1320}
1321
Andres AGf5bf7182017-03-03 14:09:56 +00001322int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1323 const unsigned char input[16],
1324 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001325{
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001326 int i, tindex, offset, stop_mark, dummy_rounds;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001327 aes_r_data_t aes_data_real; // real data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001328 aes_r_data_t aes_data_fake; // fake data
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001329 aes_r_data_t *aes_data_ptr; // pointer to real or fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +02001330 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunen311ab592020-01-16 17:20:51 +02001331 int round_ctrl_table_len = ctx->nr + 2 + AES_SCA_CM_ROUNDS;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001332 volatile int flow_control;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001333 // control bytes for AES calculation rounds,
1334 // reserve based on max rounds + dummy rounds + 2 (for initial key addition)
1335 uint8_t round_ctrl_table[( 14 + AES_SCA_CM_ROUNDS + 2 )];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001336
Arto Kinnunen172836a2019-11-28 13:34:13 +02001337 aes_data_real.rk_ptr = ctx->rk;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001338 aes_data_fake.rk_ptr = ctx->rk;
Arto Kinnunen311ab592020-01-16 17:20:51 +02001339 aes_data_table[0] = &aes_data_real;
1340 aes_data_table[1] = &aes_data_fake;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001341
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001342 // Get AES calculation control bytes
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001343 dummy_rounds = aes_sca_cm_data_randomize( round_ctrl_table,
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001344 round_ctrl_table_len );
Arto Kinnunen98c93af2020-01-14 13:31:03 +02001345 flow_control = dummy_rounds;
1346
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001347 // SCA countermeasure, safely clear the aes_data_real.xy_values
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001348 mbedtls_platform_memset( aes_data_real.xy_values, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001349
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001350 // SCA countermeasure, randomize secret data location by initializing it in
1351 // a random order and writing randomized fake data between the real data
1352 // writes.
1353 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001354 i = offset;
1355 do
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001356 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001357 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen311ab592020-01-16 17:20:51 +02001358 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001359 flow_control++;
1360 } while( ( i = ( i + 1 ) % 4 ) != offset );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001361
1362 tindex = 0;
1363 do
1364 {
1365 // Get pointer to the real or fake data
1366 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1367 stop_mark = round_ctrl_table[tindex] & 0x03;
1368
1369 // initial round key addition
1370 for( i = 0; i < 4; i++ )
1371 {
1372 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1373 }
1374 tindex++;
1375 flow_control++;
1376 } while( stop_mark == 0 );
1377
1378 // Calculate AES rounds (9, 11 or 13 rounds) + dummy rounds
1379 do
1380 {
1381 // Get pointer to the real or fake data
1382 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1383 offset = round_ctrl_table[tindex] & 0x04;
1384 stop_mark = round_ctrl_table[tindex] & 0x03;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001385
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001386 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1387 &aes_data_ptr->xy_values[0 + offset],
1388 &aes_data_ptr->xy_values[1 + offset],
1389 &aes_data_ptr->xy_values[2 + offset],
1390 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001391 aes_data_ptr->xy_values[4 - offset],
1392 aes_data_ptr->xy_values[5 - offset],
1393 aes_data_ptr->xy_values[6 - offset],
1394 aes_data_ptr->xy_values[7 - offset] );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001395 tindex++;
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001396 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001397 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001398
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001399 // Calculate final AES round + dummy rounds
1400 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001401 {
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001402 aes_data_ptr = aes_data_table[round_ctrl_table[tindex] >> 4];
1403 stop_mark = round_ctrl_table[tindex] & 0x03;
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001404 aes_rround_final( aes_data_ptr->rk_ptr,
1405 &aes_data_ptr->xy_values[0],
1406 &aes_data_ptr->xy_values[1],
1407 &aes_data_ptr->xy_values[2],
1408 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001409 aes_data_ptr->xy_values[4],
1410 aes_data_ptr->xy_values[5],
1411 aes_data_ptr->xy_values[6],
1412 aes_data_ptr->xy_values[7] );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001413 flow_control++;
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001414 tindex++;
1415 } while( stop_mark == 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001416
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001417 // SCA countermeasure, safely clear the output
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001418 mbedtls_platform_memset( output, 0, 16 );
Arto Kinnunen2eb678f2020-01-13 16:44:13 +02001419
Arto Kinnunen17540ab2020-01-20 11:46:34 +02001420 // SCA countermeasure, randomize secret data location by writing to it in
1421 // a random order.
1422 offset = mbedtls_platform_random_in_range( 4 );
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001423 i = offset;
1424 do
Arto Kinnunen172836a2019-11-28 13:34:13 +02001425 {
1426 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001427 flow_control++;
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001428 } while( ( i = ( i + 1 ) % 4 ) != offset );
Andres AGf5bf7182017-03-03 14:09:56 +00001429
Arto Kinnunen2b24f422020-01-16 15:04:11 +02001430 if( flow_control == tindex + dummy_rounds + 8 )
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001431 {
1432 /* Validate control path due possible fault injection */
1433 return 0;
1434 }
1435
1436 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001437}
Arto Kinnunen311ab592020-01-16 17:20:51 +02001438
1439#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1440
1441#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
1442 do \
1443 { \
1444 (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \
1445 AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \
1446 AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \
1447 AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \
1448 \
1449 (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \
1450 AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \
1451 AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \
1452 AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \
1453 \
1454 (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \
1455 AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \
1456 AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \
1457 AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \
1458 \
1459 (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \
1460 AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \
1461 AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \
1462 AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \
1463 } while( 0 )
1464
1465int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1466 const unsigned char input[16],
1467 unsigned char output[16] )
1468{
1469 int i;
1470 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
1471
1472 RK = ctx->rk;
1473
1474 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
1475 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
1476 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
1477 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
1478
1479 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
1480 {
1481 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1482 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
1483 }
1484
1485 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
1486
1487 X0 = *RK++ ^ \
1488 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
1489 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
1490 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
1491 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
1492
1493 X1 = *RK++ ^ \
1494 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
1495 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
1496 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
1497 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
1498
1499 X2 = *RK++ ^ \
1500 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
1501 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
1502 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
1503 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
1504
1505 X3 = *RK++ ^ \
1506 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
1507 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
1508 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
1509 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
1510
1511 PUT_UINT32_LE( X0, output, 0 );
1512 PUT_UINT32_LE( X1, output, 4 );
1513 PUT_UINT32_LE( X2, output, 8 );
1514 PUT_UINT32_LE( X3, output, 12 );
1515
1516 return( 0 );
1517}
1518#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
1519
Arto Kinnunen14804442019-10-16 13:43:59 +03001520#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001521#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1522
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001523#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001524void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1525 const unsigned char input[16],
1526 unsigned char output[16] )
1527{
Arto Kinnunen14804442019-10-16 13:43:59 +03001528#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1529 (void) ctx;
1530 (void) input;
1531 (void) output;
1532#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001533 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001534#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001535}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001536#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001537
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001538/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 * AES-ECB block encryption/decryption
1540 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001541int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001542 int mode,
1543 const unsigned char input[16],
1544 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001545{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001546 AES_VALIDATE_RET( ctx != NULL );
1547 AES_VALIDATE_RET( input != NULL );
1548 AES_VALIDATE_RET( output != NULL );
1549 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1550 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001551 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001553#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001554 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001555 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001556#endif
1557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001558#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001559 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001560 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001561 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001562 return( 0 );
1563
1564 // If padlock data misaligned, we just fall back to
1565 // unaccelerated mode
1566 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001567 }
1568#endif
Arto Kinnunen6ce49882019-12-03 13:56:06 +02001569
Arto Kinnunen14804442019-10-16 13:43:59 +03001570#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1571 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1572#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001573
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001574 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001575 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001576 else
Andres AGf5bf7182017-03-03 14:09:56 +00001577 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001578#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001579}
1580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001581#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001582/*
1583 * AES-CBC buffer encryption/decryption
1584 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001586 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001587 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001588 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001589 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001590 unsigned char *output )
1591{
1592 int i;
1593 unsigned char temp[16];
1594
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001595 AES_VALIDATE_RET( ctx != NULL );
1596 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1597 mode == MBEDTLS_AES_DECRYPT );
1598 AES_VALIDATE_RET( iv != NULL );
1599 AES_VALIDATE_RET( input != NULL );
1600 AES_VALIDATE_RET( output != NULL );
1601
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001602 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001603 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001605#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001606 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001607 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001608 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001609 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001610
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001611 // If padlock data misaligned, we just fall back to
1612 // unaccelerated mode
1613 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001614 }
1615#endif
1616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001617 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001618 {
1619 while( length > 0 )
1620 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001621 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001622 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001623
1624 for( i = 0; i < 16; i++ )
1625 output[i] = (unsigned char)( output[i] ^ iv[i] );
1626
Teppo Järvelin91d79382019-10-02 09:09:31 +03001627 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001628
1629 input += 16;
1630 output += 16;
1631 length -= 16;
1632 }
1633 }
1634 else
1635 {
1636 while( length > 0 )
1637 {
1638 for( i = 0; i < 16; i++ )
1639 output[i] = (unsigned char)( input[i] ^ iv[i] );
1640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001641 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001642 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001643
1644 input += 16;
1645 output += 16;
1646 length -= 16;
1647 }
1648 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001649
1650 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001651}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001652#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001653
Aorimn5f778012016-06-09 23:22:58 +02001654#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001655
1656/* Endianess with 64 bits values */
1657#ifndef GET_UINT64_LE
1658#define GET_UINT64_LE(n,b,i) \
1659{ \
1660 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1661 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1662 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1663 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1664 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1665 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1666 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1667 | ( (uint64_t) (b)[(i) ] ); \
1668}
1669#endif
1670
1671#ifndef PUT_UINT64_LE
1672#define PUT_UINT64_LE(n,b,i) \
1673{ \
1674 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1675 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1676 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1677 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1678 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1679 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1680 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1681 (b)[(i) ] = (unsigned char) ( (n) ); \
1682}
1683#endif
1684
1685typedef unsigned char mbedtls_be128[16];
1686
1687/*
1688 * GF(2^128) multiplication function
1689 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001690 * This function multiplies a field element by x in the polynomial field
1691 * representation. It uses 64-bit word operations to gain speed but compensates
1692 * for machine endianess and hence works correctly on both big and little
1693 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001694 */
1695static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001696 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001697{
1698 uint64_t a, b, ra, rb;
1699
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001700 GET_UINT64_LE( a, x, 0 );
1701 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001702
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001703 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1704 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001705
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001706 PUT_UINT64_LE( ra, r, 0 );
1707 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001708}
1709
Aorimn5f778012016-06-09 23:22:58 +02001710/*
1711 * AES-XTS buffer encryption/decryption
1712 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001713int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1714 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001715 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001716 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001717 const unsigned char *input,
1718 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001719{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001720 int ret;
1721 size_t blocks = length / 16;
1722 size_t leftover = length % 16;
1723 unsigned char tweak[16];
1724 unsigned char prev_tweak[16];
1725 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001726
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001727 AES_VALIDATE_RET( ctx != NULL );
1728 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1729 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001730 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001731 AES_VALIDATE_RET( input != NULL );
1732 AES_VALIDATE_RET( output != NULL );
1733
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001734 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001735 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001736 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001737
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001738 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001739 if( length > ( 1 << 20 ) * 16 )
1740 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001741
Jaeden Amerod82cd862018-04-28 15:02:45 +01001742 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001743 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1744 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001745 if( ret != 0 )
1746 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001747
Jaeden Amerod82cd862018-04-28 15:02:45 +01001748 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001749 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001750 size_t i;
1751
1752 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1753 {
1754 /* We are on the last block in a decrypt operation that has
1755 * leftover bytes, so we need to use the next tweak for this block,
1756 * and this tweak for the lefover bytes. Save the current tweak for
1757 * the leftovers and then update the current tweak for use on this,
1758 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001759 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001760 mbedtls_gf128mul_x_ble( tweak, tweak );
1761 }
1762
1763 for( i = 0; i < 16; i++ )
1764 tmp[i] = input[i] ^ tweak[i];
1765
1766 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1767 if( ret != 0 )
1768 return( ret );
1769
1770 for( i = 0; i < 16; i++ )
1771 output[i] = tmp[i] ^ tweak[i];
1772
1773 /* Update the tweak for the next block. */
1774 mbedtls_gf128mul_x_ble( tweak, tweak );
1775
1776 output += 16;
1777 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001778 }
1779
Jaeden Amerod82cd862018-04-28 15:02:45 +01001780 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001781 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001782 /* If we are on the leftover bytes in a decrypt operation, we need to
1783 * use the previous tweak for these bytes (as saved in prev_tweak). */
1784 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001785
Jaeden Amerod82cd862018-04-28 15:02:45 +01001786 /* We are now on the final part of the data unit, which doesn't divide
1787 * evenly by 16. It's time for ciphertext stealing. */
1788 size_t i;
1789 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001790
Jaeden Amerod82cd862018-04-28 15:02:45 +01001791 /* Copy ciphertext bytes from the previous block to our output for each
1792 * byte of cyphertext we won't steal. At the same time, copy the
1793 * remainder of the input for this final round (since the loop bounds
1794 * are the same). */
1795 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001796 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001797 output[i] = prev_output[i];
1798 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001799 }
Aorimn5f778012016-06-09 23:22:58 +02001800
Jaeden Amerod82cd862018-04-28 15:02:45 +01001801 /* Copy ciphertext bytes from the previous block for input in this
1802 * round. */
1803 for( ; i < 16; i++ )
1804 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001805
Jaeden Amerod82cd862018-04-28 15:02:45 +01001806 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1807 if( ret != 0 )
1808 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001809
Jaeden Amerod82cd862018-04-28 15:02:45 +01001810 /* Write the result back to the previous block, overriding the previous
1811 * output we copied. */
1812 for( i = 0; i < 16; i++ )
1813 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001814 }
1815
1816 return( 0 );
1817}
1818#endif /* MBEDTLS_CIPHER_MODE_XTS */
1819
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001820#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001821/*
1822 * AES-CFB128 buffer encryption/decryption
1823 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001824int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001825 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001826 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001827 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001828 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001829 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001830 unsigned char *output )
1831{
Paul Bakker27fdf462011-06-09 13:55:13 +00001832 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001833 size_t n;
1834
1835 AES_VALIDATE_RET( ctx != NULL );
1836 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1837 mode == MBEDTLS_AES_DECRYPT );
1838 AES_VALIDATE_RET( iv_off != NULL );
1839 AES_VALIDATE_RET( iv != NULL );
1840 AES_VALIDATE_RET( input != NULL );
1841 AES_VALIDATE_RET( output != NULL );
1842
1843 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001844
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001845 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001846 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1847
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001848 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001849 {
1850 while( length-- )
1851 {
1852 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001853 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001854
1855 c = *input++;
1856 *output++ = (unsigned char)( c ^ iv[n] );
1857 iv[n] = (unsigned char) c;
1858
Paul Bakker66d5d072014-06-17 16:39:18 +02001859 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001860 }
1861 }
1862 else
1863 {
1864 while( length-- )
1865 {
1866 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001867 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001868
1869 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1870
Paul Bakker66d5d072014-06-17 16:39:18 +02001871 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001872 }
1873 }
1874
1875 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001876
1877 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001878}
Paul Bakker556efba2014-01-24 15:38:12 +01001879
1880/*
1881 * AES-CFB8 buffer encryption/decryption
1882 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001883int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001884 int mode,
1885 size_t length,
1886 unsigned char iv[16],
1887 const unsigned char *input,
1888 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001889{
1890 unsigned char c;
1891 unsigned char ov[17];
1892
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001893 AES_VALIDATE_RET( ctx != NULL );
1894 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1895 mode == MBEDTLS_AES_DECRYPT );
1896 AES_VALIDATE_RET( iv != NULL );
1897 AES_VALIDATE_RET( input != NULL );
1898 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001899 while( length-- )
1900 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001901 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001902 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001903
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001904 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001905 ov[16] = *input;
1906
1907 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001909 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001910 ov[16] = c;
1911
Teppo Järvelin91d79382019-10-02 09:09:31 +03001912 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001913 }
1914
1915 return( 0 );
1916}
Simon Butcher76a5b222018-04-22 22:57:27 +01001917#endif /* MBEDTLS_CIPHER_MODE_CFB */
1918
1919#if defined(MBEDTLS_CIPHER_MODE_OFB)
1920/*
1921 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1922 */
1923int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001924 size_t length,
1925 size_t *iv_off,
1926 unsigned char iv[16],
1927 const unsigned char *input,
1928 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001929{
Simon Butcherad4e4932018-04-29 00:43:47 +01001930 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001931 size_t n;
1932
1933 AES_VALIDATE_RET( ctx != NULL );
1934 AES_VALIDATE_RET( iv_off != NULL );
1935 AES_VALIDATE_RET( iv != NULL );
1936 AES_VALIDATE_RET( input != NULL );
1937 AES_VALIDATE_RET( output != NULL );
1938
1939 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001940
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001941 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001942 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1943
Simon Butcher76a5b222018-04-22 22:57:27 +01001944 while( length-- )
1945 {
1946 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001947 {
1948 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1949 if( ret != 0 )
1950 goto exit;
1951 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001952 *output++ = *input++ ^ iv[n];
1953
1954 n = ( n + 1 ) & 0x0F;
1955 }
1956
1957 *iv_off = n;
1958
Simon Butcherad4e4932018-04-29 00:43:47 +01001959exit:
1960 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001961}
1962#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001963
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001964#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001965/*
1966 * AES-CTR buffer encryption/decryption
1967 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001968int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001969 size_t length,
1970 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001971 unsigned char nonce_counter[16],
1972 unsigned char stream_block[16],
1973 const unsigned char *input,
1974 unsigned char *output )
1975{
Paul Bakker369e14b2012-04-18 14:16:09 +00001976 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001977 size_t n;
1978
1979 AES_VALIDATE_RET( ctx != NULL );
1980 AES_VALIDATE_RET( nc_off != NULL );
1981 AES_VALIDATE_RET( nonce_counter != NULL );
1982 AES_VALIDATE_RET( stream_block != NULL );
1983 AES_VALIDATE_RET( input != NULL );
1984 AES_VALIDATE_RET( output != NULL );
1985
1986 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001987
Arto Kinnunen75439012019-12-03 14:12:10 +02001988 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001989 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1990
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001991 while( length-- )
1992 {
1993 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001994 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001995
Paul Bakker369e14b2012-04-18 14:16:09 +00001996 for( i = 16; i > 0; i-- )
1997 if( ++nonce_counter[i - 1] != 0 )
1998 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001999 }
2000 c = *input++;
2001 *output++ = (unsigned char)( c ^ stream_block[n] );
2002
Paul Bakker66d5d072014-06-17 16:39:18 +02002003 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002004 }
2005
2006 *nc_off = n;
2007
2008 return( 0 );
2009}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002010#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01002011
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002012#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00002013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002014#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00002015/*
2016 * AES test vectors from:
2017 *
2018 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
2019 */
2020static const unsigned char aes_test_ecb_dec[3][16] =
2021{
2022 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
2023 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
2024 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
2025 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
2026 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
2027 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
2028};
2029
2030static const unsigned char aes_test_ecb_enc[3][16] =
2031{
2032 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
2033 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
2034 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
2035 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
2036 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
2037 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
2038};
2039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002040#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002041static const unsigned char aes_test_cbc_dec[3][16] =
2042{
2043 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
2044 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
2045 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
2046 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
2047 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
2048 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
2049};
2050
2051static const unsigned char aes_test_cbc_enc[3][16] =
2052{
2053 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
2054 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
2055 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
2056 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
2057 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
2058 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
2059};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002060#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002062#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002063/*
2064 * AES-CFB128 test vectors from:
2065 *
2066 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
2067 */
2068static const unsigned char aes_test_cfb128_key[3][32] =
2069{
2070 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2071 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2072 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2073 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2074 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2075 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2076 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2077 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2078 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2079};
2080
2081static const unsigned char aes_test_cfb128_iv[16] =
2082{
2083 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2084 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2085};
2086
2087static const unsigned char aes_test_cfb128_pt[64] =
2088{
2089 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2090 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2091 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2092 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2093 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2094 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2095 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2096 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2097};
2098
2099static const unsigned char aes_test_cfb128_ct[3][64] =
2100{
2101 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2102 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2103 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
2104 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
2105 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
2106 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
2107 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
2108 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
2109 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2110 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2111 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
2112 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
2113 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
2114 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
2115 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
2116 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
2117 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2118 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2119 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
2120 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
2121 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
2122 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
2123 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
2124 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
2125};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002126#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002127
Simon Butcherad4e4932018-04-29 00:43:47 +01002128#if defined(MBEDTLS_CIPHER_MODE_OFB)
2129/*
2130 * AES-OFB test vectors from:
2131 *
Simon Butcher5db13622018-06-04 22:11:25 +01002132 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01002133 */
2134static const unsigned char aes_test_ofb_key[3][32] =
2135{
2136 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
2137 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
2138 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
2139 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
2140 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
2141 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
2142 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
2143 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
2144 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
2145};
2146
2147static const unsigned char aes_test_ofb_iv[16] =
2148{
2149 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2150 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
2151};
2152
2153static const unsigned char aes_test_ofb_pt[64] =
2154{
2155 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
2156 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
2157 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
2158 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
2159 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
2160 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
2161 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
2162 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
2163};
2164
2165static const unsigned char aes_test_ofb_ct[3][64] =
2166{
2167 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
2168 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
2169 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
2170 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
2171 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
2172 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
2173 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
2174 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
2175 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
2176 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
2177 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
2178 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
2179 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
2180 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
2181 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
2182 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
2183 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
2184 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
2185 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
2186 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
2187 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
2188 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
2189 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
2190 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
2191};
2192#endif /* MBEDTLS_CIPHER_MODE_OFB */
2193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002194#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002195/*
2196 * AES-CTR test vectors from:
2197 *
2198 * http://www.faqs.org/rfcs/rfc3686.html
2199 */
2200
2201static const unsigned char aes_test_ctr_key[3][16] =
2202{
2203 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
2204 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
2205 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
2206 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
2207 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
2208 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
2209};
2210
2211static const unsigned char aes_test_ctr_nonce_counter[3][16] =
2212{
2213 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
2214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
2215 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
2216 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
2217 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
2218 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
2219};
2220
2221static const unsigned char aes_test_ctr_pt[3][48] =
2222{
2223 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
2224 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
2225
2226 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2227 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2228 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2229 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
2230
2231 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2232 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2233 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2234 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2235 0x20, 0x21, 0x22, 0x23 }
2236};
2237
2238static const unsigned char aes_test_ctr_ct[3][48] =
2239{
2240 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
2241 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
2242 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
2243 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
2244 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
2245 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
2246 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
2247 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
2248 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
2249 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
2250 0x25, 0xB2, 0x07, 0x2F }
2251};
2252
2253static const int aes_test_ctr_len[3] =
2254 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002255#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002256
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002257#if defined(MBEDTLS_CIPHER_MODE_XTS)
2258/*
2259 * AES-XTS test vectors from:
2260 *
2261 * IEEE P1619/D16 Annex B
2262 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
2263 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
2264 */
2265static const unsigned char aes_test_xts_key[][32] =
2266{
2267 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2271 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2272 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
2273 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2274 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2275 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
2276 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
2277 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
2278 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
2279};
2280
2281static const unsigned char aes_test_xts_pt32[][32] =
2282{
2283 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2287 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2288 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2289 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2290 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2291 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2292 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2293 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2294 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2295};
2296
2297static const unsigned char aes_test_xts_ct32[][32] =
2298{
2299 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2300 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2301 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2302 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2303 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2304 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2305 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2306 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2307 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2308 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2309 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2310 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2311};
2312
2313static const unsigned char aes_test_xts_data_unit[][16] =
2314{
2315 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2317 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2319 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2321};
2322
2323#endif /* MBEDTLS_CIPHER_MODE_XTS */
2324
Paul Bakker5121ce52009-01-03 21:22:43 +00002325/*
2326 * Checkup routine
2327 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002328int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002329{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002330 int ret = 0, i, j, u, mode;
2331 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002332 unsigned char key[32];
2333 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002334 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002335#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002336 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002337#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002338#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002339 unsigned char prv[16];
2340#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002341#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2342 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002343 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002344#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002345#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002346 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002347#endif
2348#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002349 unsigned char nonce_counter[16];
2350 unsigned char stream_block[16];
2351#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002352 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002353
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002354 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002355 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002356
2357 /*
2358 * ECB mode
2359 */
2360 for( i = 0; i < 6; i++ )
2361 {
2362 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002363 keybits = 128 + u * 64;
2364 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002365
2366 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002367 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2368 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002369
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002370#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2371 if( keybits > 128 )
2372 {
2373 mbedtls_printf( "skipped\n" );
2374 continue;
2375 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002376#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2377
2378#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2379 if( mode == MBEDTLS_AES_DECRYPT )
2380 {
2381 mbedtls_printf( "skipped\n" );
2382 continue;
2383 }
2384#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002385
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002386 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002388 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002389 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002390 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2391 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002392 }
2393 else
2394 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002395 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2396 aes_tests = aes_test_ecb_enc[u];
2397 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002398
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002399 /*
2400 * AES-192 is an optional feature that may be unavailable when
2401 * there is an alternative underlying implementation i.e. when
2402 * MBEDTLS_AES_ALT is defined.
2403 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002404 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002405 {
2406 mbedtls_printf( "skipped\n" );
2407 continue;
2408 }
2409 else if( ret != 0 )
2410 {
2411 goto exit;
2412 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002413
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002414 for( j = 0; j < 10000; j++ )
2415 {
2416 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2417 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002418 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002419 }
2420
2421 if( memcmp( buf, aes_tests, 16 ) != 0 )
2422 {
2423 ret = 1;
2424 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002425 }
2426
2427 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002428 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002429 }
2430
2431 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002434#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002435 /*
2436 * CBC mode
2437 */
2438 for( i = 0; i < 6; i++ )
2439 {
2440 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002441 keybits = 128 + u * 64;
2442 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002443
2444 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002445 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2446 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002447
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002448#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2449 if( keybits > 128 )
2450 {
2451 mbedtls_printf( "skipped\n" );
2452 continue;
2453 }
2454#endif
2455
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002456#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2457 if( mode == MBEDTLS_AES_DECRYPT )
2458 {
2459 mbedtls_printf( "skipped\n" );
2460 continue;
2461 }
2462#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2463
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002464 memset( iv , 0, 16 );
2465 memset( prv, 0, 16 );
2466 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002467
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002468 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002469 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002470 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2471 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002472 }
2473 else
2474 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002475 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2476 aes_tests = aes_test_cbc_enc[u];
2477 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002478
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002479 /*
2480 * AES-192 is an optional feature that may be unavailable when
2481 * there is an alternative underlying implementation i.e. when
2482 * MBEDTLS_AES_ALT is defined.
2483 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002484 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002485 {
2486 mbedtls_printf( "skipped\n" );
2487 continue;
2488 }
2489 else if( ret != 0 )
2490 {
2491 goto exit;
2492 }
2493
2494 for( j = 0; j < 10000; j++ )
2495 {
2496 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002497 {
2498 unsigned char tmp[16];
2499
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002500 memcpy( tmp, prv, 16 );
2501 memcpy( prv, buf, 16 );
2502 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002503 }
2504
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002505 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2506 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002507 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002508
2509 }
2510
2511 if( memcmp( buf, aes_tests, 16 ) != 0 )
2512 {
2513 ret = 1;
2514 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002515 }
2516
2517 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002518 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002519 }
2520
2521 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002522 mbedtls_printf( "\n" );
2523#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002525#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002526 /*
2527 * CFB128 mode
2528 */
2529 for( i = 0; i < 6; i++ )
2530 {
2531 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002532 keybits = 128 + u * 64;
2533 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002534
2535 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002536 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2537 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002538
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002539#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2540 if( keybits > 128 )
2541 {
2542 mbedtls_printf( "skipped\n" );
2543 continue;
2544 }
2545#endif
2546
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002547#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2548 if( mode == MBEDTLS_AES_DECRYPT )
2549 {
2550 mbedtls_printf( "skipped\n" );
2551 continue;
2552 }
2553#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2554
Paul Bakker5121ce52009-01-03 21:22:43 +00002555 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002556 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002557
2558 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002559 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002560 /*
2561 * AES-192 is an optional feature that may be unavailable when
2562 * there is an alternative underlying implementation i.e. when
2563 * MBEDTLS_AES_ALT is defined.
2564 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002565 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002566 {
2567 mbedtls_printf( "skipped\n" );
2568 continue;
2569 }
2570 else if( ret != 0 )
2571 {
2572 goto exit;
2573 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002574
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002575 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002576 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002577 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002578 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002579 }
2580 else
2581 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002582 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002583 aes_tests = aes_test_cfb128_ct[u];
2584 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002585
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002586 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2587 if( ret != 0 )
2588 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002589
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002590 if( memcmp( buf, aes_tests, 64 ) != 0 )
2591 {
2592 ret = 1;
2593 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002594 }
2595
2596 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002597 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002598 }
2599
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002600 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002601 mbedtls_printf( "\n" );
2602#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002603
Simon Butcherad4e4932018-04-29 00:43:47 +01002604#if defined(MBEDTLS_CIPHER_MODE_OFB)
2605 /*
2606 * OFB mode
2607 */
2608 for( i = 0; i < 6; i++ )
2609 {
2610 u = i >> 1;
2611 keybits = 128 + u * 64;
2612 mode = i & 1;
2613
2614 if( verbose != 0 )
2615 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2616 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2617
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002618#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2619 if( keybits > 128 )
2620 {
2621 mbedtls_printf( "skipped\n" );
2622 continue;
2623 }
2624#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002625
2626#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2627 if( mode == MBEDTLS_AES_DECRYPT )
2628 {
2629 mbedtls_printf( "skipped\n" );
2630 continue;
2631 }
2632#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2633
Simon Butcherad4e4932018-04-29 00:43:47 +01002634 memcpy( iv, aes_test_ofb_iv, 16 );
2635 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2636
2637 offset = 0;
2638 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2639 /*
2640 * AES-192 is an optional feature that may be unavailable when
2641 * there is an alternative underlying implementation i.e. when
2642 * MBEDTLS_AES_ALT is defined.
2643 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002644 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002645 {
2646 mbedtls_printf( "skipped\n" );
2647 continue;
2648 }
2649 else if( ret != 0 )
2650 {
2651 goto exit;
2652 }
2653
2654 if( mode == MBEDTLS_AES_DECRYPT )
2655 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002656 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002657 aes_tests = aes_test_ofb_pt;
2658 }
2659 else
2660 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002661 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002662 aes_tests = aes_test_ofb_ct[u];
2663 }
2664
2665 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2666 if( ret != 0 )
2667 goto exit;
2668
2669 if( memcmp( buf, aes_tests, 64 ) != 0 )
2670 {
2671 ret = 1;
2672 goto exit;
2673 }
2674
2675 if( verbose != 0 )
2676 mbedtls_printf( "passed\n" );
2677 }
2678
2679 if( verbose != 0 )
2680 mbedtls_printf( "\n" );
2681#endif /* MBEDTLS_CIPHER_MODE_OFB */
2682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002683#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002684 /*
2685 * CTR mode
2686 */
2687 for( i = 0; i < 6; i++ )
2688 {
2689 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002690 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002691
2692 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002693 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002694 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002695
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002696#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2697 if( keybits > 128 )
2698 {
2699 mbedtls_printf( "skipped\n" );
2700 continue;
2701 }
2702#endif
2703
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002704#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2705 if( mode == MBEDTLS_AES_DECRYPT )
2706 {
2707 mbedtls_printf( "skipped\n" );
2708 continue;
2709 }
2710#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2711
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002712 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2713 memcpy( key, aes_test_ctr_key[u], 16 );
2714
2715 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002716 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2717 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002718
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002719 len = aes_test_ctr_len[u];
2720
2721 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002722 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002723 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002724 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002725 }
2726 else
2727 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002728 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002729 aes_tests = aes_test_ctr_ct[u];
2730 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002731
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002732 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2733 stream_block, buf, buf );
2734 if( ret != 0 )
2735 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002736
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002737 if( memcmp( buf, aes_tests, len ) != 0 )
2738 {
2739 ret = 1;
2740 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002741 }
2742
2743 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002744 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002745 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002746
2747 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002748 mbedtls_printf( "\n" );
2749#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002750
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002751#if defined(MBEDTLS_CIPHER_MODE_XTS)
2752 {
2753 static const int num_tests =
2754 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2755 mbedtls_aes_xts_context ctx_xts;
2756
2757 /*
2758 * XTS mode
2759 */
2760 mbedtls_aes_xts_init( &ctx_xts );
2761
2762 for( i = 0; i < num_tests << 1; i++ )
2763 {
2764 const unsigned char *data_unit;
2765 u = i >> 1;
2766 mode = i & 1;
2767
2768 if( verbose != 0 )
2769 mbedtls_printf( " AES-XTS-128 (%s): ",
2770 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2771
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002772#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2773 if( mode == MBEDTLS_AES_DECRYPT )
2774 {
2775 mbedtls_printf( "skipped\n" );
2776 continue;
2777 }
2778#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2779
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002780 memset( key, 0, sizeof( key ) );
2781 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002782 data_unit = aes_test_xts_data_unit[u];
2783
2784 len = sizeof( *aes_test_xts_ct32 );
2785
2786 if( mode == MBEDTLS_AES_DECRYPT )
2787 {
2788 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2789 if( ret != 0)
2790 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002791 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002792 aes_tests = aes_test_xts_pt32[u];
2793 }
2794 else
2795 {
2796 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2797 if( ret != 0)
2798 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002799 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002800 aes_tests = aes_test_xts_ct32[u];
2801 }
2802
2803
2804 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2805 buf, buf );
2806 if( ret != 0 )
2807 goto exit;
2808
2809 if( memcmp( buf, aes_tests, len ) != 0 )
2810 {
2811 ret = 1;
2812 goto exit;
2813 }
2814
2815 if( verbose != 0 )
2816 mbedtls_printf( "passed\n" );
2817 }
2818
2819 if( verbose != 0 )
2820 mbedtls_printf( "\n" );
2821
2822 mbedtls_aes_xts_free( &ctx_xts );
2823 }
2824#endif /* MBEDTLS_CIPHER_MODE_XTS */
2825
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002826 ret = 0;
2827
2828exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002829 if( ret != 0 && verbose != 0 )
2830 mbedtls_printf( "failed\n" );
2831
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002832 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002833
2834 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002835}
2836
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002837#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002839#endif /* MBEDTLS_AES_C */