blob: a3199a7b53b5ae42e7f005290efc533801169add [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-197 compliant AES implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
23 *
24 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
25 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Rich Evans00ab4702015-02-06 13:43:58 +000036#include <string.h>
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Ron Eldor9924bdc2018-10-04 10:59:13 +030039#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050040#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_SELF_TEST)
49#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#else
Rich Evans00ab4702015-02-06 13:43:58 +000052#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#define mbedtls_printf printf
54#endif /* MBEDTLS_PLATFORM_C */
55#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020058
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010059/* Parameter validation macros based on platform_util.h */
60#define AES_VALIDATE_RET( cond ) \
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +010061 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +010062#define AES_VALIDATE( cond ) \
63 MBEDTLS_INTERNAL_VALIDATE( cond )
64
Paul Bakker5121ce52009-01-03 21:22:43 +000065/*
66 * 32-bit integer manipulation macros (little endian)
67 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef GET_UINT32_LE
69#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000071 (n) = ( (uint32_t) (b)[(i) ] ) \
72 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
73 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
74 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000075}
76#endif
77
Paul Bakker5c2364c2012-10-01 14:41:15 +000078#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000079#define PUT_UINT32_LE(n,b,i) \
80{ \
81 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
82 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
83 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
84 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000085}
86#endif
87
Arto Kinnunen172836a2019-11-28 13:34:13 +020088/*
89 * Data structure for AES round data
90 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +020091typedef struct {
Arto Kinnunen172836a2019-11-28 13:34:13 +020092 uint32_t *rk_ptr; /* Round Key */
Arto Kinnunen34139ba2019-12-03 15:43:27 +020093 uint32_t xy_values[8]; /* X0, X1, X2, X3, Y0, Y1, Y2, Y3 */
Arto Kinnunen172836a2019-11-28 13:34:13 +020094} aes_r_data_t;
95
96#if defined(MBEDTLS_AES_SCA_COUNTERMEASURES)
97/* Number of additional AES calculation rounds added for SCA CM */
98#define AES_SCA_CM_ROUNDS 3
99#else /* MBEDTLS_AES_SCA_COUNTERMEASURES */
100#define AES_SCA_CM_ROUNDS 0
101#endif /* MBEDTLS_AES_SCA_COUNTERMEASURES */
102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200103#if defined(MBEDTLS_PADLOCK_C) && \
104 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +0000105static int aes_padlock_ace = -1;
106#endif
107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000109/*
110 * Forward S-box
111 */
112static const unsigned char FSb[256] =
113{
114 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
115 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
116 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
117 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
118 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
119 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
120 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
121 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
122 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
123 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
124 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
125 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
126 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
127 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
128 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
129 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
130 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
131 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
132 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
133 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
134 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
135 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
136 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
137 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
138 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
139 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
140 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
141 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
142 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
143 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
144 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
145 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
146};
147
148/*
149 * Forward tables
150 */
151#define FT \
152\
153 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
154 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
155 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
156 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
157 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
158 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
159 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
160 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
161 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
162 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
163 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
164 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
165 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
166 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
167 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
168 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
169 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
170 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
171 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
172 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
173 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
174 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
175 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
176 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
177 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
178 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
179 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
180 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
181 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
182 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
183 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
184 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
185 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
186 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
187 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
188 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
189 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
190 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
191 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
192 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
193 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
194 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
195 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
196 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
197 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
198 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
199 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
200 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
201 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
202 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
203 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
204 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
205 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
206 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
207 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
208 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
209 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
210 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
211 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
212 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
213 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
214 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
215 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
216 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
217
218#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000219static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000220#undef V
221
Hanno Beckerad049a92017-06-19 16:31:54 +0100222#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200223
Paul Bakker5121ce52009-01-03 21:22:43 +0000224#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000225static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000226#undef V
227
228#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000229static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000230#undef V
231
232#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000233static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000234#undef V
235
Hanno Becker177d3cf2017-06-07 15:52:48 +0100236#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200237
Paul Bakker5121ce52009-01-03 21:22:43 +0000238#undef FT
239
Arto Kinnunen14804442019-10-16 13:43:59 +0300240#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000241/*
242 * Reverse S-box
243 */
244static const unsigned char RSb[256] =
245{
246 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
247 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
248 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
249 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
250 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
251 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
252 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
253 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
254 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
255 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
256 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
257 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
258 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
259 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
260 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
261 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
262 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
263 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
264 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
265 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
266 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
267 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
268 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
269 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
270 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
271 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
272 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
273 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
274 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
275 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
276 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
277 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
278};
Arto Kinnunen14804442019-10-16 13:43:59 +0300279#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000280
281/*
282 * Reverse tables
283 */
284#define RT \
285\
286 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
287 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
288 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
289 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
290 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
291 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
292 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
293 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
294 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
295 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
296 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
297 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
298 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
299 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
300 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
301 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
302 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
303 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
304 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
305 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
306 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
307 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
308 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
309 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
310 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
311 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
312 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
313 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
314 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
315 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
316 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
317 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
318 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
319 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
320 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
321 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
322 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
323 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
324 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
325 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
326 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
327 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
328 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
329 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
330 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
331 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
332 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
333 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
334 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
335 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
336 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
337 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
338 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
339 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
340 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
341 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
342 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
343 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
344 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
345 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
346 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
347 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
348 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
349 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
350
Arto Kinnunen14804442019-10-16 13:43:59 +0300351#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000352#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000354#undef V
355
Hanno Beckerad049a92017-06-19 16:31:54 +0100356#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000359static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000360#undef V
361
362#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000363static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000364#undef V
365
366#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000367static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000368#undef V
369
Hanno Becker177d3cf2017-06-07 15:52:48 +0100370#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300371#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200372
Paul Bakker5121ce52009-01-03 21:22:43 +0000373#undef RT
374
375/*
376 * Round constants
377 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000378static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000379{
380 0x00000001, 0x00000002, 0x00000004, 0x00000008,
381 0x00000010, 0x00000020, 0x00000040, 0x00000080,
382 0x0000001B, 0x00000036
383};
384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000386
387/*
388 * Forward S-box & tables
389 */
390static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200391static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100392#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200393static uint32_t FT1[256];
394static uint32_t FT2[256];
395static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100396#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000397
398/*
399 * Reverse S-box & tables
400 */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300401#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000402static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100404#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000405static uint32_t RT1[256];
406static uint32_t RT2[256];
407static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100408#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300409#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
411/*
412 * Round constants
413 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000414static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
416/*
417 * Tables generation code
418 */
Hanno Beckerd6028a12018-10-15 12:01:35 +0100419#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 )
420#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) )
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100421#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423static int aes_init_done = 0;
424
425static void aes_gen_tables( void )
426{
427 int i, x, y, z;
428 int pow[256];
429 int log[256];
430
431 /*
432 * compute pow and log tables over GF(2^8)
433 */
434 for( i = 0, x = 1; i < 256; i++ )
435 {
436 pow[i] = x;
437 log[x] = i;
438 x = ( x ^ XTIME( x ) ) & 0xFF;
439 }
440
441 /*
442 * calculate the round constants
443 */
444 for( i = 0, x = 1; i < 10; i++ )
445 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000446 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000447 x = XTIME( x ) & 0xFF;
448 }
449
450 /*
451 * generate the forward and reverse S-boxes
452 */
453 FSb[0x00] = 0x63;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300454#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000455 RSb[0x63] = 0x00;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300456#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000457
458 for( i = 1; i < 256; i++ )
459 {
460 x = pow[255 - log[i]];
461
Paul Bakker66d5d072014-06-17 16:39:18 +0200462 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
463 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
464 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
465 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 x ^= y ^ 0x63;
467
468 FSb[i] = (unsigned char) x;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300469#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 RSb[x] = (unsigned char) i;
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300471#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000472 }
473
474 /*
475 * generate the forward and reverse tables
476 */
477 for( i = 0; i < 256; i++ )
478 {
479 x = FSb[i];
480 y = XTIME( x ) & 0xFF;
481 z = ( y ^ x ) & 0xFF;
482
Paul Bakker5c2364c2012-10-01 14:41:15 +0000483 FT0[i] = ( (uint32_t) y ) ^
484 ( (uint32_t) x << 8 ) ^
485 ( (uint32_t) x << 16 ) ^
486 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000487
Hanno Beckerad049a92017-06-19 16:31:54 +0100488#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000489 FT1[i] = ROTL8( FT0[i] );
490 FT2[i] = ROTL8( FT1[i] );
491 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100492#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000493
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300494#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000495 x = RSb[i];
496
Paul Bakker5c2364c2012-10-01 14:41:15 +0000497 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
498 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
499 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
500 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000501
Hanno Beckerad049a92017-06-19 16:31:54 +0100502#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000503 RT1[i] = ROTL8( RT0[i] );
504 RT2[i] = ROTL8( RT1[i] );
505 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100506#endif /* !MBEDTLS_AES_FEWER_TABLES */
Arto Kinnunen0fa65aa2019-10-21 14:43:37 +0300507#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000508 }
509}
510
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200511#undef ROTL8
512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000514
Arto Kinnunen172836a2019-11-28 13:34:13 +0200515/**
516 * Randomize positions when to use AES SCA countermeasures.
517 * Each byte indicates one AES round as follows:
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200518 * first ( tbl_len - 4 ) bytes are reserved for middle AES rounds:
Arto Kinnunen172836a2019-11-28 13:34:13 +0200519 * -4 high bit = table to use 0x10 for SCA CM data, 0 otherwise
520 * -4 low bits = offset based on order, 4 for even position, 0 otherwise
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200521 * Last 4 bytes for first(2) and final(2) round calculation
Arto Kinnunen172836a2019-11-28 13:34:13 +0200522 * -4 high bit = table to use, 0x10 for SCA CM data, otherwise real data
523 * -4 low bits = not used
524 *
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200525 * Control data when only real data (R) is used:
526 * | R | R | R | R | R | R | R | R | Start | Final |
527 * |0x04|0x00|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x00|0x00|0x00|
528 *
529 * Control data with 5 (F) dummy rounds and randomized start and final round:
530 * | R | F | R | F | F | R | R | R | R | R | R | START RF| FINAL FR|
531 * |0x04|0x10|0x04|0x10|0x10|0x00|0x04|0x00|0x04|0x00|0x04|0x00|0x10|0x10|0x00|
Arto Kinnunen172836a2019-11-28 13:34:13 +0200532 */
533static void aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len )
534{
535 int i, is_even_pos;
536#if AES_SCA_CM_ROUNDS != 0
537 int is_unique_number;
538 int num;
539#endif
540
541 memset( tbl, 0, tbl_len );
542
543#if AES_SCA_CM_ROUNDS != 0
544 // Randomize SCA CM positions to tbl
Arto Kinnunen425137a2019-11-29 15:53:09 +0200545 for( i = 0; i < AES_SCA_CM_ROUNDS; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200546 {
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200547 do
548 {
Arto Kinnunen172836a2019-11-28 13:34:13 +0200549 is_unique_number = 1;
550/* TODO - Use proper random. This is now ONLY FOR TESTING as mbedtls_platform_random_in_range is alwyays returning 0 */
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200551 num = /* mbedtls_platform_random_in_range( tbl_len - 4 ) */rand() % (tbl_len - 4);
Arto Kinnunen172836a2019-11-28 13:34:13 +0200552
Arto Kinnunen75439012019-12-03 14:12:10 +0200553 if( tbl[num] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200554 {
555 is_unique_number = 0;
556 tbl[num] = 0x10;
557 }
Arto Kinnunen34139ba2019-12-03 15:43:27 +0200558 } while( is_unique_number == 1 );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200559 }
560
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200561 // randomize control data for start and final round
562 for( i = 1; i <= 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200563 {
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200564 num = /* mbedtls_platform_random_in_range( 0xff ) */rand() % 0xff;
565 if( ( num % 2 ) == 0 )
566 {
567 tbl[tbl_len - ( i * 2 - 0 )] = 0x10; // fake data
568 tbl[tbl_len - ( i * 2 - 1 )] = 0x00; // real data
569 }
570 else
571 {
572 tbl[tbl_len - ( i * 2 - 0 )] = 0x00; // real data
573 tbl[tbl_len - ( i * 2 - 1 )] = 0x10; // fake data
574 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200575 }
576#endif /* AES_SCA_CM_ROUNDS != 0 */
577
578 // Fill real AES round data to the remaining places
579 is_even_pos = 1;
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200580 for( i = 0; i < tbl_len - 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200581 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200582 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200583 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200584 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200585 {
Arto Kinnunen34139ba2019-12-03 15:43:27 +0200586 tbl[i] = 0x04; // real data, offset 4
Arto Kinnunen172836a2019-11-28 13:34:13 +0200587 is_even_pos = 0;
588 }
589 else
590 {
591 tbl[i] = 0x00; // real data, offset 0
592 is_even_pos = 1;
593 }
594 }
595 }
596}
597
Hanno Beckerad049a92017-06-19 16:31:54 +0100598#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200599
600#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
601#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
602#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
603
604#define AES_RT0(idx) RT0[idx]
605#define AES_RT1(idx) ROTL8( RT0[idx] )
606#define AES_RT2(idx) ROTL16( RT0[idx] )
607#define AES_RT3(idx) ROTL24( RT0[idx] )
608
609#define AES_FT0(idx) FT0[idx]
610#define AES_FT1(idx) ROTL8( FT0[idx] )
611#define AES_FT2(idx) ROTL16( FT0[idx] )
612#define AES_FT3(idx) ROTL24( FT0[idx] )
613
Hanno Becker177d3cf2017-06-07 15:52:48 +0100614#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200615
616#define AES_RT0(idx) RT0[idx]
617#define AES_RT1(idx) RT1[idx]
618#define AES_RT2(idx) RT2[idx]
619#define AES_RT3(idx) RT3[idx]
620
621#define AES_FT0(idx) FT0[idx]
622#define AES_FT1(idx) FT1[idx]
623#define AES_FT2(idx) FT2[idx]
624#define AES_FT3(idx) FT3[idx]
625
Hanno Becker177d3cf2017-06-07 15:52:48 +0100626#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200629{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100630 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000631
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200632 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200633}
634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200636{
637 if( ctx == NULL )
638 return;
639
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500640 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200641}
642
Jaeden Amero9366feb2018-05-29 18:55:17 +0100643#if defined(MBEDTLS_CIPHER_MODE_XTS)
644void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
645{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100646 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000647
Jaeden Amero9366feb2018-05-29 18:55:17 +0100648 mbedtls_aes_init( &ctx->crypt );
649 mbedtls_aes_init( &ctx->tweak );
650}
651
652void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
653{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100654 if( ctx == NULL )
655 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000656
Jaeden Amero9366feb2018-05-29 18:55:17 +0100657 mbedtls_aes_free( &ctx->crypt );
658 mbedtls_aes_free( &ctx->tweak );
659}
660#endif /* MBEDTLS_CIPHER_MODE_XTS */
661
Paul Bakker5121ce52009-01-03 21:22:43 +0000662/*
663 * AES key schedule (encryption)
664 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200665#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200667 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000668{
Paul Bakker23986e52011-04-24 08:57:21 +0000669 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000670 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000671
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100672 AES_VALIDATE_RET( ctx != NULL );
673 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000674
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200675 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000676 {
677 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300678#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000679 case 192: ctx->nr = 12; break;
680 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300681#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000683 }
684
Simon Butcher5201e412018-12-06 17:40:14 +0000685#if !defined(MBEDTLS_AES_ROM_TABLES)
686 if( aes_init_done == 0 )
687 {
688 aes_gen_tables();
689 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000690 }
691#endif
692
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200693#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000694 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100695 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000696
697 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000699 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000700#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000701 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000702
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200703#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100704 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200705 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100706#endif
707
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200708 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000709 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000710 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000711 }
712
713 switch( ctx->nr )
714 {
715 case 10:
716
717 for( i = 0; i < 10; i++, RK += 4 )
718 {
719 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000720 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
721 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
722 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
723 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
725 RK[5] = RK[1] ^ RK[4];
726 RK[6] = RK[2] ^ RK[5];
727 RK[7] = RK[3] ^ RK[6];
728 }
729 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300730#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000731 case 12:
732
733 for( i = 0; i < 8; i++, RK += 6 )
734 {
735 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000736 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
737 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
738 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
739 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000740
741 RK[7] = RK[1] ^ RK[6];
742 RK[8] = RK[2] ^ RK[7];
743 RK[9] = RK[3] ^ RK[8];
744 RK[10] = RK[4] ^ RK[9];
745 RK[11] = RK[5] ^ RK[10];
746 }
747 break;
748
749 case 14:
750
751 for( i = 0; i < 7; i++, RK += 8 )
752 {
753 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000754 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
755 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
756 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
757 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000758
759 RK[9] = RK[1] ^ RK[8];
760 RK[10] = RK[2] ^ RK[9];
761 RK[11] = RK[3] ^ RK[10];
762
763 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000764 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
765 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
766 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
767 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000768
769 RK[13] = RK[5] ^ RK[12];
770 RK[14] = RK[6] ^ RK[13];
771 RK[15] = RK[7] ^ RK[14];
772 }
773 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300774#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000775 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000776
777 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000778}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200779#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000780
781/*
782 * AES key schedule (decryption)
783 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200784#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200785int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200786 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000787{
Arto Kinnunen14804442019-10-16 13:43:59 +0300788#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
789 (void) ctx;
790 (void) key;
791 (void) keybits;
792
793 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
794#else /* */
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200795 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000797 uint32_t *RK;
798 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200799
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100800 AES_VALIDATE_RET( ctx != NULL );
801 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000806 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100807 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000808
809 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000811 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000812#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000813 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000814
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200815 /* Also checks keybits */
816 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200817 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000818
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200819 ctx->nr = cty.nr;
820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100822 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100823 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200824 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100825 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200826 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100827 }
828#endif
829
Paul Bakker5121ce52009-01-03 21:22:43 +0000830 SK = cty.rk + cty.nr * 4;
831
832 *RK++ = *SK++;
833 *RK++ = *SK++;
834 *RK++ = *SK++;
835 *RK++ = *SK++;
836
837 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
838 {
839 for( j = 0; j < 4; j++, SK++ )
840 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200841 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
842 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
843 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
844 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000845 }
846 }
847
848 *RK++ = *SK++;
849 *RK++ = *SK++;
850 *RK++ = *SK++;
851 *RK++ = *SK++;
852
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200853exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000855
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200856 return( ret );
Arto Kinnunen14804442019-10-16 13:43:59 +0300857#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000858}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100859
860#if defined(MBEDTLS_CIPHER_MODE_XTS)
861static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
862 unsigned int keybits,
863 const unsigned char **key1,
864 unsigned int *key1bits,
865 const unsigned char **key2,
866 unsigned int *key2bits )
867{
868 const unsigned int half_keybits = keybits / 2;
869 const unsigned int half_keybytes = half_keybits / 8;
870
871 switch( keybits )
872 {
873 case 256: break;
874 case 512: break;
875 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
876 }
877
878 *key1bits = half_keybits;
879 *key2bits = half_keybits;
880 *key1 = &key[0];
881 *key2 = &key[half_keybytes];
882
883 return 0;
884}
885
886int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
887 const unsigned char *key,
888 unsigned int keybits)
889{
890 int ret;
891 const unsigned char *key1, *key2;
892 unsigned int key1bits, key2bits;
893
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100894 AES_VALIDATE_RET( ctx != NULL );
895 AES_VALIDATE_RET( key != NULL );
896
Jaeden Amero9366feb2018-05-29 18:55:17 +0100897 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
898 &key2, &key2bits );
899 if( ret != 0 )
900 return( ret );
901
902 /* Set the tweak key. Always set tweak key for the encryption mode. */
903 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
904 if( ret != 0 )
905 return( ret );
906
907 /* Set crypt key for encryption. */
908 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
909}
910
911int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
912 const unsigned char *key,
913 unsigned int keybits)
914{
915 int ret;
916 const unsigned char *key1, *key2;
917 unsigned int key1bits, key2bits;
918
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100919 AES_VALIDATE_RET( ctx != NULL );
920 AES_VALIDATE_RET( key != NULL );
921
Jaeden Amero9366feb2018-05-29 18:55:17 +0100922 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
923 &key2, &key2bits );
924 if( ret != 0 )
925 return( ret );
926
927 /* Set the tweak key. Always set tweak key for encryption. */
928 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
929 if( ret != 0 )
930 return( ret );
931
932 /* Set crypt key for decryption. */
933 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
934}
935#endif /* MBEDTLS_CIPHER_MODE_XTS */
936
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200937#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000938
Paul Bakker5121ce52009-01-03 21:22:43 +0000939/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200940 * AES-ECB block encryption
941 */
942#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +0200943
944static uint32_t *aes_fround( uint32_t *R,
945 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
946 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
947{
948 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
949 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
950 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
951 AES_FT3( ( Y3 >> 24 ) & 0xFF );
952
953 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
954 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
955 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
956 AES_FT3( ( Y0 >> 24 ) & 0xFF );
957
958 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
959 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
960 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
961 AES_FT3( ( Y1 >> 24 ) & 0xFF );
962
963 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
964 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
965 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
966 AES_FT3( ( Y2 >> 24 ) & 0xFF );
967
968 return R;
969}
970
971static void aes_fround_final( uint32_t *R,
972 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
973 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
974{
975 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
976 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
977 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
978 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
979
980 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
981 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
982 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
983 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
984
985 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
986 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
987 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
988 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
989
990 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
991 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
992 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
993 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
994}
995
Andres AGf5bf7182017-03-03 14:09:56 +0000996int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
997 const unsigned char input[16],
998 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200999{
Arto Kinnunen172836a2019-11-28 13:34:13 +02001000 int i, j, offset, start_fin_loops = 1;
1001 aes_r_data_t aes_data_real; // real data
1002#if AES_SCA_CM_ROUNDS != 0
1003 aes_r_data_t aes_data_fake; // fake data
1004#endif /* AES_SCA_CM_ROUNDS != 0 */
1005 aes_r_data_t *aes_data_ptr; // pointer to aes_data_real or aes_data_fake
1006 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001007 int round_ctrl_table_len = ctx->nr - 1 + AES_SCA_CM_ROUNDS + 2 + 2;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001008 // control bytes for AES rounds, reserve based on max ctx->nr
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001009 uint8_t round_ctrl_table[ 14 - 1 + AES_SCA_CM_ROUNDS + 2 + 2];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001010
Arto Kinnunen172836a2019-11-28 13:34:13 +02001011 aes_data_real.rk_ptr = ctx->rk;
1012 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001013
Arto Kinnunen172836a2019-11-28 13:34:13 +02001014#if AES_SCA_CM_ROUNDS != 0
1015 aes_data_table[1] = &aes_data_fake;
1016 aes_data_fake.rk_ptr = ctx->rk;
1017 start_fin_loops = 2;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001018 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001019 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001020#endif
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001021
Arto Kinnunen172836a2019-11-28 13:34:13 +02001022 // Get randomized AES calculation control bytes
1023 aes_sca_cm_data_randomize( round_ctrl_table, round_ctrl_table_len );
1024
Arto Kinnunen425137a2019-11-29 15:53:09 +02001025 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001026 {
1027 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen425137a2019-11-29 15:53:09 +02001028 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001029 {
Arto Kinnunen425137a2019-11-29 15:53:09 +02001030 aes_data_ptr =
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001031 aes_data_table[round_ctrl_table[ round_ctrl_table_len - 4 + j ] >> 4];
Arto Kinnunen172836a2019-11-28 13:34:13 +02001032 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1033 }
1034 }
1035
1036 for( i = 0; i < ( ctx->nr - 1 + AES_SCA_CM_ROUNDS ); i++ )
1037 {
1038 // Read AES control data
1039 aes_data_ptr = aes_data_table[round_ctrl_table[i] >> 4];
1040 offset = round_ctrl_table[i] & 0x0f;
1041
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001042 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1043 &aes_data_ptr->xy_values[0 + offset],
1044 &aes_data_ptr->xy_values[1 + offset],
1045 &aes_data_ptr->xy_values[2 + offset],
1046 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001047 aes_data_ptr->xy_values[4 - offset],
1048 aes_data_ptr->xy_values[5 - offset],
1049 aes_data_ptr->xy_values[6 - offset],
1050 aes_data_ptr->xy_values[7 - offset] );
1051 }
1052
Arto Kinnunen425137a2019-11-29 15:53:09 +02001053 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001054 {
1055 aes_data_ptr = aes_data_table[round_ctrl_table[ i + j ] >> 4];
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001056 aes_fround_final( aes_data_ptr->rk_ptr,
1057 &aes_data_ptr->xy_values[0],
1058 &aes_data_ptr->xy_values[1],
1059 &aes_data_ptr->xy_values[2],
1060 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001061 aes_data_ptr->xy_values[4],
1062 aes_data_ptr->xy_values[5],
1063 aes_data_ptr->xy_values[6],
1064 aes_data_ptr->xy_values[7] );
1065 }
1066
Arto Kinnunen425137a2019-11-29 15:53:09 +02001067 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001068 {
1069 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1070 }
Andres AGf5bf7182017-03-03 14:09:56 +00001071
1072 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001073}
1074#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1075
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001076#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001077void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1078 const unsigned char input[16],
1079 unsigned char output[16] )
1080{
1081 mbedtls_internal_aes_encrypt( ctx, input, output );
1082}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001083#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001084
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001085/*
1086 * AES-ECB block decryption
1087 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001088
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001089#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001090#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001091
1092static uint32_t *aes_rround( uint32_t *R,
1093 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1094 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1095{
1096 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1097 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1098 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1099 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1100
1101 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1102 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1103 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1104 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1105
1106 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1107 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1108 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1109 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1110
1111 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1112 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1113 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1114 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1115 return R;
1116}
1117
1118static void aes_rround_final( uint32_t *R,
1119 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1120 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1121{
1122 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1123 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1124 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1125 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1126
1127 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1128 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1129 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1130 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1131
1132 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1133 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1134 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1135 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1136
1137 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1138 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1139 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1140 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1141}
1142
Andres AGf5bf7182017-03-03 14:09:56 +00001143int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1144 const unsigned char input[16],
1145 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001146{
Arto Kinnunen172836a2019-11-28 13:34:13 +02001147 int i, j, offset, start_fin_loops = 1;
1148 aes_r_data_t aes_data_real; // real data
1149#if AES_SCA_CM_ROUNDS != 0
1150 aes_r_data_t aes_data_fake; // fake data
1151#endif /* AES_SCA_CM_ROUNDS != 0 */
1152 aes_r_data_t *aes_data_ptr; // pointer to aes_data_real or aes_data_fake
1153 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001154 int round_ctrl_table_len = ctx->nr - 1 + AES_SCA_CM_ROUNDS + 2 + 2;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001155 // control bytes for AES rounds, reserve based on max ctx->nr
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001156 uint8_t round_ctrl_table[ 14 - 1 + AES_SCA_CM_ROUNDS + 2 + 2 ];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001157
Arto Kinnunen172836a2019-11-28 13:34:13 +02001158 aes_data_real.rk_ptr = ctx->rk;
1159 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001160
Arto Kinnunen172836a2019-11-28 13:34:13 +02001161#if AES_SCA_CM_ROUNDS != 0
1162 aes_data_table[1] = &aes_data_fake;
1163 aes_data_fake.rk_ptr = ctx->rk;
1164 start_fin_loops = 2;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001165 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001166 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
1167#endif
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001168
Arto Kinnunen172836a2019-11-28 13:34:13 +02001169 // Get randomized AES calculation control bytes
1170 aes_sca_cm_data_randomize( round_ctrl_table, round_ctrl_table_len );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001171
Arto Kinnunen425137a2019-11-29 15:53:09 +02001172 for( i = 0; i < 4; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001173 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001174 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen425137a2019-11-29 15:53:09 +02001175 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001176 {
Arto Kinnunen425137a2019-11-29 15:53:09 +02001177 aes_data_ptr =
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001178 aes_data_table[round_ctrl_table[ round_ctrl_table_len - 4 + j ] >> 4];
Arto Kinnunen172836a2019-11-28 13:34:13 +02001179 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1180 }
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001181 }
1182
Arto Kinnunen172836a2019-11-28 13:34:13 +02001183 for( i = 0; i < ( ctx->nr - 1 + AES_SCA_CM_ROUNDS ); i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001184 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001185 // Read AES control data
1186 aes_data_ptr = aes_data_table[round_ctrl_table[i] >> 4];
1187 offset = round_ctrl_table[i] & 0x0f;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001188
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001189 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1190 &aes_data_ptr->xy_values[0 + offset],
1191 &aes_data_ptr->xy_values[1 + offset],
1192 &aes_data_ptr->xy_values[2 + offset],
1193 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001194 aes_data_ptr->xy_values[4 - offset],
1195 aes_data_ptr->xy_values[5 - offset],
1196 aes_data_ptr->xy_values[6 - offset],
1197 aes_data_ptr->xy_values[7 - offset] );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001198 }
1199
Arto Kinnunen425137a2019-11-29 15:53:09 +02001200 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001201 {
1202 aes_data_ptr = aes_data_table[round_ctrl_table[ i + j ] >> 4];
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001203 aes_rround_final( aes_data_ptr->rk_ptr,
1204 &aes_data_ptr->xy_values[0],
1205 &aes_data_ptr->xy_values[1],
1206 &aes_data_ptr->xy_values[2],
1207 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001208 aes_data_ptr->xy_values[4],
1209 aes_data_ptr->xy_values[5],
1210 aes_data_ptr->xy_values[6],
1211 aes_data_ptr->xy_values[7] );
1212 }
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001213
Arto Kinnunen425137a2019-11-29 15:53:09 +02001214 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001215 {
1216 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1217 }
Andres AGf5bf7182017-03-03 14:09:56 +00001218
1219 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001220}
Arto Kinnunen14804442019-10-16 13:43:59 +03001221#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001222#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1223
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001224#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001225void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1226 const unsigned char input[16],
1227 unsigned char output[16] )
1228{
Arto Kinnunen14804442019-10-16 13:43:59 +03001229#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1230 (void) ctx;
1231 (void) input;
1232 (void) output;
1233#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001234 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001235#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001236}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001237#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001238
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001239/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001240 * AES-ECB block encryption/decryption
1241 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001243 int mode,
1244 const unsigned char input[16],
1245 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001246{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001247 AES_VALIDATE_RET( ctx != NULL );
1248 AES_VALIDATE_RET( input != NULL );
1249 AES_VALIDATE_RET( output != NULL );
1250 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1251 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001252 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001254#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001255 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001257#endif
1258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001259#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001260 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001261 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001263 return( 0 );
1264
1265 // If padlock data misaligned, we just fall back to
1266 // unaccelerated mode
1267 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001268 }
1269#endif
Arto Kinnunen14804442019-10-16 13:43:59 +03001270#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1271 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1272#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001273
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001274 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001275 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001276 else
Andres AGf5bf7182017-03-03 14:09:56 +00001277 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001278#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001279}
1280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001281#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001282/*
1283 * AES-CBC buffer encryption/decryption
1284 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001285int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001286 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001287 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001288 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001289 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001290 unsigned char *output )
1291{
1292 int i;
1293 unsigned char temp[16];
1294
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001295 AES_VALIDATE_RET( ctx != NULL );
1296 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1297 mode == MBEDTLS_AES_DECRYPT );
1298 AES_VALIDATE_RET( iv != NULL );
1299 AES_VALIDATE_RET( input != NULL );
1300 AES_VALIDATE_RET( output != NULL );
1301
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001302 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001303 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001305#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001306 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001307 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001308 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001309 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001310
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001311 // If padlock data misaligned, we just fall back to
1312 // unaccelerated mode
1313 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001314 }
1315#endif
1316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001317 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001318 {
1319 while( length > 0 )
1320 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001321 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001322 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001323
1324 for( i = 0; i < 16; i++ )
1325 output[i] = (unsigned char)( output[i] ^ iv[i] );
1326
Teppo Järvelin91d79382019-10-02 09:09:31 +03001327 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001328
1329 input += 16;
1330 output += 16;
1331 length -= 16;
1332 }
1333 }
1334 else
1335 {
1336 while( length > 0 )
1337 {
1338 for( i = 0; i < 16; i++ )
1339 output[i] = (unsigned char)( input[i] ^ iv[i] );
1340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001341 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001342 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001343
1344 input += 16;
1345 output += 16;
1346 length -= 16;
1347 }
1348 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001349
1350 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001351}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001352#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001353
Aorimn5f778012016-06-09 23:22:58 +02001354#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001355
1356/* Endianess with 64 bits values */
1357#ifndef GET_UINT64_LE
1358#define GET_UINT64_LE(n,b,i) \
1359{ \
1360 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1361 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1362 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1363 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1364 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1365 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1366 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1367 | ( (uint64_t) (b)[(i) ] ); \
1368}
1369#endif
1370
1371#ifndef PUT_UINT64_LE
1372#define PUT_UINT64_LE(n,b,i) \
1373{ \
1374 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1375 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1376 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1377 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1378 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1379 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1380 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1381 (b)[(i) ] = (unsigned char) ( (n) ); \
1382}
1383#endif
1384
1385typedef unsigned char mbedtls_be128[16];
1386
1387/*
1388 * GF(2^128) multiplication function
1389 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001390 * This function multiplies a field element by x in the polynomial field
1391 * representation. It uses 64-bit word operations to gain speed but compensates
1392 * for machine endianess and hence works correctly on both big and little
1393 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001394 */
1395static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001396 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001397{
1398 uint64_t a, b, ra, rb;
1399
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001400 GET_UINT64_LE( a, x, 0 );
1401 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001402
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001403 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1404 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001405
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001406 PUT_UINT64_LE( ra, r, 0 );
1407 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001408}
1409
Aorimn5f778012016-06-09 23:22:58 +02001410/*
1411 * AES-XTS buffer encryption/decryption
1412 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001413int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1414 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001415 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001416 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001417 const unsigned char *input,
1418 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001419{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001420 int ret;
1421 size_t blocks = length / 16;
1422 size_t leftover = length % 16;
1423 unsigned char tweak[16];
1424 unsigned char prev_tweak[16];
1425 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001426
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001427 AES_VALIDATE_RET( ctx != NULL );
1428 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1429 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001430 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001431 AES_VALIDATE_RET( input != NULL );
1432 AES_VALIDATE_RET( output != NULL );
1433
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001434 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001435 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001436 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001437
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001438 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001439 if( length > ( 1 << 20 ) * 16 )
1440 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001441
Jaeden Amerod82cd862018-04-28 15:02:45 +01001442 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001443 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1444 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001445 if( ret != 0 )
1446 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001447
Jaeden Amerod82cd862018-04-28 15:02:45 +01001448 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001449 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001450 size_t i;
1451
1452 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1453 {
1454 /* We are on the last block in a decrypt operation that has
1455 * leftover bytes, so we need to use the next tweak for this block,
1456 * and this tweak for the lefover bytes. Save the current tweak for
1457 * the leftovers and then update the current tweak for use on this,
1458 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001459 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001460 mbedtls_gf128mul_x_ble( tweak, tweak );
1461 }
1462
1463 for( i = 0; i < 16; i++ )
1464 tmp[i] = input[i] ^ tweak[i];
1465
1466 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1467 if( ret != 0 )
1468 return( ret );
1469
1470 for( i = 0; i < 16; i++ )
1471 output[i] = tmp[i] ^ tweak[i];
1472
1473 /* Update the tweak for the next block. */
1474 mbedtls_gf128mul_x_ble( tweak, tweak );
1475
1476 output += 16;
1477 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001478 }
1479
Jaeden Amerod82cd862018-04-28 15:02:45 +01001480 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001481 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001482 /* If we are on the leftover bytes in a decrypt operation, we need to
1483 * use the previous tweak for these bytes (as saved in prev_tweak). */
1484 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001485
Jaeden Amerod82cd862018-04-28 15:02:45 +01001486 /* We are now on the final part of the data unit, which doesn't divide
1487 * evenly by 16. It's time for ciphertext stealing. */
1488 size_t i;
1489 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001490
Jaeden Amerod82cd862018-04-28 15:02:45 +01001491 /* Copy ciphertext bytes from the previous block to our output for each
1492 * byte of cyphertext we won't steal. At the same time, copy the
1493 * remainder of the input for this final round (since the loop bounds
1494 * are the same). */
1495 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001496 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001497 output[i] = prev_output[i];
1498 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001499 }
Aorimn5f778012016-06-09 23:22:58 +02001500
Jaeden Amerod82cd862018-04-28 15:02:45 +01001501 /* Copy ciphertext bytes from the previous block for input in this
1502 * round. */
1503 for( ; i < 16; i++ )
1504 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001505
Jaeden Amerod82cd862018-04-28 15:02:45 +01001506 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1507 if( ret != 0 )
1508 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001509
Jaeden Amerod82cd862018-04-28 15:02:45 +01001510 /* Write the result back to the previous block, overriding the previous
1511 * output we copied. */
1512 for( i = 0; i < 16; i++ )
1513 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001514 }
1515
1516 return( 0 );
1517}
1518#endif /* MBEDTLS_CIPHER_MODE_XTS */
1519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001521/*
1522 * AES-CFB128 buffer encryption/decryption
1523 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001525 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001526 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001527 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001528 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001529 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001530 unsigned char *output )
1531{
Paul Bakker27fdf462011-06-09 13:55:13 +00001532 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001533 size_t n;
1534
1535 AES_VALIDATE_RET( ctx != NULL );
1536 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1537 mode == MBEDTLS_AES_DECRYPT );
1538 AES_VALIDATE_RET( iv_off != NULL );
1539 AES_VALIDATE_RET( iv != NULL );
1540 AES_VALIDATE_RET( input != NULL );
1541 AES_VALIDATE_RET( output != NULL );
1542
1543 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001544
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001545 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001546 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1547
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001548 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001549 {
1550 while( length-- )
1551 {
1552 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001553 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001554
1555 c = *input++;
1556 *output++ = (unsigned char)( c ^ iv[n] );
1557 iv[n] = (unsigned char) c;
1558
Paul Bakker66d5d072014-06-17 16:39:18 +02001559 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001560 }
1561 }
1562 else
1563 {
1564 while( length-- )
1565 {
1566 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001567 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001568
1569 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1570
Paul Bakker66d5d072014-06-17 16:39:18 +02001571 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001572 }
1573 }
1574
1575 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001576
1577 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001578}
Paul Bakker556efba2014-01-24 15:38:12 +01001579
1580/*
1581 * AES-CFB8 buffer encryption/decryption
1582 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001584 int mode,
1585 size_t length,
1586 unsigned char iv[16],
1587 const unsigned char *input,
1588 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001589{
1590 unsigned char c;
1591 unsigned char ov[17];
1592
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001593 AES_VALIDATE_RET( ctx != NULL );
1594 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1595 mode == MBEDTLS_AES_DECRYPT );
1596 AES_VALIDATE_RET( iv != NULL );
1597 AES_VALIDATE_RET( input != NULL );
1598 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001599 while( length-- )
1600 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001601 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001604 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001605 ov[16] = *input;
1606
1607 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001609 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001610 ov[16] = c;
1611
Teppo Järvelin91d79382019-10-02 09:09:31 +03001612 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001613 }
1614
1615 return( 0 );
1616}
Simon Butcher76a5b222018-04-22 22:57:27 +01001617#endif /* MBEDTLS_CIPHER_MODE_CFB */
1618
1619#if defined(MBEDTLS_CIPHER_MODE_OFB)
1620/*
1621 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1622 */
1623int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001624 size_t length,
1625 size_t *iv_off,
1626 unsigned char iv[16],
1627 const unsigned char *input,
1628 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001629{
Simon Butcherad4e4932018-04-29 00:43:47 +01001630 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001631 size_t n;
1632
1633 AES_VALIDATE_RET( ctx != NULL );
1634 AES_VALIDATE_RET( iv_off != NULL );
1635 AES_VALIDATE_RET( iv != NULL );
1636 AES_VALIDATE_RET( input != NULL );
1637 AES_VALIDATE_RET( output != NULL );
1638
1639 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001640
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001641 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001642 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1643
Simon Butcher76a5b222018-04-22 22:57:27 +01001644 while( length-- )
1645 {
1646 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001647 {
1648 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1649 if( ret != 0 )
1650 goto exit;
1651 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001652 *output++ = *input++ ^ iv[n];
1653
1654 n = ( n + 1 ) & 0x0F;
1655 }
1656
1657 *iv_off = n;
1658
Simon Butcherad4e4932018-04-29 00:43:47 +01001659exit:
1660 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001661}
1662#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001664#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001665/*
1666 * AES-CTR buffer encryption/decryption
1667 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001668int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001669 size_t length,
1670 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001671 unsigned char nonce_counter[16],
1672 unsigned char stream_block[16],
1673 const unsigned char *input,
1674 unsigned char *output )
1675{
Paul Bakker369e14b2012-04-18 14:16:09 +00001676 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001677 size_t n;
1678
1679 AES_VALIDATE_RET( ctx != NULL );
1680 AES_VALIDATE_RET( nc_off != NULL );
1681 AES_VALIDATE_RET( nonce_counter != NULL );
1682 AES_VALIDATE_RET( stream_block != NULL );
1683 AES_VALIDATE_RET( input != NULL );
1684 AES_VALIDATE_RET( output != NULL );
1685
1686 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001687
Arto Kinnunen75439012019-12-03 14:12:10 +02001688 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001689 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1690
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001691 while( length-- )
1692 {
1693 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001694 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001695
Paul Bakker369e14b2012-04-18 14:16:09 +00001696 for( i = 16; i > 0; i-- )
1697 if( ++nonce_counter[i - 1] != 0 )
1698 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001699 }
1700 c = *input++;
1701 *output++ = (unsigned char)( c ^ stream_block[n] );
1702
Paul Bakker66d5d072014-06-17 16:39:18 +02001703 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001704 }
1705
1706 *nc_off = n;
1707
1708 return( 0 );
1709}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001710#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001712#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001715/*
1716 * AES test vectors from:
1717 *
1718 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1719 */
1720static const unsigned char aes_test_ecb_dec[3][16] =
1721{
1722 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1723 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1724 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1725 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1726 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1727 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1728};
1729
1730static const unsigned char aes_test_ecb_enc[3][16] =
1731{
1732 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1733 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1734 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1735 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1736 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1737 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1738};
1739
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001740#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001741static const unsigned char aes_test_cbc_dec[3][16] =
1742{
1743 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1744 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1745 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1746 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1747 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1748 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1749};
1750
1751static const unsigned char aes_test_cbc_enc[3][16] =
1752{
1753 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1754 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1755 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1756 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1757 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1758 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1759};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001760#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001761
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001762#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001763/*
1764 * AES-CFB128 test vectors from:
1765 *
1766 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1767 */
1768static const unsigned char aes_test_cfb128_key[3][32] =
1769{
1770 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1771 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1772 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1773 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1774 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1775 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1776 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1777 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1778 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1779};
1780
1781static const unsigned char aes_test_cfb128_iv[16] =
1782{
1783 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1784 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1785};
1786
1787static const unsigned char aes_test_cfb128_pt[64] =
1788{
1789 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1790 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1791 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1792 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1793 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1794 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1795 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1796 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1797};
1798
1799static const unsigned char aes_test_cfb128_ct[3][64] =
1800{
1801 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1802 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1803 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1804 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1805 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1806 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1807 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1808 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1809 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1810 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1811 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1812 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1813 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1814 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1815 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1816 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1817 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1818 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1819 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1820 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1821 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1822 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1823 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1824 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1825};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001827
Simon Butcherad4e4932018-04-29 00:43:47 +01001828#if defined(MBEDTLS_CIPHER_MODE_OFB)
1829/*
1830 * AES-OFB test vectors from:
1831 *
Simon Butcher5db13622018-06-04 22:11:25 +01001832 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001833 */
1834static const unsigned char aes_test_ofb_key[3][32] =
1835{
1836 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1837 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1838 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1839 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1840 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1841 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1842 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1843 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1844 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1845};
1846
1847static const unsigned char aes_test_ofb_iv[16] =
1848{
1849 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1850 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1851};
1852
1853static const unsigned char aes_test_ofb_pt[64] =
1854{
1855 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1856 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1857 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1858 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1859 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1860 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1861 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1862 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1863};
1864
1865static const unsigned char aes_test_ofb_ct[3][64] =
1866{
1867 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1868 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1869 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1870 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1871 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1872 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1873 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1874 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1875 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1876 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1877 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1878 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1879 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1880 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1881 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1882 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1883 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1884 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1885 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1886 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1887 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1888 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1889 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1890 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1891};
1892#endif /* MBEDTLS_CIPHER_MODE_OFB */
1893
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001895/*
1896 * AES-CTR test vectors from:
1897 *
1898 * http://www.faqs.org/rfcs/rfc3686.html
1899 */
1900
1901static const unsigned char aes_test_ctr_key[3][16] =
1902{
1903 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1904 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1905 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1906 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1907 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1908 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1909};
1910
1911static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1912{
1913 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1915 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1916 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1917 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1918 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1919};
1920
1921static const unsigned char aes_test_ctr_pt[3][48] =
1922{
1923 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1924 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1925
1926 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1927 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1928 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1929 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1930
1931 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1932 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1933 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1934 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1935 0x20, 0x21, 0x22, 0x23 }
1936};
1937
1938static const unsigned char aes_test_ctr_ct[3][48] =
1939{
1940 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1941 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1942 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1943 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1944 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1945 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1946 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1947 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1948 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1949 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1950 0x25, 0xB2, 0x07, 0x2F }
1951};
1952
1953static const int aes_test_ctr_len[3] =
1954 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001955#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001956
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001957#if defined(MBEDTLS_CIPHER_MODE_XTS)
1958/*
1959 * AES-XTS test vectors from:
1960 *
1961 * IEEE P1619/D16 Annex B
1962 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1963 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1964 */
1965static const unsigned char aes_test_xts_key[][32] =
1966{
1967 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1971 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1972 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1973 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1974 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1975 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1976 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1977 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1978 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1979};
1980
1981static const unsigned char aes_test_xts_pt32[][32] =
1982{
1983 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1987 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1988 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1989 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1990 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1991 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1992 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1993 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1994 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1995};
1996
1997static const unsigned char aes_test_xts_ct32[][32] =
1998{
1999 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2000 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2001 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2002 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2003 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2004 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2005 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2006 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2007 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2008 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2009 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2010 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2011};
2012
2013static const unsigned char aes_test_xts_data_unit[][16] =
2014{
2015 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2017 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2018 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2019 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2021};
2022
2023#endif /* MBEDTLS_CIPHER_MODE_XTS */
2024
Paul Bakker5121ce52009-01-03 21:22:43 +00002025/*
2026 * Checkup routine
2027 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002028int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002029{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002030 int ret = 0, i, j, u, mode;
2031 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002032 unsigned char key[32];
2033 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002034 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002035#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002036 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002037#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002038#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002039 unsigned char prv[16];
2040#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002041#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2042 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002043 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002044#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002045#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002046 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002047#endif
2048#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002049 unsigned char nonce_counter[16];
2050 unsigned char stream_block[16];
2051#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002052 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002053
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002054 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002055 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002056
2057 /*
2058 * ECB mode
2059 */
2060 for( i = 0; i < 6; i++ )
2061 {
2062 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002063 keybits = 128 + u * 64;
2064 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002065
2066 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002067 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2068 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002069
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002070#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2071 if( keybits > 128 )
2072 {
2073 mbedtls_printf( "skipped\n" );
2074 continue;
2075 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002076#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2077
2078#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2079 if( mode == MBEDTLS_AES_DECRYPT )
2080 {
2081 mbedtls_printf( "skipped\n" );
2082 continue;
2083 }
2084#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002085
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002086 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002087
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002088 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002089 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002090 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2091 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002092 }
2093 else
2094 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002095 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2096 aes_tests = aes_test_ecb_enc[u];
2097 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002098
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002099 /*
2100 * AES-192 is an optional feature that may be unavailable when
2101 * there is an alternative underlying implementation i.e. when
2102 * MBEDTLS_AES_ALT is defined.
2103 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002104 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002105 {
2106 mbedtls_printf( "skipped\n" );
2107 continue;
2108 }
2109 else if( ret != 0 )
2110 {
2111 goto exit;
2112 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002113
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002114 for( j = 0; j < 10000; j++ )
2115 {
2116 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2117 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002118 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002119 }
2120
2121 if( memcmp( buf, aes_tests, 16 ) != 0 )
2122 {
2123 ret = 1;
2124 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002125 }
2126
2127 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002128 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002129 }
2130
2131 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002132 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002134#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002135 /*
2136 * CBC mode
2137 */
2138 for( i = 0; i < 6; i++ )
2139 {
2140 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002141 keybits = 128 + u * 64;
2142 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002143
2144 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002145 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2146 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002147
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002148#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2149 if( keybits > 128 )
2150 {
2151 mbedtls_printf( "skipped\n" );
2152 continue;
2153 }
2154#endif
2155
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002156#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2157 if( mode == MBEDTLS_AES_DECRYPT )
2158 {
2159 mbedtls_printf( "skipped\n" );
2160 continue;
2161 }
2162#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2163
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002164 memset( iv , 0, 16 );
2165 memset( prv, 0, 16 );
2166 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002167
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002168 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002169 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002170 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2171 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002172 }
2173 else
2174 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002175 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2176 aes_tests = aes_test_cbc_enc[u];
2177 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002178
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002179 /*
2180 * AES-192 is an optional feature that may be unavailable when
2181 * there is an alternative underlying implementation i.e. when
2182 * MBEDTLS_AES_ALT is defined.
2183 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002184 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002185 {
2186 mbedtls_printf( "skipped\n" );
2187 continue;
2188 }
2189 else if( ret != 0 )
2190 {
2191 goto exit;
2192 }
2193
2194 for( j = 0; j < 10000; j++ )
2195 {
2196 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002197 {
2198 unsigned char tmp[16];
2199
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002200 memcpy( tmp, prv, 16 );
2201 memcpy( prv, buf, 16 );
2202 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002203 }
2204
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002205 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2206 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002207 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002208
2209 }
2210
2211 if( memcmp( buf, aes_tests, 16 ) != 0 )
2212 {
2213 ret = 1;
2214 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002215 }
2216
2217 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002218 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002219 }
2220
2221 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002222 mbedtls_printf( "\n" );
2223#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002225#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002226 /*
2227 * CFB128 mode
2228 */
2229 for( i = 0; i < 6; i++ )
2230 {
2231 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002232 keybits = 128 + u * 64;
2233 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
2235 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002236 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2237 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002238
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002239#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2240 if( keybits > 128 )
2241 {
2242 mbedtls_printf( "skipped\n" );
2243 continue;
2244 }
2245#endif
2246
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002247#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2248 if( mode == MBEDTLS_AES_DECRYPT )
2249 {
2250 mbedtls_printf( "skipped\n" );
2251 continue;
2252 }
2253#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2254
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002256 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002257
2258 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002259 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002260 /*
2261 * AES-192 is an optional feature that may be unavailable when
2262 * there is an alternative underlying implementation i.e. when
2263 * MBEDTLS_AES_ALT is defined.
2264 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002265 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002266 {
2267 mbedtls_printf( "skipped\n" );
2268 continue;
2269 }
2270 else if( ret != 0 )
2271 {
2272 goto exit;
2273 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002274
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002275 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002276 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002277 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002278 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002279 }
2280 else
2281 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002282 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002283 aes_tests = aes_test_cfb128_ct[u];
2284 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002285
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002286 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2287 if( ret != 0 )
2288 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002289
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002290 if( memcmp( buf, aes_tests, 64 ) != 0 )
2291 {
2292 ret = 1;
2293 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002294 }
2295
2296 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002297 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002298 }
2299
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002300 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002301 mbedtls_printf( "\n" );
2302#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002303
Simon Butcherad4e4932018-04-29 00:43:47 +01002304#if defined(MBEDTLS_CIPHER_MODE_OFB)
2305 /*
2306 * OFB mode
2307 */
2308 for( i = 0; i < 6; i++ )
2309 {
2310 u = i >> 1;
2311 keybits = 128 + u * 64;
2312 mode = i & 1;
2313
2314 if( verbose != 0 )
2315 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2316 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2317
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002318#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2319 if( keybits > 128 )
2320 {
2321 mbedtls_printf( "skipped\n" );
2322 continue;
2323 }
2324#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002325
2326#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2327 if( mode == MBEDTLS_AES_DECRYPT )
2328 {
2329 mbedtls_printf( "skipped\n" );
2330 continue;
2331 }
2332#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2333
Simon Butcherad4e4932018-04-29 00:43:47 +01002334 memcpy( iv, aes_test_ofb_iv, 16 );
2335 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2336
2337 offset = 0;
2338 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2339 /*
2340 * AES-192 is an optional feature that may be unavailable when
2341 * there is an alternative underlying implementation i.e. when
2342 * MBEDTLS_AES_ALT is defined.
2343 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002344 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002345 {
2346 mbedtls_printf( "skipped\n" );
2347 continue;
2348 }
2349 else if( ret != 0 )
2350 {
2351 goto exit;
2352 }
2353
2354 if( mode == MBEDTLS_AES_DECRYPT )
2355 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002356 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002357 aes_tests = aes_test_ofb_pt;
2358 }
2359 else
2360 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002361 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002362 aes_tests = aes_test_ofb_ct[u];
2363 }
2364
2365 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2366 if( ret != 0 )
2367 goto exit;
2368
2369 if( memcmp( buf, aes_tests, 64 ) != 0 )
2370 {
2371 ret = 1;
2372 goto exit;
2373 }
2374
2375 if( verbose != 0 )
2376 mbedtls_printf( "passed\n" );
2377 }
2378
2379 if( verbose != 0 )
2380 mbedtls_printf( "\n" );
2381#endif /* MBEDTLS_CIPHER_MODE_OFB */
2382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002383#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002384 /*
2385 * CTR mode
2386 */
2387 for( i = 0; i < 6; i++ )
2388 {
2389 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002390 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002391
2392 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002393 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002394 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002395
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002396#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2397 if( keybits > 128 )
2398 {
2399 mbedtls_printf( "skipped\n" );
2400 continue;
2401 }
2402#endif
2403
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002404#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2405 if( mode == MBEDTLS_AES_DECRYPT )
2406 {
2407 mbedtls_printf( "skipped\n" );
2408 continue;
2409 }
2410#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2411
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002412 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2413 memcpy( key, aes_test_ctr_key[u], 16 );
2414
2415 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002416 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2417 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002418
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002419 len = aes_test_ctr_len[u];
2420
2421 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002422 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002423 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002424 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002425 }
2426 else
2427 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002428 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002429 aes_tests = aes_test_ctr_ct[u];
2430 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002431
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002432 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2433 stream_block, buf, buf );
2434 if( ret != 0 )
2435 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002436
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002437 if( memcmp( buf, aes_tests, len ) != 0 )
2438 {
2439 ret = 1;
2440 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002441 }
2442
2443 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002444 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002445 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002446
2447 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002448 mbedtls_printf( "\n" );
2449#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002450
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002451#if defined(MBEDTLS_CIPHER_MODE_XTS)
2452 {
2453 static const int num_tests =
2454 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2455 mbedtls_aes_xts_context ctx_xts;
2456
2457 /*
2458 * XTS mode
2459 */
2460 mbedtls_aes_xts_init( &ctx_xts );
2461
2462 for( i = 0; i < num_tests << 1; i++ )
2463 {
2464 const unsigned char *data_unit;
2465 u = i >> 1;
2466 mode = i & 1;
2467
2468 if( verbose != 0 )
2469 mbedtls_printf( " AES-XTS-128 (%s): ",
2470 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2471
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002472#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2473 if( mode == MBEDTLS_AES_DECRYPT )
2474 {
2475 mbedtls_printf( "skipped\n" );
2476 continue;
2477 }
2478#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2479
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002480 memset( key, 0, sizeof( key ) );
2481 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002482 data_unit = aes_test_xts_data_unit[u];
2483
2484 len = sizeof( *aes_test_xts_ct32 );
2485
2486 if( mode == MBEDTLS_AES_DECRYPT )
2487 {
2488 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2489 if( ret != 0)
2490 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002491 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002492 aes_tests = aes_test_xts_pt32[u];
2493 }
2494 else
2495 {
2496 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2497 if( ret != 0)
2498 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002499 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002500 aes_tests = aes_test_xts_ct32[u];
2501 }
2502
2503
2504 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2505 buf, buf );
2506 if( ret != 0 )
2507 goto exit;
2508
2509 if( memcmp( buf, aes_tests, len ) != 0 )
2510 {
2511 ret = 1;
2512 goto exit;
2513 }
2514
2515 if( verbose != 0 )
2516 mbedtls_printf( "passed\n" );
2517 }
2518
2519 if( verbose != 0 )
2520 mbedtls_printf( "\n" );
2521
2522 mbedtls_aes_xts_free( &ctx_xts );
2523 }
2524#endif /* MBEDTLS_CIPHER_MODE_XTS */
2525
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002526 ret = 0;
2527
2528exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002529 if( ret != 0 && verbose != 0 )
2530 mbedtls_printf( "failed\n" );
2531
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002532 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002533
2534 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002535}
2536
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002537#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002539#endif /* MBEDTLS_AES_C */