blob: eab9043b27f7745ee56cc22dc613b0f5a5121da3 [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{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200515}
516
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200517void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200518{
519 if( ctx == NULL )
520 return;
521
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500522 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200523}
524
Jaeden Amero9366feb2018-05-29 18:55:17 +0100525#if defined(MBEDTLS_CIPHER_MODE_XTS)
526void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
527{
528 mbedtls_aes_init( &ctx->crypt );
529 mbedtls_aes_init( &ctx->tweak );
530}
531
532void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
533{
534 mbedtls_aes_free( &ctx->crypt );
535 mbedtls_aes_free( &ctx->tweak );
536}
537#endif /* MBEDTLS_CIPHER_MODE_XTS */
538
Paul Bakker5121ce52009-01-03 21:22:43 +0000539/*
540 * AES key schedule (encryption)
541 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200542#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200543int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200544 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000545{
Paul Bakker23986e52011-04-24 08:57:21 +0000546 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000547 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549#if !defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000550 if( aes_init_done == 0 )
551 {
552 aes_gen_tables();
553 aes_init_done = 1;
Paul Bakker048d04e2012-02-12 17:31:04 +0000554
Paul Bakker5121ce52009-01-03 21:22:43 +0000555 }
556#endif
557
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200558 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000559 {
560 case 128: ctx->nr = 10; break;
561 case 192: ctx->nr = 12; break;
562 case 256: ctx->nr = 14; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200563 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000564 }
565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000567 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100568 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000569
570 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200571 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000572 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000573#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000574 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100577 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200578 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100579#endif
580
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200581 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000582 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000583 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000584 }
585
586 switch( ctx->nr )
587 {
588 case 10:
589
590 for( i = 0; i < 10; i++, RK += 4 )
591 {
592 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000593 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
594 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
595 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
596 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000597
598 RK[5] = RK[1] ^ RK[4];
599 RK[6] = RK[2] ^ RK[5];
600 RK[7] = RK[3] ^ RK[6];
601 }
602 break;
603
604 case 12:
605
606 for( i = 0; i < 8; i++, RK += 6 )
607 {
608 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000609 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
610 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
611 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
612 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000613
614 RK[7] = RK[1] ^ RK[6];
615 RK[8] = RK[2] ^ RK[7];
616 RK[9] = RK[3] ^ RK[8];
617 RK[10] = RK[4] ^ RK[9];
618 RK[11] = RK[5] ^ RK[10];
619 }
620 break;
621
622 case 14:
623
624 for( i = 0; i < 7; i++, RK += 8 )
625 {
626 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000627 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
628 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
629 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
630 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000631
632 RK[9] = RK[1] ^ RK[8];
633 RK[10] = RK[2] ^ RK[9];
634 RK[11] = RK[3] ^ RK[10];
635
636 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000637 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
638 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
639 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
640 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 RK[13] = RK[5] ^ RK[12];
643 RK[14] = RK[6] ^ RK[13];
644 RK[15] = RK[7] ^ RK[14];
645 }
646 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000647 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000648
649 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000650}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200651#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000652
653/*
654 * AES key schedule (decryption)
655 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200656#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200658 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000659{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200660 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000662 uint32_t *RK;
663 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200664
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000666
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000668 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100669 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000670
671 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000673 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000674#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000675 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000676
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200677 /* Also checks keybits */
678 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200679 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000680
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200681 ctx->nr = cty.nr;
682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100684 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100685 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100687 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200688 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100689 }
690#endif
691
Paul Bakker5121ce52009-01-03 21:22:43 +0000692 SK = cty.rk + cty.nr * 4;
693
694 *RK++ = *SK++;
695 *RK++ = *SK++;
696 *RK++ = *SK++;
697 *RK++ = *SK++;
698
699 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
700 {
701 for( j = 0; j < 4; j++, SK++ )
702 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200703 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
704 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
705 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
706 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000707 }
708 }
709
710 *RK++ = *SK++;
711 *RK++ = *SK++;
712 *RK++ = *SK++;
713 *RK++ = *SK++;
714
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200715exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000717
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200718 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000719}
Jaeden Amero9366feb2018-05-29 18:55:17 +0100720
721#if defined(MBEDTLS_CIPHER_MODE_XTS)
722static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
723 unsigned int keybits,
724 const unsigned char **key1,
725 unsigned int *key1bits,
726 const unsigned char **key2,
727 unsigned int *key2bits )
728{
729 const unsigned int half_keybits = keybits / 2;
730 const unsigned int half_keybytes = half_keybits / 8;
731
732 switch( keybits )
733 {
734 case 256: break;
735 case 512: break;
736 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
737 }
738
739 *key1bits = half_keybits;
740 *key2bits = half_keybits;
741 *key1 = &key[0];
742 *key2 = &key[half_keybytes];
743
744 return 0;
745}
746
747int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
748 const unsigned char *key,
749 unsigned int keybits)
750{
751 int ret;
752 const unsigned char *key1, *key2;
753 unsigned int key1bits, key2bits;
754
755 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
756 &key2, &key2bits );
757 if( ret != 0 )
758 return( ret );
759
760 /* Set the tweak key. Always set tweak key for the encryption mode. */
761 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
762 if( ret != 0 )
763 return( ret );
764
765 /* Set crypt key for encryption. */
766 return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits );
767}
768
769int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
770 const unsigned char *key,
771 unsigned int keybits)
772{
773 int ret;
774 const unsigned char *key1, *key2;
775 unsigned int key1bits, key2bits;
776
777 ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits,
778 &key2, &key2bits );
779 if( ret != 0 )
780 return( ret );
781
782 /* Set the tweak key. Always set tweak key for encryption. */
783 ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits );
784 if( ret != 0 )
785 return( ret );
786
787 /* Set crypt key for decryption. */
788 return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits );
789}
790#endif /* MBEDTLS_CIPHER_MODE_XTS */
791
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200792#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000793
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200794#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
795{ \
796 X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \
797 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \
798 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \
799 AES_FT3( ( Y3 >> 24 ) & 0xFF ); \
800 \
801 X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \
802 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \
803 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \
804 AES_FT3( ( Y0 >> 24 ) & 0xFF ); \
805 \
806 X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \
807 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \
808 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \
809 AES_FT3( ( Y1 >> 24 ) & 0xFF ); \
810 \
811 X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \
812 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \
813 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \
814 AES_FT3( ( Y2 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000815}
816
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200817#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
818{ \
819 X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \
820 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \
821 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \
822 AES_RT3( ( Y1 >> 24 ) & 0xFF ); \
823 \
824 X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \
825 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \
826 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \
827 AES_RT3( ( Y2 >> 24 ) & 0xFF ); \
828 \
829 X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \
830 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \
831 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \
832 AES_RT3( ( Y3 >> 24 ) & 0xFF ); \
833 \
834 X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \
835 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \
836 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \
837 AES_RT3( ( Y0 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000838}
839
840/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200841 * AES-ECB block encryption
842 */
843#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000844int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
845 const unsigned char input[16],
846 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200847{
848 int i;
849 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
850
851 RK = ctx->rk;
852
853 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
854 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
855 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
856 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
857
858 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
859 {
860 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
861 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
862 }
863
864 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
865
866 X0 = *RK++ ^ \
867 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
868 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
869 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
870 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
871
872 X1 = *RK++ ^ \
873 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
874 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
875 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
876 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
877
878 X2 = *RK++ ^ \
879 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
880 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
881 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
882 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
883
884 X3 = *RK++ ^ \
885 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
886 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
887 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
888 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
889
890 PUT_UINT32_LE( X0, output, 0 );
891 PUT_UINT32_LE( X1, output, 4 );
892 PUT_UINT32_LE( X2, output, 8 );
893 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000894
895 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200896}
897#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
898
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100899#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100900void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
901 const unsigned char input[16],
902 unsigned char output[16] )
903{
904 mbedtls_internal_aes_encrypt( ctx, input, output );
905}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100906#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100907
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200908/*
909 * AES-ECB block decryption
910 */
911#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000912int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
913 const unsigned char input[16],
914 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200915{
916 int i;
917 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
918
919 RK = ctx->rk;
920
921 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
922 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
923 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
924 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
925
926 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
927 {
928 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
929 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
930 }
931
932 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
933
934 X0 = *RK++ ^ \
935 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
936 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
937 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
938 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
939
940 X1 = *RK++ ^ \
941 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
942 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
943 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
944 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
945
946 X2 = *RK++ ^ \
947 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
948 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
949 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
950 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
951
952 X3 = *RK++ ^ \
953 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
954 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
955 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
956 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
957
958 PUT_UINT32_LE( X0, output, 0 );
959 PUT_UINT32_LE( X1, output, 4 );
960 PUT_UINT32_LE( X2, output, 8 );
961 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000962
963 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200964}
965#endif /* !MBEDTLS_AES_DECRYPT_ALT */
966
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100967#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100968void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
969 const unsigned char input[16],
970 unsigned char output[16] )
971{
972 mbedtls_internal_aes_decrypt( ctx, input, output );
973}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100974#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100975
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200976/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000977 * AES-ECB block encryption/decryption
978 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000980 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000981 const unsigned char input[16],
Paul Bakker5121ce52009-01-03 21:22:43 +0000982 unsigned char output[16] )
983{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200984#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100985 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200986 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +0100987#endif
988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +0000990 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +0000991 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000993 return( 0 );
994
995 // If padlock data misaligned, we just fall back to
996 // unaccelerated mode
997 //
Paul Bakker5121ce52009-01-03 21:22:43 +0000998 }
999#endif
1000
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001001 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +00001002 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +02001003 else
Andres AGf5bf7182017-03-03 14:09:56 +00001004 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001005}
1006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001008/*
1009 * AES-CBC buffer encryption/decryption
1010 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001011int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001012 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001013 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +00001014 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001015 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001016 unsigned char *output )
1017{
1018 int i;
1019 unsigned char temp[16];
1020
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001021 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001024#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +00001025 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +00001026 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001028 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +02001029
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001030 // If padlock data misaligned, we just fall back to
1031 // unaccelerated mode
1032 //
Paul Bakker5121ce52009-01-03 21:22:43 +00001033 }
1034#endif
1035
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001037 {
1038 while( length > 0 )
1039 {
1040 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001042
1043 for( i = 0; i < 16; i++ )
1044 output[i] = (unsigned char)( output[i] ^ iv[i] );
1045
1046 memcpy( iv, temp, 16 );
1047
1048 input += 16;
1049 output += 16;
1050 length -= 16;
1051 }
1052 }
1053 else
1054 {
1055 while( length > 0 )
1056 {
1057 for( i = 0; i < 16; i++ )
1058 output[i] = (unsigned char)( input[i] ^ iv[i] );
1059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Paul Bakker5121ce52009-01-03 21:22:43 +00001061 memcpy( iv, output, 16 );
1062
1063 input += 16;
1064 output += 16;
1065 length -= 16;
1066 }
1067 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001068
1069 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001070}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001072
Aorimn5f778012016-06-09 23:22:58 +02001073#if defined(MBEDTLS_CIPHER_MODE_XTS)
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001074
1075/* Endianess with 64 bits values */
1076#ifndef GET_UINT64_LE
1077#define GET_UINT64_LE(n,b,i) \
1078{ \
1079 (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
1080 | ( (uint64_t) (b)[(i) + 6] << 48 ) \
1081 | ( (uint64_t) (b)[(i) + 5] << 40 ) \
1082 | ( (uint64_t) (b)[(i) + 4] << 32 ) \
1083 | ( (uint64_t) (b)[(i) + 3] << 24 ) \
1084 | ( (uint64_t) (b)[(i) + 2] << 16 ) \
1085 | ( (uint64_t) (b)[(i) + 1] << 8 ) \
1086 | ( (uint64_t) (b)[(i) ] ); \
1087}
1088#endif
1089
1090#ifndef PUT_UINT64_LE
1091#define PUT_UINT64_LE(n,b,i) \
1092{ \
1093 (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
1094 (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
1095 (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
1096 (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
1097 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
1098 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
1099 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
1100 (b)[(i) ] = (unsigned char) ( (n) ); \
1101}
1102#endif
1103
1104typedef unsigned char mbedtls_be128[16];
1105
1106/*
1107 * GF(2^128) multiplication function
1108 *
Jaeden Amero5f0b06a2018-05-31 09:23:32 +01001109 * This function multiplies a field element by x in the polynomial field
1110 * representation. It uses 64-bit word operations to gain speed but compensates
1111 * for machine endianess and hence works correctly on both big and little
1112 * endian machines.
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001113 */
1114static void mbedtls_gf128mul_x_ble( unsigned char r[16],
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001115 const unsigned char x[16] )
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001116{
1117 uint64_t a, b, ra, rb;
1118
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001119 GET_UINT64_LE( a, x, 0 );
1120 GET_UINT64_LE( b, x, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001121
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001122 ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) );
1123 rb = ( a >> 63 ) | ( b << 1 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001124
Jaeden Amero8cfc75f2018-05-31 16:53:08 +01001125 PUT_UINT64_LE( ra, r, 0 );
1126 PUT_UINT64_LE( rb, r, 8 );
Jaeden Amero010c2cb2018-05-29 17:00:47 +01001127}
1128
Aorimn5f778012016-06-09 23:22:58 +02001129/*
1130 * AES-XTS buffer encryption/decryption
1131 */
Jaeden Amero9366feb2018-05-29 18:55:17 +01001132int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
1133 int mode,
Jaeden Amero5162b932018-05-29 12:55:24 +01001134 size_t length,
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001135 const unsigned char data_unit[16],
Jaeden Amero9366feb2018-05-29 18:55:17 +01001136 const unsigned char *input,
1137 unsigned char *output )
Aorimn5f778012016-06-09 23:22:58 +02001138{
Jaeden Amerod82cd862018-04-28 15:02:45 +01001139 int ret;
1140 size_t blocks = length / 16;
1141 size_t leftover = length % 16;
1142 unsigned char tweak[16];
1143 unsigned char prev_tweak[16];
1144 unsigned char tmp[16];
Aorimn5f778012016-06-09 23:22:58 +02001145
Jaeden Amerod82cd862018-04-28 15:02:45 +01001146 /* Sectors must be at least 16 bytes. */
Aorimn5f778012016-06-09 23:22:58 +02001147 if( length < 16 )
Jaeden Amerod82cd862018-04-28 15:02:45 +01001148 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001149
Jaeden Amero0a8b0202018-05-30 15:36:06 +01001150 /* NIST SP 80-38E disallows data units larger than 2**20 blocks. */
1151 if( length > ( 1 << 20 ) * 16 )
1152 return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH;
Aorimn5f778012016-06-09 23:22:58 +02001153
Jaeden Amerod82cd862018-04-28 15:02:45 +01001154 /* Compute the tweak. */
Jaeden Amerocd9fc5e2018-05-30 15:23:24 +01001155 ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT,
1156 data_unit, tweak );
Jaeden Amerod82cd862018-04-28 15:02:45 +01001157 if( ret != 0 )
1158 return( ret );
Aorimn5f778012016-06-09 23:22:58 +02001159
Jaeden Amerod82cd862018-04-28 15:02:45 +01001160 while( blocks-- )
Aorimn5f778012016-06-09 23:22:58 +02001161 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001162 size_t i;
1163
1164 if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 )
1165 {
1166 /* We are on the last block in a decrypt operation that has
1167 * leftover bytes, so we need to use the next tweak for this block,
1168 * and this tweak for the lefover bytes. Save the current tweak for
1169 * the leftovers and then update the current tweak for use on this,
1170 * the last full block. */
1171 memcpy( prev_tweak, tweak, sizeof( tweak ) );
1172 mbedtls_gf128mul_x_ble( tweak, tweak );
1173 }
1174
1175 for( i = 0; i < 16; i++ )
1176 tmp[i] = input[i] ^ tweak[i];
1177
1178 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1179 if( ret != 0 )
1180 return( ret );
1181
1182 for( i = 0; i < 16; i++ )
1183 output[i] = tmp[i] ^ tweak[i];
1184
1185 /* Update the tweak for the next block. */
1186 mbedtls_gf128mul_x_ble( tweak, tweak );
1187
1188 output += 16;
1189 input += 16;
Aorimn5f778012016-06-09 23:22:58 +02001190 }
1191
Jaeden Amerod82cd862018-04-28 15:02:45 +01001192 if( leftover )
Aorimn5f778012016-06-09 23:22:58 +02001193 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001194 /* If we are on the leftover bytes in a decrypt operation, we need to
1195 * use the previous tweak for these bytes (as saved in prev_tweak). */
1196 unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak;
Aorimn5f778012016-06-09 23:22:58 +02001197
Jaeden Amerod82cd862018-04-28 15:02:45 +01001198 /* We are now on the final part of the data unit, which doesn't divide
1199 * evenly by 16. It's time for ciphertext stealing. */
1200 size_t i;
1201 unsigned char *prev_output = output - 16;
Aorimn5f778012016-06-09 23:22:58 +02001202
Jaeden Amerod82cd862018-04-28 15:02:45 +01001203 /* Copy ciphertext bytes from the previous block to our output for each
1204 * byte of cyphertext we won't steal. At the same time, copy the
1205 * remainder of the input for this final round (since the loop bounds
1206 * are the same). */
1207 for( i = 0; i < leftover; i++ )
Aorimn5f778012016-06-09 23:22:58 +02001208 {
Jaeden Amerod82cd862018-04-28 15:02:45 +01001209 output[i] = prev_output[i];
1210 tmp[i] = input[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001211 }
Aorimn5f778012016-06-09 23:22:58 +02001212
Jaeden Amerod82cd862018-04-28 15:02:45 +01001213 /* Copy ciphertext bytes from the previous block for input in this
1214 * round. */
1215 for( ; i < 16; i++ )
1216 tmp[i] = prev_output[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001217
Jaeden Amerod82cd862018-04-28 15:02:45 +01001218 ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp );
1219 if( ret != 0 )
1220 return ret;
Aorimn5f778012016-06-09 23:22:58 +02001221
Jaeden Amerod82cd862018-04-28 15:02:45 +01001222 /* Write the result back to the previous block, overriding the previous
1223 * output we copied. */
1224 for( i = 0; i < 16; i++ )
1225 prev_output[i] = tmp[i] ^ t[i];
Aorimn5f778012016-06-09 23:22:58 +02001226 }
1227
1228 return( 0 );
1229}
1230#endif /* MBEDTLS_CIPHER_MODE_XTS */
1231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001233/*
1234 * AES-CFB128 buffer encryption/decryption
1235 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001237 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001238 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001239 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001240 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001241 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001242 unsigned char *output )
1243{
Paul Bakker27fdf462011-06-09 13:55:13 +00001244 int c;
1245 size_t n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001247 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001248 {
1249 while( length-- )
1250 {
1251 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001252 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001253
1254 c = *input++;
1255 *output++ = (unsigned char)( c ^ iv[n] );
1256 iv[n] = (unsigned char) c;
1257
Paul Bakker66d5d072014-06-17 16:39:18 +02001258 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001259 }
1260 }
1261 else
1262 {
1263 while( length-- )
1264 {
1265 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001267
1268 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1269
Paul Bakker66d5d072014-06-17 16:39:18 +02001270 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001271 }
1272 }
1273
1274 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001275
1276 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001277}
Paul Bakker556efba2014-01-24 15:38:12 +01001278
1279/*
1280 * AES-CFB8 buffer encryption/decryption
1281 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001282int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Paul Bakker556efba2014-01-24 15:38:12 +01001283 int mode,
1284 size_t length,
1285 unsigned char iv[16],
1286 const unsigned char *input,
1287 unsigned char *output )
1288{
1289 unsigned char c;
1290 unsigned char ov[17];
1291
1292 while( length-- )
1293 {
Paul Bakker66d5d072014-06-17 16:39:18 +02001294 memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001295 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001297 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001298 ov[16] = *input;
1299
1300 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1301
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001302 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001303 ov[16] = c;
1304
Paul Bakker66d5d072014-06-17 16:39:18 +02001305 memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001306 }
1307
1308 return( 0 );
1309}
Simon Butcher76a5b222018-04-22 22:57:27 +01001310#endif /* MBEDTLS_CIPHER_MODE_CFB */
1311
1312#if defined(MBEDTLS_CIPHER_MODE_OFB)
1313/*
1314 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1315 */
1316int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001317 size_t length,
1318 size_t *iv_off,
1319 unsigned char iv[16],
1320 const unsigned char *input,
1321 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001322{
Simon Butcherad4e4932018-04-29 00:43:47 +01001323 int ret = 0;
Simon Butcher76a5b222018-04-22 22:57:27 +01001324 size_t n = *iv_off;
1325
1326 while( length-- )
1327 {
1328 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001329 {
1330 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1331 if( ret != 0 )
1332 goto exit;
1333 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001334 *output++ = *input++ ^ iv[n];
1335
1336 n = ( n + 1 ) & 0x0F;
1337 }
1338
1339 *iv_off = n;
1340
Simon Butcherad4e4932018-04-29 00:43:47 +01001341exit:
1342 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001343}
1344#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001346#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001347/*
1348 * AES-CTR buffer encryption/decryption
1349 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001351 size_t length,
1352 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001353 unsigned char nonce_counter[16],
1354 unsigned char stream_block[16],
1355 const unsigned char *input,
1356 unsigned char *output )
1357{
Paul Bakker369e14b2012-04-18 14:16:09 +00001358 int c, i;
Paul Bakker27fdf462011-06-09 13:55:13 +00001359 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001360
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001361 if ( n > 0x0F )
1362 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1363
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001364 while( length-- )
1365 {
1366 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001367 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001368
Paul Bakker369e14b2012-04-18 14:16:09 +00001369 for( i = 16; i > 0; i-- )
1370 if( ++nonce_counter[i - 1] != 0 )
1371 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001372 }
1373 c = *input++;
1374 *output++ = (unsigned char)( c ^ stream_block[n] );
1375
Paul Bakker66d5d072014-06-17 16:39:18 +02001376 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001377 }
1378
1379 *nc_off = n;
1380
1381 return( 0 );
1382}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001383#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001385#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001388/*
1389 * AES test vectors from:
1390 *
1391 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1392 */
1393static const unsigned char aes_test_ecb_dec[3][16] =
1394{
1395 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1396 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1397 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1398 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1399 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1400 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1401};
1402
1403static const unsigned char aes_test_ecb_enc[3][16] =
1404{
1405 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1406 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1407 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1408 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1409 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1410 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1411};
1412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001414static const unsigned char aes_test_cbc_dec[3][16] =
1415{
1416 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1417 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1418 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1419 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1420 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1421 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1422};
1423
1424static const unsigned char aes_test_cbc_enc[3][16] =
1425{
1426 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1427 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1428 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1429 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1430 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1431 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1432};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001434
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001435#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001436/*
1437 * AES-CFB128 test vectors from:
1438 *
1439 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1440 */
1441static const unsigned char aes_test_cfb128_key[3][32] =
1442{
1443 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1444 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1445 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1446 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1447 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1448 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1449 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1450 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1451 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1452};
1453
1454static const unsigned char aes_test_cfb128_iv[16] =
1455{
1456 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1457 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1458};
1459
1460static const unsigned char aes_test_cfb128_pt[64] =
1461{
1462 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1463 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1464 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1465 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1466 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1467 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1468 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1469 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1470};
1471
1472static const unsigned char aes_test_cfb128_ct[3][64] =
1473{
1474 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1475 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1476 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1477 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1478 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1479 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1480 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1481 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1482 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1483 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1484 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1485 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1486 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1487 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1488 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1489 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1490 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1491 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1492 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1493 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1494 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1495 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1496 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1497 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1498};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001499#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001500
Simon Butcherad4e4932018-04-29 00:43:47 +01001501#if defined(MBEDTLS_CIPHER_MODE_OFB)
1502/*
1503 * AES-OFB test vectors from:
1504 *
Simon Butcher5db13622018-06-04 22:11:25 +01001505 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001506 */
1507static const unsigned char aes_test_ofb_key[3][32] =
1508{
1509 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1510 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1511 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1512 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1513 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1514 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1515 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1516 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1517 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1518};
1519
1520static const unsigned char aes_test_ofb_iv[16] =
1521{
1522 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1523 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1524};
1525
1526static const unsigned char aes_test_ofb_pt[64] =
1527{
1528 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1529 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1530 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1531 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1532 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1533 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1534 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1535 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1536};
1537
1538static const unsigned char aes_test_ofb_ct[3][64] =
1539{
1540 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1541 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1542 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1543 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1544 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1545 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1546 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1547 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1548 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1549 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1550 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1551 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1552 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1553 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1554 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1555 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1556 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1557 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1558 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1559 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1560 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1561 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1562 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1563 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1564};
1565#endif /* MBEDTLS_CIPHER_MODE_OFB */
1566
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001567#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001568/*
1569 * AES-CTR test vectors from:
1570 *
1571 * http://www.faqs.org/rfcs/rfc3686.html
1572 */
1573
1574static const unsigned char aes_test_ctr_key[3][16] =
1575{
1576 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1577 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1578 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1579 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1580 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1581 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1582};
1583
1584static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1585{
1586 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1588 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1589 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1590 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1591 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1592};
1593
1594static const unsigned char aes_test_ctr_pt[3][48] =
1595{
1596 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1597 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1598
1599 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1600 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1601 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1602 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1603
1604 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1605 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1606 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1607 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1608 0x20, 0x21, 0x22, 0x23 }
1609};
1610
1611static const unsigned char aes_test_ctr_ct[3][48] =
1612{
1613 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1614 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1615 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1616 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1617 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1618 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1619 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1620 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1621 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1622 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1623 0x25, 0xB2, 0x07, 0x2F }
1624};
1625
1626static const int aes_test_ctr_len[3] =
1627 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001628#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001629
Jaeden Amero21d79cf2018-05-23 10:30:18 +01001630#if defined(MBEDTLS_CIPHER_MODE_XTS)
1631/*
1632 * AES-XTS test vectors from:
1633 *
1634 * IEEE P1619/D16 Annex B
1635 * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf
1636 * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf)
1637 */
1638static const unsigned char aes_test_xts_key[][32] =
1639{
1640 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1642 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1643 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1644 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1645 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
1646 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1647 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1648 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
1649 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
1650 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
1651 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
1652};
1653
1654static const unsigned char aes_test_xts_pt32[][32] =
1655{
1656 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1658 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1660 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1661 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1662 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1663 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1664 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1665 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1666 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
1667 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
1668};
1669
1670static const unsigned char aes_test_xts_ct32[][32] =
1671{
1672 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
1673 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
1674 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
1675 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
1676 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
1677 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
1678 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
1679 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
1680 { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
1681 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
1682 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
1683 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 },
1684};
1685
1686static const unsigned char aes_test_xts_data_unit[][16] =
1687{
1688 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1690 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1692 { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
1693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1694};
1695
1696#endif /* MBEDTLS_CIPHER_MODE_XTS */
1697
Paul Bakker5121ce52009-01-03 21:22:43 +00001698/*
1699 * Checkup routine
1700 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001701int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00001702{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001703 int ret = 0, i, j, u, mode;
1704 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001705 unsigned char key[32];
1706 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001707 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001708#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001709 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001710#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001711#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001712 unsigned char prv[16];
1713#endif
Simon Butcher2ff0e522018-06-14 09:57:07 +01001714#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
1715 defined(MBEDTLS_CIPHER_MODE_OFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001716 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001717#endif
Simon Butcher66a89032018-06-15 18:20:29 +01001718#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001719 int len;
Simon Butcher66a89032018-06-15 18:20:29 +01001720#endif
1721#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001722 unsigned char nonce_counter[16];
1723 unsigned char stream_block[16];
1724#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001725 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001726
1727 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001728 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00001729
1730 /*
1731 * ECB mode
1732 */
1733 for( i = 0; i < 6; i++ )
1734 {
1735 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001736 keybits = 128 + u * 64;
1737 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001738
1739 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001740 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
1741 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001742
1743 memset( buf, 0, 16 );
1744
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001745 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001746 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001747 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1748 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001749 }
1750 else
1751 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001752 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1753 aes_tests = aes_test_ecb_enc[u];
1754 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001755
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001756 /*
1757 * AES-192 is an optional feature that may be unavailable when
1758 * there is an alternative underlying implementation i.e. when
1759 * MBEDTLS_AES_ALT is defined.
1760 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001761 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001762 {
1763 mbedtls_printf( "skipped\n" );
1764 continue;
1765 }
1766 else if( ret != 0 )
1767 {
1768 goto exit;
1769 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001770
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001771 for( j = 0; j < 10000; j++ )
1772 {
1773 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
1774 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001775 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001776 }
1777
1778 if( memcmp( buf, aes_tests, 16 ) != 0 )
1779 {
1780 ret = 1;
1781 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001782 }
1783
1784 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001785 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001786 }
1787
1788 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001789 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001790
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001791#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 /*
1793 * CBC mode
1794 */
1795 for( i = 0; i < 6; i++ )
1796 {
1797 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001798 keybits = 128 + u * 64;
1799 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001800
1801 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001802 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
1803 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001804
1805 memset( iv , 0, 16 );
1806 memset( prv, 0, 16 );
1807 memset( buf, 0, 16 );
1808
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001809 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001810 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001811 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1812 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001813 }
1814 else
1815 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001816 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1817 aes_tests = aes_test_cbc_enc[u];
1818 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001820 /*
1821 * AES-192 is an optional feature that may be unavailable when
1822 * there is an alternative underlying implementation i.e. when
1823 * MBEDTLS_AES_ALT is defined.
1824 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001825 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001826 {
1827 mbedtls_printf( "skipped\n" );
1828 continue;
1829 }
1830 else if( ret != 0 )
1831 {
1832 goto exit;
1833 }
1834
1835 for( j = 0; j < 10000; j++ )
1836 {
1837 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001838 {
1839 unsigned char tmp[16];
1840
Paul Bakker5121ce52009-01-03 21:22:43 +00001841 memcpy( tmp, prv, 16 );
1842 memcpy( prv, buf, 16 );
1843 memcpy( buf, tmp, 16 );
1844 }
1845
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001846 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
1847 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001848 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001849
1850 }
1851
1852 if( memcmp( buf, aes_tests, 16 ) != 0 )
1853 {
1854 ret = 1;
1855 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001856 }
1857
1858 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001860 }
1861
1862 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001863 mbedtls_printf( "\n" );
1864#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001866#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001867 /*
1868 * CFB128 mode
1869 */
1870 for( i = 0; i < 6; i++ )
1871 {
1872 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001873 keybits = 128 + u * 64;
1874 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001875
1876 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001877 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
1878 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001879
1880 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001881 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001882
1883 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001884 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001885 /*
1886 * AES-192 is an optional feature that may be unavailable when
1887 * there is an alternative underlying implementation i.e. when
1888 * MBEDTLS_AES_ALT is defined.
1889 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001890 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001891 {
1892 mbedtls_printf( "skipped\n" );
1893 continue;
1894 }
1895 else if( ret != 0 )
1896 {
1897 goto exit;
1898 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001899
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001900 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001901 {
1902 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001903 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001904 }
1905 else
1906 {
1907 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001908 aes_tests = aes_test_cfb128_ct[u];
1909 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001910
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001911 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
1912 if( ret != 0 )
1913 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001914
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001915 if( memcmp( buf, aes_tests, 64 ) != 0 )
1916 {
1917 ret = 1;
1918 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001919 }
1920
1921 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001922 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001923 }
1924
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001925 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001926 mbedtls_printf( "\n" );
1927#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001928
Simon Butcherad4e4932018-04-29 00:43:47 +01001929#if defined(MBEDTLS_CIPHER_MODE_OFB)
1930 /*
1931 * OFB mode
1932 */
1933 for( i = 0; i < 6; i++ )
1934 {
1935 u = i >> 1;
1936 keybits = 128 + u * 64;
1937 mode = i & 1;
1938
1939 if( verbose != 0 )
1940 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
1941 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
1942
1943 memcpy( iv, aes_test_ofb_iv, 16 );
1944 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
1945
1946 offset = 0;
1947 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1948 /*
1949 * AES-192 is an optional feature that may be unavailable when
1950 * there is an alternative underlying implementation i.e. when
1951 * MBEDTLS_AES_ALT is defined.
1952 */
Ron Eldor9924bdc2018-10-04 10:59:13 +03001953 if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001954 {
1955 mbedtls_printf( "skipped\n" );
1956 continue;
1957 }
1958 else if( ret != 0 )
1959 {
1960 goto exit;
1961 }
1962
1963 if( mode == MBEDTLS_AES_DECRYPT )
1964 {
1965 memcpy( buf, aes_test_ofb_ct[u], 64 );
1966 aes_tests = aes_test_ofb_pt;
1967 }
1968 else
1969 {
1970 memcpy( buf, aes_test_ofb_pt, 64 );
1971 aes_tests = aes_test_ofb_ct[u];
1972 }
1973
1974 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
1975 if( ret != 0 )
1976 goto exit;
1977
1978 if( memcmp( buf, aes_tests, 64 ) != 0 )
1979 {
1980 ret = 1;
1981 goto exit;
1982 }
1983
1984 if( verbose != 0 )
1985 mbedtls_printf( "passed\n" );
1986 }
1987
1988 if( verbose != 0 )
1989 mbedtls_printf( "\n" );
1990#endif /* MBEDTLS_CIPHER_MODE_OFB */
1991
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001992#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001993 /*
1994 * CTR mode
1995 */
1996 for( i = 0; i < 6; i++ )
1997 {
1998 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001999 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002000
2001 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002002 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002003 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002004
2005 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
2006 memcpy( key, aes_test_ctr_key[u], 16 );
2007
2008 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002009 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
2010 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002011
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002012 len = aes_test_ctr_len[u];
2013
2014 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002015 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002016 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002017 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002018 }
2019 else
2020 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002021 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002022 aes_tests = aes_test_ctr_ct[u];
2023 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002024
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002025 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
2026 stream_block, buf, buf );
2027 if( ret != 0 )
2028 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002029
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002030 if( memcmp( buf, aes_tests, len ) != 0 )
2031 {
2032 ret = 1;
2033 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002034 }
2035
2036 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002037 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00002038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002039
2040 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041 mbedtls_printf( "\n" );
2042#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00002043
Jaeden Amero21d79cf2018-05-23 10:30:18 +01002044#if defined(MBEDTLS_CIPHER_MODE_XTS)
2045 {
2046 static const int num_tests =
2047 sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
2048 mbedtls_aes_xts_context ctx_xts;
2049
2050 /*
2051 * XTS mode
2052 */
2053 mbedtls_aes_xts_init( &ctx_xts );
2054
2055 for( i = 0; i < num_tests << 1; i++ )
2056 {
2057 const unsigned char *data_unit;
2058 u = i >> 1;
2059 mode = i & 1;
2060
2061 if( verbose != 0 )
2062 mbedtls_printf( " AES-XTS-128 (%s): ",
2063 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
2064
2065 memset( key, 0, sizeof( key ) );
2066 memcpy( key, aes_test_xts_key[u], 32 );
2067 data_unit = aes_test_xts_data_unit[u];
2068
2069 len = sizeof( *aes_test_xts_ct32 );
2070
2071 if( mode == MBEDTLS_AES_DECRYPT )
2072 {
2073 ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 );
2074 if( ret != 0)
2075 goto exit;
2076 memcpy( buf, aes_test_xts_ct32[u], len );
2077 aes_tests = aes_test_xts_pt32[u];
2078 }
2079 else
2080 {
2081 ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 );
2082 if( ret != 0)
2083 goto exit;
2084 memcpy( buf, aes_test_xts_pt32[u], len );
2085 aes_tests = aes_test_xts_ct32[u];
2086 }
2087
2088
2089 ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit,
2090 buf, buf );
2091 if( ret != 0 )
2092 goto exit;
2093
2094 if( memcmp( buf, aes_tests, len ) != 0 )
2095 {
2096 ret = 1;
2097 goto exit;
2098 }
2099
2100 if( verbose != 0 )
2101 mbedtls_printf( "passed\n" );
2102 }
2103
2104 if( verbose != 0 )
2105 mbedtls_printf( "\n" );
2106
2107 mbedtls_aes_xts_free( &ctx_xts );
2108 }
2109#endif /* MBEDTLS_CIPHER_MODE_XTS */
2110
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002111 ret = 0;
2112
2113exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01002114 if( ret != 0 && verbose != 0 )
2115 mbedtls_printf( "failed\n" );
2116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002117 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02002118
2119 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002120}
2121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002122#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00002123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124#endif /* MBEDTLS_AES_C */