blob: 57332e57bb54d35d861a9ee2fc4d41e7b72f1c3c [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 Kinnunen76deef92019-12-05 10:10:31 +0200547 is_unique_number = 0;
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200548 do
549 {
Arto Kinnunen76deef92019-12-05 10:10:31 +0200550 is_unique_number++;
551 num = mbedtls_platform_random_in_range( tbl_len - 4 );
552
553 if( is_unique_number > 10 )
554 {
555 // prevent forever loop if random returns constant
556 is_unique_number = 0;
557 tbl[i] = 0x10; // fake data
558 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200559
Arto Kinnunen75439012019-12-03 14:12:10 +0200560 if( tbl[num] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200561 {
562 is_unique_number = 0;
Arto Kinnunen76deef92019-12-05 10:10:31 +0200563 tbl[num] = 0x10; // fake data
Arto Kinnunen172836a2019-11-28 13:34:13 +0200564 }
Arto Kinnunen76deef92019-12-05 10:10:31 +0200565 } while( is_unique_number != 0 );
Arto Kinnunen172836a2019-11-28 13:34:13 +0200566 }
567
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200568 // randomize control data for start and final round
569 for( i = 1; i <= 2; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200570 {
Arto Kinnunen76deef92019-12-05 10:10:31 +0200571 num = mbedtls_platform_random_in_range( 0xff );
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200572 if( ( num % 2 ) == 0 )
573 {
574 tbl[tbl_len - ( i * 2 - 0 )] = 0x10; // fake data
575 tbl[tbl_len - ( i * 2 - 1 )] = 0x00; // real data
576 }
577 else
578 {
579 tbl[tbl_len - ( i * 2 - 0 )] = 0x00; // real data
580 tbl[tbl_len - ( i * 2 - 1 )] = 0x10; // fake data
581 }
Arto Kinnunen172836a2019-11-28 13:34:13 +0200582 }
583#endif /* AES_SCA_CM_ROUNDS != 0 */
584
585 // Fill real AES round data to the remaining places
586 is_even_pos = 1;
Arto Kinnunenf44f7d42019-12-04 15:19:50 +0200587 for( i = 0; i < tbl_len - 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200588 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200589 if( tbl[i] == 0 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200590 {
Arto Kinnunen75439012019-12-03 14:12:10 +0200591 if( is_even_pos == 1 )
Arto Kinnunen172836a2019-11-28 13:34:13 +0200592 {
Arto Kinnunen34139ba2019-12-03 15:43:27 +0200593 tbl[i] = 0x04; // real data, offset 4
Arto Kinnunen172836a2019-11-28 13:34:13 +0200594 is_even_pos = 0;
595 }
596 else
597 {
598 tbl[i] = 0x00; // real data, offset 0
599 is_even_pos = 1;
600 }
601 }
602 }
603}
604
Hanno Beckerad049a92017-06-19 16:31:54 +0100605#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200606
607#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
608#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
609#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
610
611#define AES_RT0(idx) RT0[idx]
612#define AES_RT1(idx) ROTL8( RT0[idx] )
613#define AES_RT2(idx) ROTL16( RT0[idx] )
614#define AES_RT3(idx) ROTL24( RT0[idx] )
615
616#define AES_FT0(idx) FT0[idx]
617#define AES_FT1(idx) ROTL8( FT0[idx] )
618#define AES_FT2(idx) ROTL16( FT0[idx] )
619#define AES_FT3(idx) ROTL24( FT0[idx] )
620
Hanno Becker177d3cf2017-06-07 15:52:48 +0100621#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200622
623#define AES_RT0(idx) RT0[idx]
624#define AES_RT1(idx) RT1[idx]
625#define AES_RT2(idx) RT2[idx]
626#define AES_RT3(idx) RT3[idx]
627
628#define AES_FT0(idx) FT0[idx]
629#define AES_FT1(idx) FT1[idx]
630#define AES_FT2(idx) FT2[idx]
631#define AES_FT3(idx) FT3[idx]
632
Hanno Becker177d3cf2017-06-07 15:52:48 +0100633#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200636{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100637 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000638
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200639 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200640}
641
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200642void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200643{
644 if( ctx == NULL )
645 return;
646
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500647 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200648}
649
Jaeden Amero9366feb2018-05-29 18:55:17 +0100650#if defined(MBEDTLS_CIPHER_MODE_XTS)
651void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
652{
Manuel Pégourié-Gonnard0e9cddb2018-12-10 16:37:51 +0100653 AES_VALIDATE( ctx != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000654
Jaeden Amero9366feb2018-05-29 18:55:17 +0100655 mbedtls_aes_init( &ctx->crypt );
656 mbedtls_aes_init( &ctx->tweak );
657}
658
659void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
660{
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100661 if( ctx == NULL )
662 return;
Simon Butcher5201e412018-12-06 17:40:14 +0000663
Jaeden Amero9366feb2018-05-29 18:55:17 +0100664 mbedtls_aes_free( &ctx->crypt );
665 mbedtls_aes_free( &ctx->tweak );
666}
667#endif /* MBEDTLS_CIPHER_MODE_XTS */
668
Paul Bakker5121ce52009-01-03 21:22:43 +0000669/*
670 * AES key schedule (encryption)
671 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200672#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200674 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000675{
Paul Bakker23986e52011-04-24 08:57:21 +0000676 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000677 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000678
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100679 AES_VALIDATE_RET( ctx != NULL );
680 AES_VALIDATE_RET( key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000681
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200682 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000683 {
684 case 128: ctx->nr = 10; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300685#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000686 case 192: ctx->nr = 12; break;
687 case 256: ctx->nr = 14; break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300688#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200689 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000690 }
691
Simon Butcher5201e412018-12-06 17:40:14 +0000692#if !defined(MBEDTLS_AES_ROM_TABLES)
693 if( aes_init_done == 0 )
694 {
695 aes_gen_tables();
696 aes_init_done = 1;
Simon Butcher5201e412018-12-06 17:40:14 +0000697 }
698#endif
699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000701 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100702 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000703
704 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000706 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000707#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000708 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000709
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200710#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100711 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200712 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100713#endif
714
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200715 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000716 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000717 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000718 }
719
720 switch( ctx->nr )
721 {
722 case 10:
723
724 for( i = 0; i < 10; i++, RK += 4 )
725 {
726 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000727 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
728 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
729 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
730 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000731
732 RK[5] = RK[1] ^ RK[4];
733 RK[6] = RK[2] ^ RK[5];
734 RK[7] = RK[3] ^ RK[6];
735 }
736 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300737#if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
Paul Bakker5121ce52009-01-03 21:22:43 +0000738 case 12:
739
740 for( i = 0; i < 8; i++, RK += 6 )
741 {
742 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000743 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
744 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
745 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
746 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000747
748 RK[7] = RK[1] ^ RK[6];
749 RK[8] = RK[2] ^ RK[7];
750 RK[9] = RK[3] ^ RK[8];
751 RK[10] = RK[4] ^ RK[9];
752 RK[11] = RK[5] ^ RK[10];
753 }
754 break;
755
756 case 14:
757
758 for( i = 0; i < 7; i++, RK += 8 )
759 {
760 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000761 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
762 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
763 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
764 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000765
766 RK[9] = RK[1] ^ RK[8];
767 RK[10] = RK[2] ^ RK[9];
768 RK[11] = RK[3] ^ RK[10];
769
770 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000771 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
772 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
773 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
774 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000775
776 RK[13] = RK[5] ^ RK[12];
777 RK[14] = RK[6] ^ RK[13];
778 RK[15] = RK[7] ^ RK[14];
779 }
780 break;
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +0300781#endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
Paul Bakker5121ce52009-01-03 21:22:43 +0000782 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000783
784 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000785}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200786#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000787
788/*
789 * AES key schedule (decryption)
790 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200791#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200793 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000794{
Arto Kinnunen14804442019-10-16 13:43:59 +0300795#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
796 (void) ctx;
797 (void) key;
798 (void) keybits;
799
800 return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
801#else /* */
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200802 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000804 uint32_t *RK;
805 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200806
Manuel Pégourié-Gonnard44c5d582018-12-10 16:56:14 +0100807 AES_VALIDATE_RET( ctx != NULL );
808 AES_VALIDATE_RET( key != NULL );
Simon Butcher5201e412018-12-06 17:40:14 +0000809
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000813 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100814 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000815
816 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000818 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000819#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000820 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000821
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200822 /* Also checks keybits */
823 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200824 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000825
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200826 ctx->nr = cty.nr;
827
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100829 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100830 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100832 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200833 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100834 }
835#endif
836
Paul Bakker5121ce52009-01-03 21:22:43 +0000837 SK = cty.rk + cty.nr * 4;
838
839 *RK++ = *SK++;
840 *RK++ = *SK++;
841 *RK++ = *SK++;
842 *RK++ = *SK++;
843
844 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
845 {
846 for( j = 0; j < 4; j++, SK++ )
847 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200848 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
849 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
850 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
851 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000852 }
853 }
854
855 *RK++ = *SK++;
856 *RK++ = *SK++;
857 *RK++ = *SK++;
858 *RK++ = *SK++;
859
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200860exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000862
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200863 return( ret );
Arto Kinnunen14804442019-10-16 13:43:59 +0300864#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000865}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100866
867#if defined(MBEDTLS_CIPHER_MODE_XTS)
868static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
869 unsigned int keybits,
870 const unsigned char **key1,
871 unsigned int *key1bits,
872 const unsigned char **key2,
873 unsigned int *key2bits )
874{
875 const unsigned int half_keybits = keybits / 2;
876 const unsigned int half_keybytes = half_keybits / 8;
877
878 switch( keybits )
879 {
880 case 256: break;
881 case 512: break;
882 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
883 }
884
885 *key1bits = half_keybits;
886 *key2bits = half_keybits;
887 *key1 = &key[0];
888 *key2 = &key[half_keybytes];
889
890 return 0;
891}
892
893int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
894 const unsigned char *key,
895 unsigned int keybits)
896{
897 int ret;
898 const unsigned char *key1, *key2;
899 unsigned int key1bits, key2bits;
900
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100901 AES_VALIDATE_RET( ctx != NULL );
902 AES_VALIDATE_RET( key != NULL );
903
Jaeden Amero9366feb2018-05-29 18:55:17 +0100904 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
905 &key2, &key2bits );
906 if( ret != 0 )
907 return( ret );
908
909 /* Set the tweak key. Always set tweak key for the encryption mode. */
910 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
911 if( ret != 0 )
912 return( ret );
913
914 /* Set crypt key for encryption. */
915 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
916}
917
918int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
919 const unsigned char *key,
920 unsigned int keybits)
921{
922 int ret;
923 const unsigned char *key1, *key2;
924 unsigned int key1bits, key2bits;
925
Manuel Pégourié-Gonnard68e3dff2018-12-12 12:48:04 +0100926 AES_VALIDATE_RET( ctx != NULL );
927 AES_VALIDATE_RET( key != NULL );
928
Jaeden Amero9366feb2018-05-29 18:55:17 +0100929 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
930 &key2, &key2bits );
931 if( ret != 0 )
932 return( ret );
933
934 /* Set the tweak key. Always set tweak key for encryption. */
935 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
936 if( ret != 0 )
937 return( ret );
938
939 /* Set crypt key for decryption. */
940 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
941}
942#endif /* MBEDTLS_CIPHER_MODE_XTS */
943
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200944#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000945
Paul Bakker5121ce52009-01-03 21:22:43 +0000946/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200947 * AES-ECB block encryption
948 */
949#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +0200950
951static uint32_t *aes_fround( uint32_t *R,
952 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
953 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
954{
955 *X0 = *R++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^
956 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^
957 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^
958 AES_FT3( ( Y3 >> 24 ) & 0xFF );
959
960 *X1 = *R++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^
961 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^
962 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^
963 AES_FT3( ( Y0 >> 24 ) & 0xFF );
964
965 *X2 = *R++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^
966 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^
967 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^
968 AES_FT3( ( Y1 >> 24 ) & 0xFF );
969
970 *X3 = *R++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^
971 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^
972 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^
973 AES_FT3( ( Y2 >> 24 ) & 0xFF );
974
975 return R;
976}
977
978static void aes_fround_final( uint32_t *R,
979 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
980 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
981{
982 *X0 = *R++ ^ ( (uint32_t) FSb[ ( (Y0) ) & 0xFF ] ) ^
983 ( (uint32_t) FSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
984 ( (uint32_t) FSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
985 ( (uint32_t) FSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
986
987 *X1 = *R++ ^ ( (uint32_t) FSb[ ( (Y1) ) & 0xFF ] ) ^
988 ( (uint32_t) FSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
989 ( (uint32_t) FSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
990 ( (uint32_t) FSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
991
992 *X2 = *R++ ^ ( (uint32_t) FSb[ ( (Y2) ) & 0xFF ] ) ^
993 ( (uint32_t) FSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
994 ( (uint32_t) FSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
995 ( (uint32_t) FSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
996
997 *X3 = *R++ ^ ( (uint32_t) FSb[ ( (Y3) ) & 0xFF ] ) ^
998 ( (uint32_t) FSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
999 ( (uint32_t) FSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1000 ( (uint32_t) FSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1001}
1002
Andres AGf5bf7182017-03-03 14:09:56 +00001003int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
1004 const unsigned char input[16],
1005 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001006{
Arto Kinnunen172836a2019-11-28 13:34:13 +02001007 int i, j, offset, start_fin_loops = 1;
1008 aes_r_data_t aes_data_real; // real data
1009#if AES_SCA_CM_ROUNDS != 0
1010 aes_r_data_t aes_data_fake; // fake data
1011#endif /* AES_SCA_CM_ROUNDS != 0 */
1012 aes_r_data_t *aes_data_ptr; // pointer to aes_data_real or aes_data_fake
1013 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001014 int round_ctrl_table_len = ctx->nr - 1 + AES_SCA_CM_ROUNDS + 2 + 2;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001015 // control bytes for AES rounds, reserve based on max ctx->nr
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001016 uint8_t round_ctrl_table[ 14 - 1 + AES_SCA_CM_ROUNDS + 2 + 2];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001017
Arto Kinnunen172836a2019-11-28 13:34:13 +02001018 aes_data_real.rk_ptr = ctx->rk;
1019 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001020
Arto Kinnunen172836a2019-11-28 13:34:13 +02001021#if AES_SCA_CM_ROUNDS != 0
1022 aes_data_table[1] = &aes_data_fake;
1023 aes_data_fake.rk_ptr = ctx->rk;
1024 start_fin_loops = 2;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001025 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001026 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001027#endif
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001028
Arto Kinnunen172836a2019-11-28 13:34:13 +02001029 // Get randomized AES calculation control bytes
1030 aes_sca_cm_data_randomize( round_ctrl_table, round_ctrl_table_len );
1031
Arto Kinnunen425137a2019-11-29 15:53:09 +02001032 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001033 {
1034 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen425137a2019-11-29 15:53:09 +02001035 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001036 {
Arto Kinnunen425137a2019-11-29 15:53:09 +02001037 aes_data_ptr =
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001038 aes_data_table[round_ctrl_table[ round_ctrl_table_len - 4 + j ] >> 4];
Arto Kinnunen172836a2019-11-28 13:34:13 +02001039 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1040 }
1041 }
1042
1043 for( i = 0; i < ( ctx->nr - 1 + AES_SCA_CM_ROUNDS ); i++ )
1044 {
1045 // Read AES control data
1046 aes_data_ptr = aes_data_table[round_ctrl_table[i] >> 4];
1047 offset = round_ctrl_table[i] & 0x0f;
1048
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001049 aes_data_ptr->rk_ptr = aes_fround( aes_data_ptr->rk_ptr,
1050 &aes_data_ptr->xy_values[0 + offset],
1051 &aes_data_ptr->xy_values[1 + offset],
1052 &aes_data_ptr->xy_values[2 + offset],
1053 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001054 aes_data_ptr->xy_values[4 - offset],
1055 aes_data_ptr->xy_values[5 - offset],
1056 aes_data_ptr->xy_values[6 - offset],
1057 aes_data_ptr->xy_values[7 - offset] );
1058 }
1059
Arto Kinnunen425137a2019-11-29 15:53:09 +02001060 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001061 {
1062 aes_data_ptr = aes_data_table[round_ctrl_table[ i + j ] >> 4];
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001063 aes_fround_final( aes_data_ptr->rk_ptr,
1064 &aes_data_ptr->xy_values[0],
1065 &aes_data_ptr->xy_values[1],
1066 &aes_data_ptr->xy_values[2],
1067 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001068 aes_data_ptr->xy_values[4],
1069 aes_data_ptr->xy_values[5],
1070 aes_data_ptr->xy_values[6],
1071 aes_data_ptr->xy_values[7] );
1072 }
1073
Arto Kinnunen425137a2019-11-29 15:53:09 +02001074 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001075 {
1076 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1077 }
Andres AGf5bf7182017-03-03 14:09:56 +00001078
1079 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001080}
1081#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
1082
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001083#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001084void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
1085 const unsigned char input[16],
1086 unsigned char output[16] )
1087{
1088 mbedtls_internal_aes_encrypt( ctx, input, output );
1089}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001090#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001091
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001092/*
1093 * AES-ECB block decryption
1094 */
Arto Kinnunen14804442019-10-16 13:43:59 +03001095
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001096#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Arto Kinnunen14804442019-10-16 13:43:59 +03001097#if !defined(MBEDTLS_AES_ONLY_ENCRYPT)
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001098
1099static uint32_t *aes_rround( uint32_t *R,
1100 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1101 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1102{
1103 *X0 = *R++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^
1104 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^
1105 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^
1106 AES_RT3( ( Y1 >> 24 ) & 0xFF );
1107
1108 *X1 = *R++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^
1109 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^
1110 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^
1111 AES_RT3( ( Y2 >> 24 ) & 0xFF );
1112
1113 *X2 = *R++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^
1114 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^
1115 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^
1116 AES_RT3( ( Y3 >> 24 ) & 0xFF );
1117
1118 *X3 = *R++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^
1119 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^
1120 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^
1121 AES_RT3( ( Y0 >> 24 ) & 0xFF );
1122 return R;
1123}
1124
1125static void aes_rround_final( uint32_t *R,
1126 uint32_t *X0, uint32_t *X1, uint32_t *X2, uint32_t *X3,
1127 uint32_t Y0, uint32_t Y1, uint32_t Y2, uint32_t Y3 )
1128{
1129 *X0 = *R++ ^ ( (uint32_t) RSb[ ( (Y0) ) & 0xFF ] ) ^
1130 ( (uint32_t) RSb[ ( (Y3) >> 8 ) & 0xFF ] << 8 ) ^
1131 ( (uint32_t) RSb[ ( (Y2) >> 16 ) & 0xFF ] << 16 ) ^
1132 ( (uint32_t) RSb[ ( (Y1) >> 24 ) & 0xFF ] << 24 );
1133
1134 *X1 = *R++ ^ ( (uint32_t) RSb[ ( (Y1) ) & 0xFF ] ) ^
1135 ( (uint32_t) RSb[ ( (Y0) >> 8 ) & 0xFF ] << 8 ) ^
1136 ( (uint32_t) RSb[ ( (Y3) >> 16 ) & 0xFF ] << 16 ) ^
1137 ( (uint32_t) RSb[ ( (Y2) >> 24 ) & 0xFF ] << 24 );
1138
1139 *X2 = *R++ ^ ( (uint32_t) RSb[ ( (Y2) ) & 0xFF ] ) ^
1140 ( (uint32_t) RSb[ ( (Y1) >> 8 ) & 0xFF ] << 8 ) ^
1141 ( (uint32_t) RSb[ ( (Y0) >> 16 ) & 0xFF ] << 16 ) ^
1142 ( (uint32_t) RSb[ ( (Y3) >> 24 ) & 0xFF ] << 24 );
1143
1144 *X3 = *R++ ^ ( (uint32_t) RSb[ ( (Y3) ) & 0xFF ] ) ^
1145 ( (uint32_t) RSb[ ( (Y2) >> 8 ) & 0xFF ] << 8 ) ^
1146 ( (uint32_t) RSb[ ( (Y1) >> 16 ) & 0xFF ] << 16 ) ^
1147 ( (uint32_t) RSb[ ( (Y0) >> 24 ) & 0xFF ] << 24 );
1148}
1149
Andres AGf5bf7182017-03-03 14:09:56 +00001150int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
1151 const unsigned char input[16],
1152 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001153{
Arto Kinnunen172836a2019-11-28 13:34:13 +02001154 int i, j, offset, start_fin_loops = 1;
1155 aes_r_data_t aes_data_real; // real data
1156#if AES_SCA_CM_ROUNDS != 0
1157 aes_r_data_t aes_data_fake; // fake data
1158#endif /* AES_SCA_CM_ROUNDS != 0 */
1159 aes_r_data_t *aes_data_ptr; // pointer to aes_data_real or aes_data_fake
1160 aes_r_data_t *aes_data_table[2]; // pointers to real and fake data
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001161 int round_ctrl_table_len = ctx->nr - 1 + AES_SCA_CM_ROUNDS + 2 + 2;
Arto Kinnunen172836a2019-11-28 13:34:13 +02001162 // control bytes for AES rounds, reserve based on max ctx->nr
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001163 uint8_t round_ctrl_table[ 14 - 1 + AES_SCA_CM_ROUNDS + 2 + 2 ];
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001164
Arto Kinnunen172836a2019-11-28 13:34:13 +02001165 aes_data_real.rk_ptr = ctx->rk;
1166 aes_data_table[0] = &aes_data_real;
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001167
Arto Kinnunen172836a2019-11-28 13:34:13 +02001168#if AES_SCA_CM_ROUNDS != 0
1169 aes_data_table[1] = &aes_data_fake;
1170 aes_data_fake.rk_ptr = ctx->rk;
1171 start_fin_loops = 2;
Arto Kinnunen425137a2019-11-29 15:53:09 +02001172 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001173 aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff );
1174#endif
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001175
Arto Kinnunen172836a2019-11-28 13:34:13 +02001176 // Get randomized AES calculation control bytes
1177 aes_sca_cm_data_randomize( round_ctrl_table, round_ctrl_table_len );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001178
Arto Kinnunen425137a2019-11-29 15:53:09 +02001179 for( i = 0; i < 4; i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001180 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001181 GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) );
Arto Kinnunen425137a2019-11-29 15:53:09 +02001182 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001183 {
Arto Kinnunen425137a2019-11-29 15:53:09 +02001184 aes_data_ptr =
Arto Kinnunenf44f7d42019-12-04 15:19:50 +02001185 aes_data_table[round_ctrl_table[ round_ctrl_table_len - 4 + j ] >> 4];
Arto Kinnunen172836a2019-11-28 13:34:13 +02001186 aes_data_ptr->xy_values[i] ^= *aes_data_ptr->rk_ptr++;
1187 }
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001188 }
1189
Arto Kinnunen172836a2019-11-28 13:34:13 +02001190 for( i = 0; i < ( ctx->nr - 1 + AES_SCA_CM_ROUNDS ); i++ )
Arto Kinnunenf93d55e2019-10-11 11:15:57 +03001191 {
Arto Kinnunen172836a2019-11-28 13:34:13 +02001192 // Read AES control data
1193 aes_data_ptr = aes_data_table[round_ctrl_table[i] >> 4];
1194 offset = round_ctrl_table[i] & 0x0f;
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001195
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001196 aes_data_ptr->rk_ptr = aes_rround( aes_data_ptr->rk_ptr,
1197 &aes_data_ptr->xy_values[0 + offset],
1198 &aes_data_ptr->xy_values[1 + offset],
1199 &aes_data_ptr->xy_values[2 + offset],
1200 &aes_data_ptr->xy_values[3 + offset],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001201 aes_data_ptr->xy_values[4 - offset],
1202 aes_data_ptr->xy_values[5 - offset],
1203 aes_data_ptr->xy_values[6 - offset],
1204 aes_data_ptr->xy_values[7 - offset] );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001205 }
1206
Arto Kinnunen425137a2019-11-29 15:53:09 +02001207 for( j = 0; j < start_fin_loops; j++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001208 {
1209 aes_data_ptr = aes_data_table[round_ctrl_table[ i + j ] >> 4];
Arto Kinnunenc3532c22019-11-29 15:07:11 +02001210 aes_rround_final( aes_data_ptr->rk_ptr,
1211 &aes_data_ptr->xy_values[0],
1212 &aes_data_ptr->xy_values[1],
1213 &aes_data_ptr->xy_values[2],
1214 &aes_data_ptr->xy_values[3],
Arto Kinnunen172836a2019-11-28 13:34:13 +02001215 aes_data_ptr->xy_values[4],
1216 aes_data_ptr->xy_values[5],
1217 aes_data_ptr->xy_values[6],
1218 aes_data_ptr->xy_values[7] );
1219 }
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001220
Arto Kinnunen425137a2019-11-29 15:53:09 +02001221 for( i = 0; i < 4; i++ )
Arto Kinnunen172836a2019-11-28 13:34:13 +02001222 {
1223 PUT_UINT32_LE( aes_data_real.xy_values[i], output, ( i * 4 ) );
1224 }
Andres AGf5bf7182017-03-03 14:09:56 +00001225
1226 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001227}
Arto Kinnunen14804442019-10-16 13:43:59 +03001228#endif /* !MBEDTLS_AES_ONLY_ENCRYPT */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001229#endif /* !MBEDTLS_AES_DECRYPT_ALT */
1230
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001231#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +01001232void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
1233 const unsigned char input[16],
1234 unsigned char output[16] )
1235{
Arto Kinnunen14804442019-10-16 13:43:59 +03001236#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1237 (void) ctx;
1238 (void) input;
1239 (void) output;
1240#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001241 mbedtls_internal_aes_decrypt( ctx, input, output );
Arto Kinnunen14804442019-10-16 13:43:59 +03001242#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001243}
Gilles Peskine8db3efb2018-02-21 19:16:20 +01001244#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +01001245
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001246/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001247 * AES-ECB block encryption/decryption
1248 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001249int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001250 int mode,
1251 const unsigned char input[16],
1252 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001253{
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001254 AES_VALIDATE_RET( ctx != NULL );
1255 AES_VALIDATE_RET( input != NULL );
1256 AES_VALIDATE_RET( output != NULL );
1257 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1258 mode == MBEDTLS_AES_DECRYPT );
Arto Kinnunen14804442019-10-16 13:43:59 +03001259 (void) mode;
Manuel Pégourié-Gonnard1aca2602018-12-12 12:56:55 +01001260
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001261#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +01001262 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +01001264#endif
1265
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001267 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001268 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001270 return( 0 );
1271
1272 // If padlock data misaligned, we just fall back to
1273 // unaccelerated mode
1274 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001275 }
1276#endif
Arto Kinnunen14804442019-10-16 13:43:59 +03001277#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
1278 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
1279#else /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001280
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001281 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001282 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001283 else
Andres AGf5bf7182017-03-03 14:09:56 +00001284 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Arto Kinnunen14804442019-10-16 13:43:59 +03001285#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001286}
1287
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001288#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001289/*
1290 * AES-CBC buffer encryption/decryption
1291 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001292int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001293 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001294 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001296 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001297 unsigned char *output )
1298{
1299 int i;
1300 unsigned char temp[16];
1301
Manuel Pégourié-Gonnard3178d1a2018-12-12 13:05:00 +01001302 AES_VALIDATE_RET( ctx != NULL );
1303 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1304 mode == MBEDTLS_AES_DECRYPT );
1305 AES_VALIDATE_RET( iv != NULL );
1306 AES_VALIDATE_RET( input != NULL );
1307 AES_VALIDATE_RET( output != NULL );
1308
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001309 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001312#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001313 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001314 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001315 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001316 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001317
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001318 // If padlock data misaligned, we just fall back to
1319 // unaccelerated mode
1320 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001321 }
1322#endif
1323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001325 {
1326 while( length > 0 )
1327 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001328 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001330
1331 for( i = 0; i < 16; i++ )
1332 output[i] = (unsigned char)( output[i] ^ iv[i] );
1333
Teppo Järvelin91d79382019-10-02 09:09:31 +03001334 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001335
1336 input += 16;
1337 output += 16;
1338 length -= 16;
1339 }
1340 }
1341 else
1342 {
1343 while( length > 0 )
1344 {
1345 for( i = 0; i < 16; i++ )
1346 output[i] = (unsigned char)( input[i] ^ iv[i] );
1347
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +03001349 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001350
1351 input += 16;
1352 output += 16;
1353 length -= 16;
1354 }
1355 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001356
1357 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001358}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001360
Aorimn5f778012016-06-09 23:22:58 +02001361#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001362
1363/* Endianess with 64 bits values */
1364#ifndef GET_UINT64_LE
1365#define GET_UINT64_LE(n,b,i) \
1366{ \
1367 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1368 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1369 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1370 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1371 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1372 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1373 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1374 | ( (uint64_t) (b)[(i) ] ); \
1375}
1376#endif
1377
1378#ifndef PUT_UINT64_LE
1379#define PUT_UINT64_LE(n,b,i) \
1380{ \
1381 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1382 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1383 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1384 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1385 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1386 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1387 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1388 (b)[(i) ] = (unsigned char) ( (n) ); \
1389}
1390#endif
1391
1392typedef unsigned char mbedtls_be128[16];
1393
1394/*
1395 * GF(2^128) multiplication function
1396 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001397 * This function multiplies a field element by x in the polynomial field
1398 * representation. It uses 64-bit word operations to gain speed but compensates
1399 * for machine endianess and hence works correctly on both big and little
1400 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001401 */
1402static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001403 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001404{
1405 uint64_t a, b, ra, rb;
1406
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001407 GET_UINT64_LE( a, x, 0 );
1408 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001409
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001410 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1411 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001412
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001413 PUT_UINT64_LE( ra, r, 0 );
1414 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001415}
1416
Aorimn5f778012016-06-09 23:22:58 +02001417/*
1418 * AES-XTS buffer encryption/decryption
1419 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001420int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1421 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001422 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001423 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001424 const unsigned char *input,
1425 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001426{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001427 int ret;
1428 size_t blocks = length / 16;
1429 size_t leftover = length % 16;
1430 unsigned char tweak[16];
1431 unsigned char prev_tweak[16];
1432 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001433
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001434 AES_VALIDATE_RET( ctx != NULL );
1435 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1436 mode == MBEDTLS_AES_DECRYPT );
Manuel Pégourié-Gonnard998a3582018-12-18 10:03:13 +01001437 AES_VALIDATE_RET( data_unit != NULL );
Manuel Pégourié-Gonnard191af132018-12-13 10:15:30 +01001438 AES_VALIDATE_RET( input != NULL );
1439 AES_VALIDATE_RET( output != NULL );
1440
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001441 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001442 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001443 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001444
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001445 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001446 if( length > ( 1 << 20 ) * 16 )
1447 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001448
Jaeden Amerod82cd862018-04-28 15:02:45 +01001449 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001450 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1451 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001452 if( ret != 0 )
1453 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001454
Jaeden Amerod82cd862018-04-28 15:02:45 +01001455 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001456 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001457 size_t i;
1458
1459 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1460 {
1461 /* We are on the last block in a decrypt operation that has
1462 * leftover bytes, so we need to use the next tweak for this block,
1463 * and this tweak for the lefover bytes. Save the current tweak for
1464 * the leftovers and then update the current tweak for use on this,
1465 * the last full block. */
Teppo Järvelin91d79382019-10-02 09:09:31 +03001466 mbedtls_platform_memcpy( prev_tweak, tweak, sizeof( tweak ) );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001467 mbedtls_gf128mul_x_ble( tweak, tweak );
1468 }
1469
1470 for( i = 0; i < 16; i++ )
1471 tmp[i] = input[i] ^ tweak[i];
1472
1473 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1474 if( ret != 0 )
1475 return( ret );
1476
1477 for( i = 0; i < 16; i++ )
1478 output[i] = tmp[i] ^ tweak[i];
1479
1480 /* Update the tweak for the next block. */
1481 mbedtls_gf128mul_x_ble( tweak, tweak );
1482
1483 output += 16;
1484 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001485 }
1486
Jaeden Amerod82cd862018-04-28 15:02:45 +01001487 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001488 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001489 /* If we are on the leftover bytes in a decrypt operation, we need to
1490 * use the previous tweak for these bytes (as saved in prev_tweak). */
1491 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001492
Jaeden Amerod82cd862018-04-28 15:02:45 +01001493 /* We are now on the final part of the data unit, which doesn't divide
1494 * evenly by 16. It's time for ciphertext stealing. */
1495 size_t i;
1496 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001497
Jaeden Amerod82cd862018-04-28 15:02:45 +01001498 /* Copy ciphertext bytes from the previous block to our output for each
1499 * byte of cyphertext we won't steal. At the same time, copy the
1500 * remainder of the input for this final round (since the loop bounds
1501 * are the same). */
1502 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001503 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001504 output[i] = prev_output[i];
1505 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001506 }
Aorimn5f778012016-06-09 23:22:58 +02001507
Jaeden Amerod82cd862018-04-28 15:02:45 +01001508 /* Copy ciphertext bytes from the previous block for input in this
1509 * round. */
1510 for( ; i < 16; i++ )
1511 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001512
Jaeden Amerod82cd862018-04-28 15:02:45 +01001513 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1514 if( ret != 0 )
1515 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001516
Jaeden Amerod82cd862018-04-28 15:02:45 +01001517 /* Write the result back to the previous block, overriding the previous
1518 * output we copied. */
1519 for( i = 0; i < 16; i++ )
1520 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001521 }
1522
1523 return( 0 );
1524}
1525#endif /* MBEDTLS_CIPHER_MODE_XTS */
1526
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001527#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001528/*
1529 * AES-CFB128 buffer encryption/decryption
1530 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001531int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001532 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001533 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001534 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001535 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001536 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001537 unsigned char *output )
1538{
Paul Bakker27fdf462011-06-09 13:55:13 +00001539 int c;
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001540 size_t n;
1541
1542 AES_VALIDATE_RET( ctx != NULL );
1543 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1544 mode == MBEDTLS_AES_DECRYPT );
1545 AES_VALIDATE_RET( iv_off != NULL );
1546 AES_VALIDATE_RET( iv != NULL );
1547 AES_VALIDATE_RET( input != NULL );
1548 AES_VALIDATE_RET( output != NULL );
1549
1550 n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001551
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001552 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001553 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001555 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001556 {
1557 while( length-- )
1558 {
1559 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001561
1562 c = *input++;
1563 *output++ = (unsigned char)( c ^ iv[n] );
1564 iv[n] = (unsigned char) c;
1565
Paul Bakker66d5d072014-06-17 16:39:18 +02001566 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001567 }
1568 }
1569 else
1570 {
1571 while( length-- )
1572 {
1573 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001574 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001575
1576 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1577
Paul Bakker66d5d072014-06-17 16:39:18 +02001578 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001579 }
1580 }
1581
1582 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001583
1584 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001585}
Paul Bakker556efba2014-01-24 15:38:12 +01001586
1587/*
1588 * AES-CFB8 buffer encryption/decryption
1589 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001590int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Manuel Pégourié-Gonnardeb6d3962018-12-18 09:59:35 +01001591 int mode,
1592 size_t length,
1593 unsigned char iv[16],
1594 const unsigned char *input,
1595 unsigned char *output )
Paul Bakker556efba2014-01-24 15:38:12 +01001596{
1597 unsigned char c;
1598 unsigned char ov[17];
1599
Manuel Pégourié-Gonnard1677cca2018-12-13 10:27:13 +01001600 AES_VALIDATE_RET( ctx != NULL );
1601 AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT ||
1602 mode == MBEDTLS_AES_DECRYPT );
1603 AES_VALIDATE_RET( iv != NULL );
1604 AES_VALIDATE_RET( input != NULL );
1605 AES_VALIDATE_RET( output != NULL );
Paul Bakker556efba2014-01-24 15:38:12 +01001606 while( length-- )
1607 {
Teppo Järvelin91d79382019-10-02 09:09:31 +03001608 mbedtls_platform_memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001609 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001610
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001611 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001612 ov[16] = *input;
1613
1614 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001616 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001617 ov[16] = c;
1618
Teppo Järvelin91d79382019-10-02 09:09:31 +03001619 mbedtls_platform_memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001620 }
1621
1622 return( 0 );
1623}
Simon Butcher76a5b222018-04-22 22:57:27 +01001624#endif /* MBEDTLS_CIPHER_MODE_CFB */
1625
1626#if defined(MBEDTLS_CIPHER_MODE_OFB)
1627/*
1628 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1629 */
1630int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001631 size_t length,
1632 size_t *iv_off,
1633 unsigned char iv[16],
1634 const unsigned char *input,
1635 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001636{
Simon Butcherad4e4932018-04-29 00:43:47 +01001637 int ret = 0;
Manuel Pégourié-Gonnard8e41eb72018-12-13 11:00:56 +01001638 size_t n;
1639
1640 AES_VALIDATE_RET( ctx != NULL );
1641 AES_VALIDATE_RET( iv_off != NULL );
1642 AES_VALIDATE_RET( iv != NULL );
1643 AES_VALIDATE_RET( input != NULL );
1644 AES_VALIDATE_RET( output != NULL );
1645
1646 n = *iv_off;
Simon Butcher76a5b222018-04-22 22:57:27 +01001647
Manuel Pégourié-Gonnarde55e1032018-12-18 12:09:02 +01001648 if( n > 15 )
Manuel Pégourié-Gonnard5b89c092018-12-18 10:03:30 +01001649 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1650
Simon Butcher76a5b222018-04-22 22:57:27 +01001651 while( length-- )
1652 {
1653 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001654 {
1655 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1656 if( ret != 0 )
1657 goto exit;
1658 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001659 *output++ = *input++ ^ iv[n];
1660
1661 n = ( n + 1 ) & 0x0F;
1662 }
1663
1664 *iv_off = n;
1665
Simon Butcherad4e4932018-04-29 00:43:47 +01001666exit:
1667 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001668}
1669#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001670
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001671#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001672/*
1673 * AES-CTR buffer encryption/decryption
1674 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001675int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001676 size_t length,
1677 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001678 unsigned char nonce_counter[16],
1679 unsigned char stream_block[16],
1680 const unsigned char *input,
1681 unsigned char *output )
1682{
Paul Bakker369e14b2012-04-18 14:16:09 +00001683 int c, i;
Manuel Pégourié-Gonnard2bc535b2018-12-13 11:08:36 +01001684 size_t n;
1685
1686 AES_VALIDATE_RET( ctx != NULL );
1687 AES_VALIDATE_RET( nc_off != NULL );
1688 AES_VALIDATE_RET( nonce_counter != NULL );
1689 AES_VALIDATE_RET( stream_block != NULL );
1690 AES_VALIDATE_RET( input != NULL );
1691 AES_VALIDATE_RET( output != NULL );
1692
1693 n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001694
Arto Kinnunen75439012019-12-03 14:12:10 +02001695 if( n > 0x0F )
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001696 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1697
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001698 while( length-- )
1699 {
1700 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001701 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001702
Paul Bakker369e14b2012-04-18 14:16:09 +00001703 for( i = 16; i > 0; i-- )
1704 if( ++nonce_counter[i - 1] != 0 )
1705 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001706 }
1707 c = *input++;
1708 *output++ = (unsigned char)( c ^ stream_block[n] );
1709
Paul Bakker66d5d072014-06-17 16:39:18 +02001710 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001711 }
1712
1713 *nc_off = n;
1714
1715 return( 0 );
1716}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001718
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001719#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001720
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001721#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001722/*
1723 * AES test vectors from:
1724 *
1725 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1726 */
1727static const unsigned char aes_test_ecb_dec[3][16] =
1728{
1729 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1730 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1731 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1732 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1733 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1734 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1735};
1736
1737static const unsigned char aes_test_ecb_enc[3][16] =
1738{
1739 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1740 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1741 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1742 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1743 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1744 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1745};
1746
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001747#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001748static const unsigned char aes_test_cbc_dec[3][16] =
1749{
1750 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1751 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1752 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1753 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1754 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1755 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1756};
1757
1758static const unsigned char aes_test_cbc_enc[3][16] =
1759{
1760 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1761 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1762 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1763 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1764 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1765 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1766};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001767#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001769#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001770/*
1771 * AES-CFB128 test vectors from:
1772 *
1773 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1774 */
1775static const unsigned char aes_test_cfb128_key[3][32] =
1776{
1777 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1778 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1779 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1780 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1781 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1782 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1783 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1784 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1785 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1786};
1787
1788static const unsigned char aes_test_cfb128_iv[16] =
1789{
1790 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1791 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1792};
1793
1794static const unsigned char aes_test_cfb128_pt[64] =
1795{
1796 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1797 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1798 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1799 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1800 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1801 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1802 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1803 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1804};
1805
1806static const unsigned char aes_test_cfb128_ct[3][64] =
1807{
1808 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1809 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1810 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1811 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1812 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1813 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1814 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1815 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1816 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1817 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1818 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1819 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1820 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1821 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1822 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1823 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1824 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1825 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1826 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1827 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1828 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1829 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1830 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1831 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1832};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001833#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001834
Simon Butcherad4e4932018-04-29 00:43:47 +01001835#if defined(MBEDTLS_CIPHER_MODE_OFB)
1836/*
1837 * AES-OFB test vectors from:
1838 *
Simon Butcher5db13622018-06-04 22:11:25 +01001839 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001840 */
1841static const unsigned char aes_test_ofb_key[3][32] =
1842{
1843 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1844 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1845 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1846 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1847 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1848 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1849 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1850 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1851 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1852};
1853
1854static const unsigned char aes_test_ofb_iv[16] =
1855{
1856 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1857 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1858};
1859
1860static const unsigned char aes_test_ofb_pt[64] =
1861{
1862 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1863 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1864 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1865 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1866 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1867 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1868 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1869 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1870};
1871
1872static const unsigned char aes_test_ofb_ct[3][64] =
1873{
1874 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1875 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1876 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1877 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1878 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1879 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1880 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1881 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1882 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1883 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1884 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1885 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1886 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1887 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1888 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1889 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1890 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1891 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1892 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1893 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1894 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1895 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1896 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1897 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1898};
1899#endif /* MBEDTLS_CIPHER_MODE_OFB */
1900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001901#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001902/*
1903 * AES-CTR test vectors from:
1904 *
1905 * http://www.faqs.org/rfcs/rfc3686.html
1906 */
1907
1908static const unsigned char aes_test_ctr_key[3][16] =
1909{
1910 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1911 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1912 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1913 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1914 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1915 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1916};
1917
1918static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1919{
1920 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1922 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1923 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1924 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1925 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1926};
1927
1928static const unsigned char aes_test_ctr_pt[3][48] =
1929{
1930 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1931 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1932
1933 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1934 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1935 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1936 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1937
1938 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1939 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1940 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1941 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1942 0x20, 0x21, 0x22, 0x23 }
1943};
1944
1945static const unsigned char aes_test_ctr_ct[3][48] =
1946{
1947 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1948 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1949 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1950 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1951 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1952 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1953 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1954 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1955 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1956 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1957 0x25, 0xB2, 0x07, 0x2F }
1958};
1959
1960static const int aes_test_ctr_len[3] =
1961 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001962#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001963
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001964#if defined(MBEDTLS_CIPHER_MODE_XTS)
1965/*
1966 * AES-XTS test vectors from:
1967 *
1968 * IEEE P1619/D16 Annex B
1969 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1970 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1971 */
1972static const unsigned char aes_test_xts_key[][32] =
1973{
1974 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1975 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1978 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1979 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1980 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1981 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1982 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1983 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1984 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1985 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1986};
1987
1988static const unsigned char aes_test_xts_pt32[][32] =
1989{
1990 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1994 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1995 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1996 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1997 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1998 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1999 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2000 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2001 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
2002};
2003
2004static const unsigned char aes_test_xts_ct32[][32] =
2005{
2006 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
2007 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
2008 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
2009 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
2010 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
2011 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
2012 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
2013 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
2014 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
2015 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
2016 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
2017 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
2018};
2019
2020static const unsigned char aes_test_xts_data_unit[][16] =
2021{
2022 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2023 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2024 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2026 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
2027 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
2028};
2029
2030#endif /* MBEDTLS_CIPHER_MODE_XTS */
2031
Paul Bakker5121ce52009-01-03 21:22:43 +00002032/*
2033 * Checkup routine
2034 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002035int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00002036{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002037 int ret = 0, i, j, u, mode;
2038 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00002039 unsigned char key[32];
2040 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002041 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002042#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002043 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03002044#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02002046 unsigned char prv[16];
2047#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01002048#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
2049 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00002050 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00002051#endif
Simon Butcher66a89032018-06-15 18:20:29 +01002052#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00002053 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01002054#endif
2055#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002056 unsigned char nonce_counter[16];
2057 unsigned char stream_block[16];
2058#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002059 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00002060
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002061 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002062 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00002063
2064 /*
2065 * ECB mode
2066 */
2067 for( i = 0; i < 6; i++ )
2068 {
2069 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002070 keybits = 128 + u * 64;
2071 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002072
2073 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002074 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
2075 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002076
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002077#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2078 if( keybits > 128 )
2079 {
2080 mbedtls_printf( "skipped\n" );
2081 continue;
2082 }
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002083#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
2084
2085#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2086 if( mode == MBEDTLS_AES_DECRYPT )
2087 {
2088 mbedtls_printf( "skipped\n" );
2089 continue;
2090 }
2091#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002092
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002093 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002094
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002095 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002096 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002097 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2098 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002099 }
2100 else
2101 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002102 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2103 aes_tests = aes_test_ecb_enc[u];
2104 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002105
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002106 /*
2107 * AES-192 is an optional feature that may be unavailable when
2108 * there is an alternative underlying implementation i.e. when
2109 * MBEDTLS_AES_ALT is defined.
2110 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002111 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002112 {
2113 mbedtls_printf( "skipped\n" );
2114 continue;
2115 }
2116 else if( ret != 0 )
2117 {
2118 goto exit;
2119 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002120
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002121 for( j = 0; j < 10000; j++ )
2122 {
2123 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
2124 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002125 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002126 }
2127
2128 if( memcmp( buf, aes_tests, 16 ) != 0 )
2129 {
2130 ret = 1;
2131 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002132 }
2133
2134 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002135 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002136 }
2137
2138 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002139 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002141#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00002142 /*
2143 * CBC mode
2144 */
2145 for( i = 0; i < 6; i++ )
2146 {
2147 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002148 keybits = 128 + u * 64;
2149 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002150
2151 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002152 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
2153 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002154
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002155#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2156 if( keybits > 128 )
2157 {
2158 mbedtls_printf( "skipped\n" );
2159 continue;
2160 }
2161#endif
2162
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002163#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2164 if( mode == MBEDTLS_AES_DECRYPT )
2165 {
2166 mbedtls_printf( "skipped\n" );
2167 continue;
2168 }
2169#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2170
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002171 memset( iv , 0, 16 );
2172 memset( prv, 0, 16 );
2173 memset( buf, 0, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002174
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002175 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002176 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002177 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
2178 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00002179 }
2180 else
2181 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002182 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2183 aes_tests = aes_test_cbc_enc[u];
2184 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002185
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002186 /*
2187 * AES-192 is an optional feature that may be unavailable when
2188 * there is an alternative underlying implementation i.e. when
2189 * MBEDTLS_AES_ALT is defined.
2190 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002191 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002192 {
2193 mbedtls_printf( "skipped\n" );
2194 continue;
2195 }
2196 else if( ret != 0 )
2197 {
2198 goto exit;
2199 }
2200
2201 for( j = 0; j < 10000; j++ )
2202 {
2203 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002204 {
2205 unsigned char tmp[16];
2206
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002207 memcpy( tmp, prv, 16 );
2208 memcpy( prv, buf, 16 );
2209 memcpy( buf, tmp, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002210 }
2211
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002212 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
2213 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002214 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002215
2216 }
2217
2218 if( memcmp( buf, aes_tests, 16 ) != 0 )
2219 {
2220 ret = 1;
2221 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002222 }
2223
2224 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002225 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002226 }
2227
2228 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002229 mbedtls_printf( "\n" );
2230#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00002231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00002233 /*
2234 * CFB128 mode
2235 */
2236 for( i = 0; i < 6; i++ )
2237 {
2238 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002239 keybits = 128 + u * 64;
2240 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002241
2242 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002243 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
2244 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002245
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002246#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2247 if( keybits > 128 )
2248 {
2249 mbedtls_printf( "skipped\n" );
2250 continue;
2251 }
2252#endif
2253
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002254#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2255 if( mode == MBEDTLS_AES_DECRYPT )
2256 {
2257 mbedtls_printf( "skipped\n" );
2258 continue;
2259 }
2260#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2261
Paul Bakker5121ce52009-01-03 21:22:43 +00002262 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002263 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002264
2265 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002266 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01002267 /*
2268 * AES-192 is an optional feature that may be unavailable when
2269 * there is an alternative underlying implementation i.e. when
2270 * MBEDTLS_AES_ALT is defined.
2271 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002272 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002273 {
2274 mbedtls_printf( "skipped\n" );
2275 continue;
2276 }
2277 else if( ret != 0 )
2278 {
2279 goto exit;
2280 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002281
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002282 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002283 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002284 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002285 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002286 }
2287 else
2288 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002289 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002290 aes_tests = aes_test_cfb128_ct[u];
2291 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002292
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002293 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
2294 if( ret != 0 )
2295 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002296
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002297 if( memcmp( buf, aes_tests, 64 ) != 0 )
2298 {
2299 ret = 1;
2300 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002301 }
2302
2303 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002304 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00002305 }
2306
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002307 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002308 mbedtls_printf( "\n" );
2309#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002310
Simon Butcherad4e4932018-04-29 00:43:47 +01002311#if defined(MBEDTLS_CIPHER_MODE_OFB)
2312 /*
2313 * OFB mode
2314 */
2315 for( i = 0; i < 6; i++ )
2316 {
2317 u = i >> 1;
2318 keybits = 128 + u * 64;
2319 mode = i & 1;
2320
2321 if( verbose != 0 )
2322 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
2323 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2324
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002325#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2326 if( keybits > 128 )
2327 {
2328 mbedtls_printf( "skipped\n" );
2329 continue;
2330 }
2331#endif
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002332
2333#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2334 if( mode == MBEDTLS_AES_DECRYPT )
2335 {
2336 mbedtls_printf( "skipped\n" );
2337 continue;
2338 }
2339#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2340
Simon Butcherad4e4932018-04-29 00:43:47 +01002341 memcpy( iv, aes_test_ofb_iv, 16 );
2342 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
2343
2344 offset = 0;
2345 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
2346 /*
2347 * AES-192 is an optional feature that may be unavailable when
2348 * there is an alternative underlying implementation i.e. when
2349 * MBEDTLS_AES_ALT is defined.
2350 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03002351 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01002352 {
2353 mbedtls_printf( "skipped\n" );
2354 continue;
2355 }
2356 else if( ret != 0 )
2357 {
2358 goto exit;
2359 }
2360
2361 if( mode == MBEDTLS_AES_DECRYPT )
2362 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002363 memcpy( buf, aes_test_ofb_ct[u], 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002364 aes_tests = aes_test_ofb_pt;
2365 }
2366 else
2367 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002368 memcpy( buf, aes_test_ofb_pt, 64 );
Simon Butcherad4e4932018-04-29 00:43:47 +01002369 aes_tests = aes_test_ofb_ct[u];
2370 }
2371
2372 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
2373 if( ret != 0 )
2374 goto exit;
2375
2376 if( memcmp( buf, aes_tests, 64 ) != 0 )
2377 {
2378 ret = 1;
2379 goto exit;
2380 }
2381
2382 if( verbose != 0 )
2383 mbedtls_printf( "passed\n" );
2384 }
2385
2386 if( verbose != 0 )
2387 mbedtls_printf( "\n" );
2388#endif /* MBEDTLS_CIPHER_MODE_OFB */
2389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002390#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002391 /*
2392 * CTR mode
2393 */
2394 for( i = 0; i < 6; i++ )
2395 {
2396 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002397 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002398
2399 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002401 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002402
Arto Kinnunen77b9cfc2019-08-30 11:43:21 +03002403#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
2404 if( keybits > 128 )
2405 {
2406 mbedtls_printf( "skipped\n" );
2407 continue;
2408 }
2409#endif
2410
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002411#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2412 if( mode == MBEDTLS_AES_DECRYPT )
2413 {
2414 mbedtls_printf( "skipped\n" );
2415 continue;
2416 }
2417#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2418
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002419 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2420 memcpy( key, aes_test_ctr_key[u], 16 );
2421
2422 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002423 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2424 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002425
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002426 len = aes_test_ctr_len[u];
2427
2428 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002429 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002430 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002431 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002432 }
2433 else
2434 {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002435 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002436 aes_tests = aes_test_ctr_ct[u];
2437 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002438
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002439 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2440 stream_block, buf, buf );
2441 if( ret != 0 )
2442 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002443
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002444 if( memcmp( buf, aes_tests, len ) != 0 )
2445 {
2446 ret = 1;
2447 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002448 }
2449
2450 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002451 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002452 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002453
2454 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002455 mbedtls_printf( "\n" );
2456#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002457
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002458#if defined(MBEDTLS_CIPHER_MODE_XTS)
2459 {
2460 static const int num_tests =
2461 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2462 mbedtls_aes_xts_context ctx_xts;
2463
2464 /*
2465 * XTS mode
2466 */
2467 mbedtls_aes_xts_init( &ctx_xts );
2468
2469 for( i = 0; i < num_tests << 1; i++ )
2470 {
2471 const unsigned char *data_unit;
2472 u = i >> 1;
2473 mode = i & 1;
2474
2475 if( verbose != 0 )
2476 mbedtls_printf( " AES-XTS-128 (%s): ",
2477 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2478
Arto Kinnunenc0a8bd42019-10-16 14:23:14 +03002479#if defined(MBEDTLS_AES_ONLY_ENCRYPT)
2480 if( mode == MBEDTLS_AES_DECRYPT )
2481 {
2482 mbedtls_printf( "skipped\n" );
2483 continue;
2484 }
2485#endif /* MBEDTLS_AES_ONLY_ENCRYPT */
2486
Teppo Järvelind49d2b62019-10-30 13:48:12 +02002487 memset( key, 0, sizeof( key ) );
2488 memcpy( key, aes_test_xts_key[u], 32 );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002489 data_unit = aes_test_xts_data_unit[u];
2490
2491 len = sizeof( *aes_test_xts_ct32 );
2492
2493 if( mode == MBEDTLS_AES_DECRYPT )
2494 {
2495 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2496 if( ret != 0)
2497 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002498 memcpy( buf, aes_test_xts_ct32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002499 aes_tests = aes_test_xts_pt32[u];
2500 }
2501 else
2502 {
2503 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2504 if( ret != 0)
2505 goto exit;
Teppo Järvelinb5c46712019-10-04 13:35:55 +03002506 memcpy( buf, aes_test_xts_pt32[u], len );
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002507 aes_tests = aes_test_xts_ct32[u];
2508 }
2509
2510
2511 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2512 buf, buf );
2513 if( ret != 0 )
2514 goto exit;
2515
2516 if( memcmp( buf, aes_tests, len ) != 0 )
2517 {
2518 ret = 1;
2519 goto exit;
2520 }
2521
2522 if( verbose != 0 )
2523 mbedtls_printf( "passed\n" );
2524 }
2525
2526 if( verbose != 0 )
2527 mbedtls_printf( "\n" );
2528
2529 mbedtls_aes_xts_free( &ctx_xts );
2530 }
2531#endif /* MBEDTLS_CIPHER_MODE_XTS */
2532
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002533 ret = 0;
2534
2535exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002536 if( ret != 0 && verbose != 0 )
2537 mbedtls_printf( "failed\n" );
2538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002539 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002540
2541 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002542}
2543
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002544#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002546#endif /* MBEDTLS_AES_C */