blob: 7a364a0f606eef7533b514c148a975a0ea69359f [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
Paul Bakker5121ce52009-01-03 21:22:43 +000059/*
60 * 32-bit integer manipulation macros (little endian)
61 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000062#ifndef GET_UINT32_LE
63#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000064{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000065 (n) = ( (uint32_t) (b)[(i) ] ) \
66 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
67 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
68 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000069}
70#endif
71
Paul Bakker5c2364c2012-10-01 14:41:15 +000072#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000073#define PUT_UINT32_LE(n,b,i) \
74{ \
75 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
76 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
77 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
78 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000079}
80#endif
81
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082#if defined(MBEDTLS_PADLOCK_C) && \
83 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +000084static int aes_padlock_ace = -1;
85#endif
86
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000088/*
89 * Forward S-box
90 */
91static const unsigned char FSb[256] =
92{
93 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
94 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
95 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
96 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
97 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
98 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
99 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
100 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
101 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
102 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
103 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
104 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
105 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
106 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
107 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
108 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
109 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
110 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
111 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
112 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
113 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
114 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
115 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
116 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
117 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
118 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
119 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
120 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
121 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
122 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
123 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
124 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
125};
126
127/*
128 * Forward tables
129 */
130#define FT \
131\
132 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
133 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
134 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
135 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
136 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
137 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
138 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
139 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
140 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
141 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
142 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
143 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
144 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
145 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
146 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
147 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
148 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
149 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
150 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
151 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
152 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
153 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
154 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
155 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
156 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
157 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
158 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
159 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
160 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
161 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
162 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
163 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
164 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
165 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
166 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
167 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
168 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
169 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
170 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
171 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
172 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
173 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
174 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
175 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
176 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
177 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
178 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
179 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
180 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
181 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
182 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
183 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
184 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
185 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
186 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
187 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
188 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
189 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
190 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
191 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
192 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
193 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
194 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
195 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
196
197#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000198static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000199#undef V
200
Hanno Beckerad049a92017-06-19 16:31:54 +0100201#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200202
Paul Bakker5121ce52009-01-03 21:22:43 +0000203#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000204static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000205#undef V
206
207#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000208static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000209#undef V
210
211#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000212static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000213#undef V
214
Hanno Becker177d3cf2017-06-07 15:52:48 +0100215#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200216
Paul Bakker5121ce52009-01-03 21:22:43 +0000217#undef FT
218
219/*
220 * Reverse S-box
221 */
222static const unsigned char RSb[256] =
223{
224 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
225 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
226 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
227 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
228 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
229 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
230 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
231 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
232 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
233 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
234 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
235 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
236 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
237 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
238 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
239 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
240 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
241 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
242 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
243 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
244 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
245 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
246 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
247 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
248 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
249 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
250 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
251 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
252 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
253 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
254 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
255 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
256};
257
258/*
259 * Reverse tables
260 */
261#define RT \
262\
263 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
264 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
265 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
266 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
267 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
268 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
269 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
270 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
271 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
272 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
273 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
274 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
275 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
276 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
277 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
278 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
279 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
280 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
281 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
282 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
283 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
284 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
285 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
286 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
287 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
288 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
289 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
290 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
291 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
292 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
293 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
294 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
295 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
296 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
297 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
298 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
299 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
300 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
301 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
302 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
303 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
304 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
305 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
306 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
307 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
308 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
309 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
310 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
311 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
312 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
313 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
314 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
315 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
316 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
317 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
318 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
319 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
320 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
321 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
322 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
323 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
324 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
325 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
326 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
327
328#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000329static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000330#undef V
331
Hanno Beckerad049a92017-06-19 16:31:54 +0100332#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200333
Paul Bakker5121ce52009-01-03 21:22:43 +0000334#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000335static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000336#undef V
337
338#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000339static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000340#undef V
341
342#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000343static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000344#undef V
345
Hanno Becker177d3cf2017-06-07 15:52:48 +0100346#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200347
Paul Bakker5121ce52009-01-03 21:22:43 +0000348#undef RT
349
350/*
351 * Round constants
352 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000354{
355 0x00000001, 0x00000002, 0x00000004, 0x00000008,
356 0x00000010, 0x00000020, 0x00000040, 0x00000080,
357 0x0000001B, 0x00000036
358};
359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
362/*
363 * Forward S-box & tables
364 */
365static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200366static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100367#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200368static uint32_t FT1[256];
369static uint32_t FT2[256];
370static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100371#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000372
373/*
374 * Reverse S-box & tables
375 */
376static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000377static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100378#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000379static uint32_t RT1[256];
380static uint32_t RT2[256];
381static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100382#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384/*
385 * Round constants
386 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000387static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
389/*
390 * Tables generation code
391 */
392#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
393#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
394#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
395
396static int aes_init_done = 0;
397
398static void aes_gen_tables( void )
399{
400 int i, x, y, z;
401 int pow[256];
402 int log[256];
403
404 /*
405 * compute pow and log tables over GF(2^8)
406 */
407 for( i = 0, x = 1; i < 256; i++ )
408 {
409 pow[i] = x;
410 log[x] = i;
411 x = ( x ^ XTIME( x ) ) & 0xFF;
412 }
413
414 /*
415 * calculate the round constants
416 */
417 for( i = 0, x = 1; i < 10; i++ )
418 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000419 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000420 x = XTIME( x ) & 0xFF;
421 }
422
423 /*
424 * generate the forward and reverse S-boxes
425 */
426 FSb[0x00] = 0x63;
427 RSb[0x63] = 0x00;
428
429 for( i = 1; i < 256; i++ )
430 {
431 x = pow[255 - log[i]];
432
Paul Bakker66d5d072014-06-17 16:39:18 +0200433 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
434 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
435 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
436 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000437 x ^= y ^ 0x63;
438
439 FSb[i] = (unsigned char) x;
440 RSb[x] = (unsigned char) i;
441 }
442
443 /*
444 * generate the forward and reverse tables
445 */
446 for( i = 0; i < 256; i++ )
447 {
448 x = FSb[i];
449 y = XTIME( x ) & 0xFF;
450 z = ( y ^ x ) & 0xFF;
451
Paul Bakker5c2364c2012-10-01 14:41:15 +0000452 FT0[i] = ( (uint32_t) y ) ^
453 ( (uint32_t) x << 8 ) ^
454 ( (uint32_t) x << 16 ) ^
455 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000456
Hanno Beckerad049a92017-06-19 16:31:54 +0100457#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000458 FT1[i] = ROTL8( FT0[i] );
459 FT2[i] = ROTL8( FT1[i] );
460 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100461#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000462
463 x = RSb[i];
464
Paul Bakker5c2364c2012-10-01 14:41:15 +0000465 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
466 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
467 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
468 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000469
Hanno Beckerad049a92017-06-19 16:31:54 +0100470#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000471 RT1[i] = ROTL8( RT0[i] );
472 RT2[i] = ROTL8( RT1[i] );
473 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100474#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000475 }
476}
477
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200478#undef ROTL8
479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200480#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000481
Hanno Beckerad049a92017-06-19 16:31:54 +0100482#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200483
484#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
485#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
486#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
487
488#define AES_RT0(idx) RT0[idx]
489#define AES_RT1(idx) ROTL8( RT0[idx] )
490#define AES_RT2(idx) ROTL16( RT0[idx] )
491#define AES_RT3(idx) ROTL24( RT0[idx] )
492
493#define AES_FT0(idx) FT0[idx]
494#define AES_FT1(idx) ROTL8( FT0[idx] )
495#define AES_FT2(idx) ROTL16( FT0[idx] )
496#define AES_FT3(idx) ROTL24( FT0[idx] )
497
Hanno Becker177d3cf2017-06-07 15:52:48 +0100498#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200499
500#define AES_RT0(idx) RT0[idx]
501#define AES_RT1(idx) RT1[idx]
502#define AES_RT2(idx) RT2[idx]
503#define AES_RT3(idx) RT3[idx]
504
505#define AES_FT0(idx) FT0[idx]
506#define AES_FT1(idx) FT1[idx]
507#define AES_FT2(idx) FT2[idx]
508#define AES_FT3(idx) FT3[idx]
509
Hanno Becker177d3cf2017-06-07 15:52:48 +0100510#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200511
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200512void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200513{
Simon Butcher5201e412018-12-06 17:40:14 +0000514 MBEDTLS_AES_VALIDATE( ctx != NULL );
515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200517}
518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200520{
521 if( ctx == NULL )
522 return;
523
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500524 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200525}
526
Jaeden Amero9366feb2018-05-29 18:55:17 +0100527#if defined(MBEDTLS_CIPHER_MODE_XTS)
528void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
529{
Simon Butcher5201e412018-12-06 17:40:14 +0000530 MBEDTLS_AES_VALIDATE( ctx != NULL );
531
Jaeden Amero9366feb2018-05-29 18:55:17 +0100532 mbedtls_aes_init( &ctx->crypt );
533 mbedtls_aes_init( &ctx->tweak );
534}
535
536void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
537{
Simon Butcher5201e412018-12-06 17:40:14 +0000538 MBEDTLS_AES_VALIDATE( ctx != NULL );
539
Jaeden Amero9366feb2018-05-29 18:55:17 +0100540 mbedtls_aes_free( &ctx->crypt );
541 mbedtls_aes_free( &ctx->tweak );
542}
543#endif /* MBEDTLS_CIPHER_MODE_XTS */
544
Paul Bakker5121ce52009-01-03 21:22:43 +0000545/*
546 * AES key schedule (encryption)
547 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200548#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200550 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000551{
Paul Bakker23986e52011-04-24 08:57:21 +0000552 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000553 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000554
Simon Butcher5201e412018-12-06 17:40:14 +0000555 MBEDTLS_AES_VALIDATE_RET( ctx != NULL && key != NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200557 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000558 {
559 case 128: ctx->nr = 10; break;
560 case 192: ctx->nr = 12; break;
561 case 256: ctx->nr = 14; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000563 }
564
Simon Butcher5201e412018-12-06 17:40:14 +0000565#if !defined(MBEDTLS_AES_ROM_TABLES)
566 if( aes_init_done == 0 )
567 {
568 aes_gen_tables();
569 aes_init_done = 1;
570
571 }
572#endif
573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000575 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100576 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000577
578 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000580 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000581#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000582 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000583
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200584#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100585 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200586 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100587#endif
588
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200589 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000590 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000591 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000592 }
593
594 switch( ctx->nr )
595 {
596 case 10:
597
598 for( i = 0; i < 10; i++, RK += 4 )
599 {
600 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000601 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
602 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
603 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
604 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000605
606 RK[5] = RK[1] ^ RK[4];
607 RK[6] = RK[2] ^ RK[5];
608 RK[7] = RK[3] ^ RK[6];
609 }
610 break;
611
612 case 12:
613
614 for( i = 0; i < 8; i++, RK += 6 )
615 {
616 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000617 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
618 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
619 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
620 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000621
622 RK[7] = RK[1] ^ RK[6];
623 RK[8] = RK[2] ^ RK[7];
624 RK[9] = RK[3] ^ RK[8];
625 RK[10] = RK[4] ^ RK[9];
626 RK[11] = RK[5] ^ RK[10];
627 }
628 break;
629
630 case 14:
631
632 for( i = 0; i < 7; i++, RK += 8 )
633 {
634 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000635 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
636 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
637 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
638 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000639
640 RK[9] = RK[1] ^ RK[8];
641 RK[10] = RK[2] ^ RK[9];
642 RK[11] = RK[3] ^ RK[10];
643
644 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000645 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
646 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
647 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
648 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
650 RK[13] = RK[5] ^ RK[12];
651 RK[14] = RK[6] ^ RK[13];
652 RK[15] = RK[7] ^ RK[14];
653 }
654 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000655 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000656
657 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000658}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200659#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000660
661/*
662 * AES key schedule (decryption)
663 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200664#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200666 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000667{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200668 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000670 uint32_t *RK;
671 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200672
Simon Butcher5201e412018-12-06 17:40:14 +0000673 MBEDTLS_AES_VALIDATE_RET( ctx != NULL && key != NULL );
674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000678 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100679 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000680
681 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000683 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000684#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000685 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000686
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200687 /* Also checks keybits */
688 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200689 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000690
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200691 ctx->nr = cty.nr;
692
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200693#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100694 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100695 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200696 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100697 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200698 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100699 }
700#endif
701
Paul Bakker5121ce52009-01-03 21:22:43 +0000702 SK = cty.rk + cty.nr * 4;
703
704 *RK++ = *SK++;
705 *RK++ = *SK++;
706 *RK++ = *SK++;
707 *RK++ = *SK++;
708
709 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
710 {
711 for( j = 0; j < 4; j++, SK++ )
712 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200713 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
714 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
715 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
716 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000717 }
718 }
719
720 *RK++ = *SK++;
721 *RK++ = *SK++;
722 *RK++ = *SK++;
723 *RK++ = *SK++;
724
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200725exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000727
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200728 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000729}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100730
731#if defined(MBEDTLS_CIPHER_MODE_XTS)
732static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
733 unsigned int keybits,
734 const unsigned char **key1,
735 unsigned int *key1bits,
736 const unsigned char **key2,
737 unsigned int *key2bits )
738{
739 const unsigned int half_keybits = keybits / 2;
740 const unsigned int half_keybytes = half_keybits / 8;
741
742 switch( keybits )
743 {
744 case 256: break;
745 case 512: break;
746 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
747 }
748
749 *key1bits = half_keybits;
750 *key2bits = half_keybits;
751 *key1 = &key[0];
752 *key2 = &key[half_keybytes];
753
754 return 0;
755}
756
757int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
758 const unsigned char *key,
759 unsigned int keybits)
760{
761 int ret;
762 const unsigned char *key1, *key2;
763 unsigned int key1bits, key2bits;
764
765 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
766 &key2, &key2bits );
767 if( ret != 0 )
768 return( ret );
769
770 /* Set the tweak key. Always set tweak key for the encryption mode. */
771 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
772 if( ret != 0 )
773 return( ret );
774
775 /* Set crypt key for encryption. */
776 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
777}
778
779int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
780 const unsigned char *key,
781 unsigned int keybits)
782{
783 int ret;
784 const unsigned char *key1, *key2;
785 unsigned int key1bits, key2bits;
786
787 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
788 &key2, &key2bits );
789 if( ret != 0 )
790 return( ret );
791
792 /* Set the tweak key. Always set tweak key for encryption. */
793 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
794 if( ret != 0 )
795 return( ret );
796
797 /* Set crypt key for decryption. */
798 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
799}
800#endif /* MBEDTLS_CIPHER_MODE_XTS */
801
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200802#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000803
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200804#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
805{ \
806 X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \
807 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \
808 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \
809 AES_FT3( ( Y3 >> 24 ) & 0xFF ); \
810 \
811 X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \
812 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \
813 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \
814 AES_FT3( ( Y0 >> 24 ) & 0xFF ); \
815 \
816 X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \
817 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \
818 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \
819 AES_FT3( ( Y1 >> 24 ) & 0xFF ); \
820 \
821 X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \
822 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \
823 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \
824 AES_FT3( ( Y2 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000825}
826
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200827#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
828{ \
829 X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \
830 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \
831 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \
832 AES_RT3( ( Y1 >> 24 ) & 0xFF ); \
833 \
834 X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \
835 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \
836 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \
837 AES_RT3( ( Y2 >> 24 ) & 0xFF ); \
838 \
839 X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \
840 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \
841 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \
842 AES_RT3( ( Y3 >> 24 ) & 0xFF ); \
843 \
844 X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \
845 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \
846 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \
847 AES_RT3( ( Y0 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000848}
849
850/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200851 * AES-ECB block encryption
852 */
853#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000854int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
855 const unsigned char input[16],
856 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200857{
858 int i;
859 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
860
861 RK = ctx->rk;
862
863 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
864 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
865 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
866 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
867
868 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
869 {
870 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
871 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
872 }
873
874 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
875
876 X0 = *RK++ ^ \
877 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
878 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
879 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
880 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
881
882 X1 = *RK++ ^ \
883 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
884 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
885 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
886 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
887
888 X2 = *RK++ ^ \
889 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
890 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
891 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
892 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
893
894 X3 = *RK++ ^ \
895 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
896 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
897 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
898 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
899
900 PUT_UINT32_LE( X0, output, 0 );
901 PUT_UINT32_LE( X1, output, 4 );
902 PUT_UINT32_LE( X2, output, 8 );
903 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000904
905 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200906}
907#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
908
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100909#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100910void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
911 const unsigned char input[16],
912 unsigned char output[16] )
913{
914 mbedtls_internal_aes_encrypt( ctx, input, output );
915}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100916#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100917
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200918/*
919 * AES-ECB block decryption
920 */
921#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000922int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
923 const unsigned char input[16],
924 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200925{
926 int i;
927 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
928
929 RK = ctx->rk;
930
931 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
932 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
933 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
934 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
935
936 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
937 {
938 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
939 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
940 }
941
942 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
943
944 X0 = *RK++ ^ \
945 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
946 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
947 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
948 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
949
950 X1 = *RK++ ^ \
951 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
952 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
953 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
954 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
955
956 X2 = *RK++ ^ \
957 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
958 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
959 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
960 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
961
962 X3 = *RK++ ^ \
963 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
964 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
965 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
966 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
967
968 PUT_UINT32_LE( X0, output, 0 );
969 PUT_UINT32_LE( X1, output, 4 );
970 PUT_UINT32_LE( X2, output, 8 );
971 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000972
973 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200974}
975#endif /* !MBEDTLS_AES_DECRYPT_ALT */
976
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100977#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100978void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
979 const unsigned char input[16],
980 unsigned char output[16] )
981{
982 mbedtls_internal_aes_decrypt( ctx, input, output );
983}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100984#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100985
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200986/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000987 * AES-ECB block encryption/decryption
988 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000990 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000991 const unsigned char input[16],
Paul Bakker5121ce52009-01-03 21:22:43 +0000992 unsigned char output[16] )
993{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100995 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +0100997#endif
998
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200999#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001000 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001001 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001003 return( 0 );
1004
1005 // If padlock data misaligned, we just fall back to
1006 // unaccelerated mode
1007 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001008 }
1009#endif
1010
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001011 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001012 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001013 else
Andres AGf5bf7182017-03-03 14:09:56 +00001014 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001015}
1016
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001017#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001018/*
1019 * AES-CBC buffer encryption/decryption
1020 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001022 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001023 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001024 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001025 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001026 unsigned char *output )
1027{
1028 int i;
1029 unsigned char temp[16];
1030
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001031 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001035 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001036 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001038 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001039
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001040 // If padlock data misaligned, we just fall back to
1041 // unaccelerated mode
1042 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001043 }
1044#endif
1045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001047 {
1048 while( length > 0 )
1049 {
1050 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001051 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001052
1053 for( i = 0; i < 16; i++ )
1054 output[i] = (unsigned char)( output[i] ^ iv[i] );
1055
1056 memcpy( iv, temp, 16 );
1057
1058 input += 16;
1059 output += 16;
1060 length -= 16;
1061 }
1062 }
1063 else
1064 {
1065 while( length > 0 )
1066 {
1067 for( i = 0; i < 16; i++ )
1068 output[i] = (unsigned char)( input[i] ^ iv[i] );
1069
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001070 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001071 memcpy( iv, output, 16 );
1072
1073 input += 16;
1074 output += 16;
1075 length -= 16;
1076 }
1077 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001078
1079 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001080}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001082
Aorimn5f778012016-06-09 23:22:58 +02001083#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001084
1085/* Endianess with 64 bits values */
1086#ifndef GET_UINT64_LE
1087#define GET_UINT64_LE(n,b,i) \
1088{ \
1089 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1090 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1091 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1092 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1093 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1094 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1095 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1096 | ( (uint64_t) (b)[(i) ] ); \
1097}
1098#endif
1099
1100#ifndef PUT_UINT64_LE
1101#define PUT_UINT64_LE(n,b,i) \
1102{ \
1103 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1104 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1105 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1106 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1107 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1108 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1109 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1110 (b)[(i) ] = (unsigned char) ( (n) ); \
1111}
1112#endif
1113
1114typedef unsigned char mbedtls_be128[16];
1115
1116/*
1117 * GF(2^128) multiplication function
1118 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001119 * This function multiplies a field element by x in the polynomial field
1120 * representation. It uses 64-bit word operations to gain speed but compensates
1121 * for machine endianess and hence works correctly on both big and little
1122 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001123 */
1124static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001125 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001126{
1127 uint64_t a, b, ra, rb;
1128
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001129 GET_UINT64_LE( a, x, 0 );
1130 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001131
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001132 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1133 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001134
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001135 PUT_UINT64_LE( ra, r, 0 );
1136 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001137}
1138
Aorimn5f778012016-06-09 23:22:58 +02001139/*
1140 * AES-XTS buffer encryption/decryption
1141 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001142int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1143 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001144 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001145 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001146 const unsigned char *input,
1147 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001148{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001149 int ret;
1150 size_t blocks = length / 16;
1151 size_t leftover = length % 16;
1152 unsigned char tweak[16];
1153 unsigned char prev_tweak[16];
1154 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001155
Jaeden Amero8381fcb2018-10-11 12:06:15 +01001156 /* Data units must be at least 16 bytes long. */
Aorimn5f778012016-06-09 23:22:58 +02001157 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001158 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001159
Jaeden Ameroa74faba2018-10-11 12:07:43 +01001160 /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001161 if( length > ( 1 << 20 ) * 16 )
1162 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001163
Jaeden Amerod82cd862018-04-28 15:02:45 +01001164 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001165 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1166 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001167 if( ret != 0 )
1168 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001169
Jaeden Amerod82cd862018-04-28 15:02:45 +01001170 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001171 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001172 size_t i;
1173
1174 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1175 {
1176 /* We are on the last block in a decrypt operation that has
1177 * leftover bytes, so we need to use the next tweak for this block,
1178 * and this tweak for the lefover bytes. Save the current tweak for
1179 * the leftovers and then update the current tweak for use on this,
1180 * the last full block. */
1181 memcpy( prev_tweak, tweak, sizeof( tweak ) );
1182 mbedtls_gf128mul_x_ble( tweak, tweak );
1183 }
1184
1185 for( i = 0; i < 16; i++ )
1186 tmp[i] = input[i] ^ tweak[i];
1187
1188 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1189 if( ret != 0 )
1190 return( ret );
1191
1192 for( i = 0; i < 16; i++ )
1193 output[i] = tmp[i] ^ tweak[i];
1194
1195 /* Update the tweak for the next block. */
1196 mbedtls_gf128mul_x_ble( tweak, tweak );
1197
1198 output += 16;
1199 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001200 }
1201
Jaeden Amerod82cd862018-04-28 15:02:45 +01001202 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001203 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001204 /* If we are on the leftover bytes in a decrypt operation, we need to
1205 * use the previous tweak for these bytes (as saved in prev_tweak). */
1206 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001207
Jaeden Amerod82cd862018-04-28 15:02:45 +01001208 /* We are now on the final part of the data unit, which doesn't divide
1209 * evenly by 16. It's time for ciphertext stealing. */
1210 size_t i;
1211 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001212
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213 /* Copy ciphertext bytes from the previous block to our output for each
1214 * byte of cyphertext we won't steal. At the same time, copy the
1215 * remainder of the input for this final round (since the loop bounds
1216 * are the same). */
1217 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001218 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001219 output[i] = prev_output[i];
1220 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001221 }
Aorimn5f778012016-06-09 23:22:58 +02001222
Jaeden Amerod82cd862018-04-28 15:02:45 +01001223 /* Copy ciphertext bytes from the previous block for input in this
1224 * round. */
1225 for( ; i < 16; i++ )
1226 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001227
Jaeden Amerod82cd862018-04-28 15:02:45 +01001228 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1229 if( ret != 0 )
1230 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001231
Jaeden Amerod82cd862018-04-28 15:02:45 +01001232 /* Write the result back to the previous block, overriding the previous
1233 * output we copied. */
1234 for( i = 0; i < 16; i++ )
1235 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001236 }
1237
1238 return( 0 );
1239}
1240#endif /* MBEDTLS_CIPHER_MODE_XTS */
1241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001243/*
1244 * AES-CFB128 buffer encryption/decryption
1245 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001247 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001248 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001249 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001250 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001251 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001252 unsigned char *output )
1253{
Paul Bakker27fdf462011-06-09 13:55:13 +00001254 int c;
1255 size_t n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001256
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001257 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001258 {
1259 while( length-- )
1260 {
1261 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001263
1264 c = *input++;
1265 *output++ = (unsigned char)( c ^ iv[n] );
1266 iv[n] = (unsigned char) c;
1267
Paul Bakker66d5d072014-06-17 16:39:18 +02001268 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001269 }
1270 }
1271 else
1272 {
1273 while( length-- )
1274 {
1275 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001277
1278 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1279
Paul Bakker66d5d072014-06-17 16:39:18 +02001280 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001281 }
1282 }
1283
1284 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001285
1286 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001287}
Paul Bakker556efba2014-01-24 15:38:12 +01001288
1289/*
1290 * AES-CFB8 buffer encryption/decryption
1291 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001292int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Paul Bakker556efba2014-01-24 15:38:12 +01001293 int mode,
1294 size_t length,
1295 unsigned char iv[16],
1296 const unsigned char *input,
1297 unsigned char *output )
1298{
1299 unsigned char c;
1300 unsigned char ov[17];
1301
1302 while( length-- )
1303 {
Paul Bakker66d5d072014-06-17 16:39:18 +02001304 memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001305 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001306
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001307 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001308 ov[16] = *input;
1309
1310 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001312 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001313 ov[16] = c;
1314
Paul Bakker66d5d072014-06-17 16:39:18 +02001315 memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001316 }
1317
1318 return( 0 );
1319}
Simon Butcher76a5b222018-04-22 22:57:27 +01001320#endif /* MBEDTLS_CIPHER_MODE_CFB */
1321
1322#if defined(MBEDTLS_CIPHER_MODE_OFB)
1323/*
1324 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1325 */
1326int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001327 size_t length,
1328 size_t *iv_off,
1329 unsigned char iv[16],
1330 const unsigned char *input,
1331 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001332{
Simon Butcherad4e4932018-04-29 00:43:47 +01001333 int ret = 0;
Simon Butcher76a5b222018-04-22 22:57:27 +01001334 size_t n = *iv_off;
1335
1336 while( length-- )
1337 {
1338 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001339 {
1340 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1341 if( ret != 0 )
1342 goto exit;
1343 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001344 *output++ = *input++ ^ iv[n];
1345
1346 n = ( n + 1 ) & 0x0F;
1347 }
1348
1349 *iv_off = n;
1350
Simon Butcherad4e4932018-04-29 00:43:47 +01001351exit:
1352 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001353}
1354#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001356#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001357/*
1358 * AES-CTR buffer encryption/decryption
1359 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001360int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001361 size_t length,
1362 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001363 unsigned char nonce_counter[16],
1364 unsigned char stream_block[16],
1365 const unsigned char *input,
1366 unsigned char *output )
1367{
Paul Bakker369e14b2012-04-18 14:16:09 +00001368 int c, i;
Paul Bakker27fdf462011-06-09 13:55:13 +00001369 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001370
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001371 if ( n > 0x0F )
1372 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1373
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001374 while( length-- )
1375 {
1376 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001377 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001378
Paul Bakker369e14b2012-04-18 14:16:09 +00001379 for( i = 16; i > 0; i-- )
1380 if( ++nonce_counter[i - 1] != 0 )
1381 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001382 }
1383 c = *input++;
1384 *output++ = (unsigned char)( c ^ stream_block[n] );
1385
Paul Bakker66d5d072014-06-17 16:39:18 +02001386 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001387 }
1388
1389 *nc_off = n;
1390
1391 return( 0 );
1392}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001395#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001397#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001398/*
1399 * AES test vectors from:
1400 *
1401 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1402 */
1403static const unsigned char aes_test_ecb_dec[3][16] =
1404{
1405 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1406 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1407 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1408 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1409 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1410 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1411};
1412
1413static const unsigned char aes_test_ecb_enc[3][16] =
1414{
1415 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1416 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1417 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1418 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1419 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1420 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1421};
1422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001424static const unsigned char aes_test_cbc_dec[3][16] =
1425{
1426 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1427 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1428 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1429 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1430 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1431 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1432};
1433
1434static const unsigned char aes_test_cbc_enc[3][16] =
1435{
1436 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1437 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1438 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1439 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1440 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1441 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1442};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001445#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001446/*
1447 * AES-CFB128 test vectors from:
1448 *
1449 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1450 */
1451static const unsigned char aes_test_cfb128_key[3][32] =
1452{
1453 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1454 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1455 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1456 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1457 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1458 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1459 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1460 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1461 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1462};
1463
1464static const unsigned char aes_test_cfb128_iv[16] =
1465{
1466 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1467 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1468};
1469
1470static const unsigned char aes_test_cfb128_pt[64] =
1471{
1472 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1473 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1474 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1475 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1476 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1477 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1478 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1479 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1480};
1481
1482static const unsigned char aes_test_cfb128_ct[3][64] =
1483{
1484 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1485 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1486 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1487 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1488 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1489 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1490 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1491 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1492 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1493 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1494 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1495 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1496 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1497 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1498 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1499 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1500 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1501 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1502 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1503 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1504 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1505 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1506 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1507 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1508};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001509#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001510
Simon Butcherad4e4932018-04-29 00:43:47 +01001511#if defined(MBEDTLS_CIPHER_MODE_OFB)
1512/*
1513 * AES-OFB test vectors from:
1514 *
Simon Butcher5db13622018-06-04 22:11:25 +01001515 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001516 */
1517static const unsigned char aes_test_ofb_key[3][32] =
1518{
1519 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1520 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1521 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1522 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1523 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1524 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1525 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1526 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1527 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1528};
1529
1530static const unsigned char aes_test_ofb_iv[16] =
1531{
1532 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1533 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1534};
1535
1536static const unsigned char aes_test_ofb_pt[64] =
1537{
1538 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1539 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1540 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1541 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1542 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1543 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1544 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1545 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1546};
1547
1548static const unsigned char aes_test_ofb_ct[3][64] =
1549{
1550 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1551 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1552 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1553 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1554 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1555 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1556 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1557 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1558 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1559 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1560 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1561 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1562 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1563 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1564 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1565 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1566 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1567 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1568 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1569 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1570 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1571 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1572 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1573 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1574};
1575#endif /* MBEDTLS_CIPHER_MODE_OFB */
1576
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001577#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001578/*
1579 * AES-CTR test vectors from:
1580 *
1581 * http://www.faqs.org/rfcs/rfc3686.html
1582 */
1583
1584static const unsigned char aes_test_ctr_key[3][16] =
1585{
1586 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1587 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1588 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1589 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1590 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1591 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1592};
1593
1594static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1595{
1596 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1598 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1599 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1600 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1601 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1602};
1603
1604static const unsigned char aes_test_ctr_pt[3][48] =
1605{
1606 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1607 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1608
1609 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1610 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1611 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1612 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1613
1614 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1615 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1616 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1617 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1618 0x20, 0x21, 0x22, 0x23 }
1619};
1620
1621static const unsigned char aes_test_ctr_ct[3][48] =
1622{
1623 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1624 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1625 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1626 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1627 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1628 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1629 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1630 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1631 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1632 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1633 0x25, 0xB2, 0x07, 0x2F }
1634};
1635
1636static const int aes_test_ctr_len[3] =
1637 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001638#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001639
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001640#if defined(MBEDTLS_CIPHER_MODE_XTS)
1641/*
1642 * AES-XTS test vectors from:
1643 *
1644 * IEEE P1619/D16 Annex B
1645 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1646 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1647 */
1648static const unsigned char aes_test_xts_key[][32] =
1649{
1650 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1654 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1655 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1656 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1657 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1658 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1659 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1660 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1661 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1662};
1663
1664static const unsigned char aes_test_xts_pt32[][32] =
1665{
1666 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1668 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1670 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1671 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1672 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1673 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1674 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1675 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1676 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1677 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1678};
1679
1680static const unsigned char aes_test_xts_ct32[][32] =
1681{
1682 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1683 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1684 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1685 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1686 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1687 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1688 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1689 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1690 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1691 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1692 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1693 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1694};
1695
1696static const unsigned char aes_test_xts_data_unit[][16] =
1697{
1698 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1700 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1702 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1704};
1705
1706#endif /* MBEDTLS_CIPHER_MODE_XTS */
1707
Paul Bakker5121ce52009-01-03 21:22:43 +00001708/*
1709 * Checkup routine
1710 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001711int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00001712{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001713 int ret = 0, i, j, u, mode;
1714 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001715 unsigned char key[32];
1716 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001717 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001718#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001719 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001720#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001721#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001722 unsigned char prv[16];
1723#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001724#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1725 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001726 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001727#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001728#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001729 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001730#endif
1731#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001732 unsigned char nonce_counter[16];
1733 unsigned char stream_block[16];
1734#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001735 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001736
1737 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001738 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00001739
1740 /*
1741 * ECB mode
1742 */
1743 for( i = 0; i < 6; i++ )
1744 {
1745 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001746 keybits = 128 + u * 64;
1747 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001748
1749 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001750 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
1751 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001752
1753 memset( buf, 0, 16 );
1754
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001755 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001756 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001757 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1758 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001759 }
1760 else
1761 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001762 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1763 aes_tests = aes_test_ecb_enc[u];
1764 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001765
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001766 /*
1767 * AES-192 is an optional feature that may be unavailable when
1768 * there is an alternative underlying implementation i.e. when
1769 * MBEDTLS_AES_ALT is defined.
1770 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001771 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001772 {
1773 mbedtls_printf( "skipped\n" );
1774 continue;
1775 }
1776 else if( ret != 0 )
1777 {
1778 goto exit;
1779 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001780
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001781 for( j = 0; j < 10000; j++ )
1782 {
1783 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
1784 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001785 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001786 }
1787
1788 if( memcmp( buf, aes_tests, 16 ) != 0 )
1789 {
1790 ret = 1;
1791 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 }
1793
1794 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001795 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001796 }
1797
1798 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001799 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001802 /*
1803 * CBC mode
1804 */
1805 for( i = 0; i < 6; i++ )
1806 {
1807 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001808 keybits = 128 + u * 64;
1809 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001810
1811 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001812 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
1813 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001814
1815 memset( iv , 0, 16 );
1816 memset( prv, 0, 16 );
1817 memset( buf, 0, 16 );
1818
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001819 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001820 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001821 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1822 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001823 }
1824 else
1825 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001826 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1827 aes_tests = aes_test_cbc_enc[u];
1828 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001829
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001830 /*
1831 * AES-192 is an optional feature that may be unavailable when
1832 * there is an alternative underlying implementation i.e. when
1833 * MBEDTLS_AES_ALT is defined.
1834 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001835 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001836 {
1837 mbedtls_printf( "skipped\n" );
1838 continue;
1839 }
1840 else if( ret != 0 )
1841 {
1842 goto exit;
1843 }
1844
1845 for( j = 0; j < 10000; j++ )
1846 {
1847 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001848 {
1849 unsigned char tmp[16];
1850
Paul Bakker5121ce52009-01-03 21:22:43 +00001851 memcpy( tmp, prv, 16 );
1852 memcpy( prv, buf, 16 );
1853 memcpy( buf, tmp, 16 );
1854 }
1855
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001856 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
1857 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001858 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001859
1860 }
1861
1862 if( memcmp( buf, aes_tests, 16 ) != 0 )
1863 {
1864 ret = 1;
1865 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001866 }
1867
1868 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001869 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001870 }
1871
1872 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001873 mbedtls_printf( "\n" );
1874#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001876#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001877 /*
1878 * CFB128 mode
1879 */
1880 for( i = 0; i < 6; i++ )
1881 {
1882 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001883 keybits = 128 + u * 64;
1884 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001885
1886 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001887 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
1888 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001889
1890 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001891 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001892
1893 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001894 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001895 /*
1896 * AES-192 is an optional feature that may be unavailable when
1897 * there is an alternative underlying implementation i.e. when
1898 * MBEDTLS_AES_ALT is defined.
1899 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001900 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001901 {
1902 mbedtls_printf( "skipped\n" );
1903 continue;
1904 }
1905 else if( ret != 0 )
1906 {
1907 goto exit;
1908 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001909
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001910 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001911 {
1912 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001913 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001914 }
1915 else
1916 {
1917 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001918 aes_tests = aes_test_cfb128_ct[u];
1919 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001920
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001921 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
1922 if( ret != 0 )
1923 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001924
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001925 if( memcmp( buf, aes_tests, 64 ) != 0 )
1926 {
1927 ret = 1;
1928 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001929 }
1930
1931 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001932 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001933 }
1934
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001935 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001936 mbedtls_printf( "\n" );
1937#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001938
Simon Butcherad4e4932018-04-29 00:43:47 +01001939#if defined(MBEDTLS_CIPHER_MODE_OFB)
1940 /*
1941 * OFB mode
1942 */
1943 for( i = 0; i < 6; i++ )
1944 {
1945 u = i >> 1;
1946 keybits = 128 + u * 64;
1947 mode = i & 1;
1948
1949 if( verbose != 0 )
1950 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
1951 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
1952
1953 memcpy( iv, aes_test_ofb_iv, 16 );
1954 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
1955
1956 offset = 0;
1957 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1958 /*
1959 * AES-192 is an optional feature that may be unavailable when
1960 * there is an alternative underlying implementation i.e. when
1961 * MBEDTLS_AES_ALT is defined.
1962 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001963 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001964 {
1965 mbedtls_printf( "skipped\n" );
1966 continue;
1967 }
1968 else if( ret != 0 )
1969 {
1970 goto exit;
1971 }
1972
1973 if( mode == MBEDTLS_AES_DECRYPT )
1974 {
1975 memcpy( buf, aes_test_ofb_ct[u], 64 );
1976 aes_tests = aes_test_ofb_pt;
1977 }
1978 else
1979 {
1980 memcpy( buf, aes_test_ofb_pt, 64 );
1981 aes_tests = aes_test_ofb_ct[u];
1982 }
1983
1984 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
1985 if( ret != 0 )
1986 goto exit;
1987
1988 if( memcmp( buf, aes_tests, 64 ) != 0 )
1989 {
1990 ret = 1;
1991 goto exit;
1992 }
1993
1994 if( verbose != 0 )
1995 mbedtls_printf( "passed\n" );
1996 }
1997
1998 if( verbose != 0 )
1999 mbedtls_printf( "\n" );
2000#endif /* MBEDTLS_CIPHER_MODE_OFB */
2001
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002002#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002003 /*
2004 * CTR mode
2005 */
2006 for( i = 0; i < 6; i++ )
2007 {
2008 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002009 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002010
2011 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002012 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002013 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002014
2015 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2016 memcpy( key, aes_test_ctr_key[u], 16 );
2017
2018 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002019 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2020 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002021
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002022 len = aes_test_ctr_len[u];
2023
2024 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002025 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002026 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002027 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002028 }
2029 else
2030 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002031 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002032 aes_tests = aes_test_ctr_ct[u];
2033 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002034
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002035 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2036 stream_block, buf, buf );
2037 if( ret != 0 )
2038 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002039
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002040 if( memcmp( buf, aes_tests, len ) != 0 )
2041 {
2042 ret = 1;
2043 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002044 }
2045
2046 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002047 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002048 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002049
2050 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002051 mbedtls_printf( "\n" );
2052#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002053
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002054#if defined(MBEDTLS_CIPHER_MODE_XTS)
2055 {
2056 static const int num_tests =
2057 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2058 mbedtls_aes_xts_context ctx_xts;
2059
2060 /*
2061 * XTS mode
2062 */
2063 mbedtls_aes_xts_init( &ctx_xts );
2064
2065 for( i = 0; i < num_tests << 1; i++ )
2066 {
2067 const unsigned char *data_unit;
2068 u = i >> 1;
2069 mode = i & 1;
2070
2071 if( verbose != 0 )
2072 mbedtls_printf( " AES-XTS-128 (%s): ",
2073 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2074
2075 memset( key, 0, sizeof( key ) );
2076 memcpy( key, aes_test_xts_key[u], 32 );
2077 data_unit = aes_test_xts_data_unit[u];
2078
2079 len = sizeof( *aes_test_xts_ct32 );
2080
2081 if( mode == MBEDTLS_AES_DECRYPT )
2082 {
2083 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2084 if( ret != 0)
2085 goto exit;
2086 memcpy( buf, aes_test_xts_ct32[u], len );
2087 aes_tests = aes_test_xts_pt32[u];
2088 }
2089 else
2090 {
2091 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2092 if( ret != 0)
2093 goto exit;
2094 memcpy( buf, aes_test_xts_pt32[u], len );
2095 aes_tests = aes_test_xts_ct32[u];
2096 }
2097
2098
2099 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2100 buf, buf );
2101 if( ret != 0 )
2102 goto exit;
2103
2104 if( memcmp( buf, aes_tests, len ) != 0 )
2105 {
2106 ret = 1;
2107 goto exit;
2108 }
2109
2110 if( verbose != 0 )
2111 mbedtls_printf( "passed\n" );
2112 }
2113
2114 if( verbose != 0 )
2115 mbedtls_printf( "\n" );
2116
2117 mbedtls_aes_xts_free( &ctx_xts );
2118 }
2119#endif /* MBEDTLS_CIPHER_MODE_XTS */
2120
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002121 ret = 0;
2122
2123exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002124 if( ret != 0 && verbose != 0 )
2125 mbedtls_printf( "failed\n" );
2126
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002127 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002128
2129 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002130}
2131
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002132#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002134#endif /* MBEDTLS_AES_C */