blob: 95386dfb237ec9ecd8c68a3a28ddebacf2dfc697 [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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050039#include "mbedtls/platform_util.h"
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_PADLOCK_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000041#include "mbedtls/padlock.h"
Paul Bakker67820bd2012-06-04 12:47:23 +000042#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if defined(MBEDTLS_AESNI_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000044#include "mbedtls/aesni.h"
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +010045#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000046
Aorimn5f778012016-06-09 23:22:58 +020047#if defined(MBEDTLS_CIPHER_MODE_XEX) || defined(MBEDTLS_CIPHER_MODE_XTS)
Aorimn0089d362016-01-31 12:15:51 +010048#include "mbedtls/gf128mul.h"
49#endif
50
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#if defined(MBEDTLS_SELF_TEST)
52#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000053#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010054#else
Rich Evans00ab4702015-02-06 13:43:58 +000055#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#define mbedtls_printf printf
57#endif /* MBEDTLS_PLATFORM_C */
58#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020061
Paul Bakker5121ce52009-01-03 21:22:43 +000062/*
63 * 32-bit integer manipulation macros (little endian)
64 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000065#ifndef GET_UINT32_LE
66#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000067{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000068 (n) = ( (uint32_t) (b)[(i) ] ) \
69 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
70 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
71 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000072}
73#endif
74
Paul Bakker5c2364c2012-10-01 14:41:15 +000075#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000076#define PUT_UINT32_LE(n,b,i) \
77{ \
78 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
79 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
80 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
81 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000082}
83#endif
84
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085#if defined(MBEDTLS_PADLOCK_C) && \
86 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +000087static int aes_padlock_ace = -1;
88#endif
89
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020090#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000091/*
92 * Forward S-box
93 */
94static const unsigned char FSb[256] =
95{
96 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
97 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
98 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
99 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
100 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
101 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
102 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
103 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
104 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
105 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
106 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
107 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
108 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
109 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
110 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
111 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
112 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
113 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
114 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
115 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
116 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
117 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
118 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
119 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
120 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
121 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
122 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
123 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
124 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
125 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
126 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
127 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
128};
129
130/*
131 * Forward tables
132 */
133#define FT \
134\
135 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
136 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
137 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
138 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
139 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
140 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
141 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
142 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
143 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
144 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
145 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
146 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
147 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
148 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
149 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
150 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
151 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
152 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
153 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
154 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
155 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
156 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
157 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
158 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
159 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
160 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
161 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
162 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
163 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
164 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
165 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
166 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
167 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
168 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
169 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
170 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
171 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
172 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
173 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
174 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
175 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
176 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
177 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
178 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
179 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
180 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
181 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
182 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
183 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
184 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
185 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
186 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
187 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
188 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
189 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
190 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
191 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
192 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
193 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
194 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
195 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
196 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
197 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
198 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
199
200#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000201static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000202#undef V
203
Hanno Beckerad049a92017-06-19 16:31:54 +0100204#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200205
Paul Bakker5121ce52009-01-03 21:22:43 +0000206#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000207static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000208#undef V
209
210#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000211static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000212#undef V
213
214#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000215static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000216#undef V
217
Hanno Becker177d3cf2017-06-07 15:52:48 +0100218#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200219
Paul Bakker5121ce52009-01-03 21:22:43 +0000220#undef FT
221
222/*
223 * Reverse S-box
224 */
225static const unsigned char RSb[256] =
226{
227 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
228 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
229 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
230 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
231 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
232 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
233 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
234 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
235 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
236 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
237 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
238 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
239 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
240 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
241 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
242 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
243 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
244 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
245 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
246 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
247 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
248 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
249 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
250 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
251 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
252 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
253 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
254 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
255 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
256 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
257 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
258 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
259};
260
261/*
262 * Reverse tables
263 */
264#define RT \
265\
266 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
267 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
268 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
269 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
270 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
271 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
272 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
273 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
274 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
275 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
276 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
277 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
278 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
279 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
280 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
281 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
282 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
283 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
284 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
285 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
286 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
287 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
288 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
289 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
290 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
291 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
292 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
293 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
294 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
295 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
296 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
297 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
298 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
299 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
300 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
301 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
302 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
303 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
304 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
305 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
306 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
307 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
308 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
309 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
310 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
311 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
312 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
313 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
314 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
315 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
316 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
317 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
318 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
319 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
320 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
321 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
322 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
323 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
324 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
325 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
326 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
327 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
328 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
329 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
330
331#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000332static const uint32_t RT0[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000333#undef V
334
Hanno Beckerad049a92017-06-19 16:31:54 +0100335#if !defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200336
Paul Bakker5121ce52009-01-03 21:22:43 +0000337#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000338static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000339#undef V
340
341#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000342static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000343#undef V
344
345#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000347#undef V
348
Hanno Becker177d3cf2017-06-07 15:52:48 +0100349#endif /* !MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200350
Paul Bakker5121ce52009-01-03 21:22:43 +0000351#undef RT
352
353/*
354 * Round constants
355 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000356static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000357{
358 0x00000001, 0x00000002, 0x00000004, 0x00000008,
359 0x00000010, 0x00000020, 0x00000040, 0x00000080,
360 0x0000001B, 0x00000036
361};
362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000364
365/*
366 * Forward S-box & tables
367 */
368static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200369static uint32_t FT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100370#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker9af723c2014-05-01 13:03:14 +0200371static uint32_t FT1[256];
372static uint32_t FT2[256];
373static uint32_t FT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100374#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000375
376/*
377 * Reverse S-box & tables
378 */
379static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000380static uint32_t RT0[256];
Hanno Beckerad049a92017-06-19 16:31:54 +0100381#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000382static uint32_t RT1[256];
383static uint32_t RT2[256];
384static uint32_t RT3[256];
Hanno Becker177d3cf2017-06-07 15:52:48 +0100385#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000386
387/*
388 * Round constants
389 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000390static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
392/*
393 * Tables generation code
394 */
395#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
396#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
397#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
398
399static int aes_init_done = 0;
400
401static void aes_gen_tables( void )
402{
403 int i, x, y, z;
404 int pow[256];
405 int log[256];
406
407 /*
408 * compute pow and log tables over GF(2^8)
409 */
410 for( i = 0, x = 1; i < 256; i++ )
411 {
412 pow[i] = x;
413 log[x] = i;
414 x = ( x ^ XTIME( x ) ) & 0xFF;
415 }
416
417 /*
418 * calculate the round constants
419 */
420 for( i = 0, x = 1; i < 10; i++ )
421 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000422 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000423 x = XTIME( x ) & 0xFF;
424 }
425
426 /*
427 * generate the forward and reverse S-boxes
428 */
429 FSb[0x00] = 0x63;
430 RSb[0x63] = 0x00;
431
432 for( i = 1; i < 256; i++ )
433 {
434 x = pow[255 - log[i]];
435
Paul Bakker66d5d072014-06-17 16:39:18 +0200436 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
437 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
438 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
439 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000440 x ^= y ^ 0x63;
441
442 FSb[i] = (unsigned char) x;
443 RSb[x] = (unsigned char) i;
444 }
445
446 /*
447 * generate the forward and reverse tables
448 */
449 for( i = 0; i < 256; i++ )
450 {
451 x = FSb[i];
452 y = XTIME( x ) & 0xFF;
453 z = ( y ^ x ) & 0xFF;
454
Paul Bakker5c2364c2012-10-01 14:41:15 +0000455 FT0[i] = ( (uint32_t) y ) ^
456 ( (uint32_t) x << 8 ) ^
457 ( (uint32_t) x << 16 ) ^
458 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Hanno Beckerad049a92017-06-19 16:31:54 +0100460#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000461 FT1[i] = ROTL8( FT0[i] );
462 FT2[i] = ROTL8( FT1[i] );
463 FT3[i] = ROTL8( FT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100464#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000465
466 x = RSb[i];
467
Paul Bakker5c2364c2012-10-01 14:41:15 +0000468 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
469 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
470 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
471 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000472
Hanno Beckerad049a92017-06-19 16:31:54 +0100473#if !defined(MBEDTLS_AES_FEWER_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000474 RT1[i] = ROTL8( RT0[i] );
475 RT2[i] = ROTL8( RT1[i] );
476 RT3[i] = ROTL8( RT2[i] );
Hanno Becker177d3cf2017-06-07 15:52:48 +0100477#endif /* !MBEDTLS_AES_FEWER_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000478 }
479}
480
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200481#undef ROTL8
482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000484
Hanno Beckerad049a92017-06-19 16:31:54 +0100485#if defined(MBEDTLS_AES_FEWER_TABLES)
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200486
487#define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) )
488#define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) )
489#define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) )
490
491#define AES_RT0(idx) RT0[idx]
492#define AES_RT1(idx) ROTL8( RT0[idx] )
493#define AES_RT2(idx) ROTL16( RT0[idx] )
494#define AES_RT3(idx) ROTL24( RT0[idx] )
495
496#define AES_FT0(idx) FT0[idx]
497#define AES_FT1(idx) ROTL8( FT0[idx] )
498#define AES_FT2(idx) ROTL16( FT0[idx] )
499#define AES_FT3(idx) ROTL24( FT0[idx] )
500
Hanno Becker177d3cf2017-06-07 15:52:48 +0100501#else /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200502
503#define AES_RT0(idx) RT0[idx]
504#define AES_RT1(idx) RT1[idx]
505#define AES_RT2(idx) RT2[idx]
506#define AES_RT3(idx) RT3[idx]
507
508#define AES_FT0(idx) FT0[idx]
509#define AES_FT1(idx) FT1[idx]
510#define AES_FT2(idx) FT2[idx]
511#define AES_FT3(idx) FT3[idx]
512
Hanno Becker177d3cf2017-06-07 15:52:48 +0100513#endif /* MBEDTLS_AES_FEWER_TABLES */
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200516{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200517 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200518}
519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200521{
522 if( ctx == NULL )
523 return;
524
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500525 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200526}
527
Paul Bakker5121ce52009-01-03 21:22:43 +0000528/*
529 * AES key schedule (encryption)
530 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200531#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200532int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200533 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000534{
Paul Bakker23986e52011-04-24 08:57:21 +0000535 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000536 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000537
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538#if !defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000539 if( aes_init_done == 0 )
540 {
541 aes_gen_tables();
542 aes_init_done = 1;
Paul Bakker048d04e2012-02-12 17:31:04 +0000543
Paul Bakker5121ce52009-01-03 21:22:43 +0000544 }
545#endif
546
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200547 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000548 {
549 case 128: ctx->nr = 10; break;
550 case 192: ctx->nr = 12; break;
551 case 256: ctx->nr = 14; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000553 }
554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000556 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100557 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000558
559 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000561 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000562#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000563 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100566 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200567 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100568#endif
569
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200570 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000572 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000573 }
574
575 switch( ctx->nr )
576 {
577 case 10:
578
579 for( i = 0; i < 10; i++, RK += 4 )
580 {
581 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000582 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
583 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
584 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
585 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000586
587 RK[5] = RK[1] ^ RK[4];
588 RK[6] = RK[2] ^ RK[5];
589 RK[7] = RK[3] ^ RK[6];
590 }
591 break;
592
593 case 12:
594
595 for( i = 0; i < 8; i++, RK += 6 )
596 {
597 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000598 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
599 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
600 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
601 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000602
603 RK[7] = RK[1] ^ RK[6];
604 RK[8] = RK[2] ^ RK[7];
605 RK[9] = RK[3] ^ RK[8];
606 RK[10] = RK[4] ^ RK[9];
607 RK[11] = RK[5] ^ RK[10];
608 }
609 break;
610
611 case 14:
612
613 for( i = 0; i < 7; i++, RK += 8 )
614 {
615 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000616 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
617 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
618 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
619 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000620
621 RK[9] = RK[1] ^ RK[8];
622 RK[10] = RK[2] ^ RK[9];
623 RK[11] = RK[3] ^ RK[10];
624
625 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000626 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
627 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
628 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
629 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000630
631 RK[13] = RK[5] ^ RK[12];
632 RK[14] = RK[6] ^ RK[13];
633 RK[15] = RK[7] ^ RK[14];
634 }
635 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000637
638 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000639}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200640#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642/*
643 * AES key schedule (decryption)
644 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200645#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200647 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000648{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200649 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000651 uint32_t *RK;
652 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000657 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100658 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000659
660 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000662 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000663#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000664 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000665
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200666 /* Also checks keybits */
667 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200668 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000669
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200670 ctx->nr = cty.nr;
671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100673 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100674 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100676 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200677 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100678 }
679#endif
680
Paul Bakker5121ce52009-01-03 21:22:43 +0000681 SK = cty.rk + cty.nr * 4;
682
683 *RK++ = *SK++;
684 *RK++ = *SK++;
685 *RK++ = *SK++;
686 *RK++ = *SK++;
687
688 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
689 {
690 for( j = 0; j < 4; j++, SK++ )
691 {
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200692 *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^
693 AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^
694 AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^
695 AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 }
697 }
698
699 *RK++ = *SK++;
700 *RK++ = *SK++;
701 *RK++ = *SK++;
702 *RK++ = *SK++;
703
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200704exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000706
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200707 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000708}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200709#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000710
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200711#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
712{ \
713 X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \
714 AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \
715 AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \
716 AES_FT3( ( Y3 >> 24 ) & 0xFF ); \
717 \
718 X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \
719 AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \
720 AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \
721 AES_FT3( ( Y0 >> 24 ) & 0xFF ); \
722 \
723 X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \
724 AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \
725 AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \
726 AES_FT3( ( Y1 >> 24 ) & 0xFF ); \
727 \
728 X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \
729 AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \
730 AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \
731 AES_FT3( ( Y2 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000732}
733
Jussi Kivilinna2fd1bb82015-11-12 16:38:31 +0200734#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
735{ \
736 X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \
737 AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \
738 AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \
739 AES_RT3( ( Y1 >> 24 ) & 0xFF ); \
740 \
741 X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \
742 AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \
743 AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \
744 AES_RT3( ( Y2 >> 24 ) & 0xFF ); \
745 \
746 X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \
747 AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \
748 AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \
749 AES_RT3( ( Y3 >> 24 ) & 0xFF ); \
750 \
751 X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \
752 AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \
753 AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \
754 AES_RT3( ( Y0 >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +0000755}
756
757/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200758 * AES-ECB block encryption
759 */
760#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000761int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
762 const unsigned char input[16],
763 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200764{
765 int i;
766 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
767
768 RK = ctx->rk;
769
770 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
771 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
772 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
773 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
774
775 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
776 {
777 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
778 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
779 }
780
781 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
782
783 X0 = *RK++ ^ \
784 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
785 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
786 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
787 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
788
789 X1 = *RK++ ^ \
790 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
791 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
792 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
793 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
794
795 X2 = *RK++ ^ \
796 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
797 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
798 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
799 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
800
801 X3 = *RK++ ^ \
802 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
803 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
804 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
805 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
806
807 PUT_UINT32_LE( X0, output, 0 );
808 PUT_UINT32_LE( X1, output, 4 );
809 PUT_UINT32_LE( X2, output, 8 );
810 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000811
812 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200813}
814#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
815
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100816#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100817void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
818 const unsigned char input[16],
819 unsigned char output[16] )
820{
821 mbedtls_internal_aes_encrypt( ctx, input, output );
822}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100823#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100824
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200825/*
826 * AES-ECB block decryption
827 */
828#if !defined(MBEDTLS_AES_DECRYPT_ALT)
Andres AGf5bf7182017-03-03 14:09:56 +0000829int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
830 const unsigned char input[16],
831 unsigned char output[16] )
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200832{
833 int i;
834 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
835
836 RK = ctx->rk;
837
838 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
839 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
840 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
841 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
842
843 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
844 {
845 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
846 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
847 }
848
849 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
850
851 X0 = *RK++ ^ \
852 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
853 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
854 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
855 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
856
857 X1 = *RK++ ^ \
858 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
859 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
860 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
861 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
862
863 X2 = *RK++ ^ \
864 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
865 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
866 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
867 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
868
869 X3 = *RK++ ^ \
870 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
871 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
872 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
873 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
874
875 PUT_UINT32_LE( X0, output, 0 );
876 PUT_UINT32_LE( X1, output, 4 );
877 PUT_UINT32_LE( X2, output, 8 );
878 PUT_UINT32_LE( X3, output, 12 );
Andres AGf5bf7182017-03-03 14:09:56 +0000879
880 return( 0 );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200881}
882#endif /* !MBEDTLS_AES_DECRYPT_ALT */
883
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100884#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckerbedc2052017-06-26 12:46:56 +0100885void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
886 const unsigned char input[16],
887 unsigned char output[16] )
888{
889 mbedtls_internal_aes_decrypt( ctx, input, output );
890}
Gilles Peskine8db3efb2018-02-21 19:16:20 +0100891#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Beckerbedc2052017-06-26 12:46:56 +0100892
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200893/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 * AES-ECB block encryption/decryption
895 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200896int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000897 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000898 const unsigned char input[16],
Paul Bakker5121ce52009-01-03 21:22:43 +0000899 unsigned char output[16] )
900{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100902 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +0100904#endif
905
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +0000907 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +0000908 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200909 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000910 return( 0 );
911
912 // If padlock data misaligned, we just fall back to
913 // unaccelerated mode
914 //
Paul Bakker5121ce52009-01-03 21:22:43 +0000915 }
916#endif
917
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200918 if( mode == MBEDTLS_AES_ENCRYPT )
Andres AGf5bf7182017-03-03 14:09:56 +0000919 return( mbedtls_internal_aes_encrypt( ctx, input, output ) );
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200920 else
Andres AGf5bf7182017-03-03 14:09:56 +0000921 return( mbedtls_internal_aes_decrypt( ctx, input, output ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000922}
923
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000925/*
926 * AES-CBC buffer encryption/decryption
927 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000929 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000930 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +0000931 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000932 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000933 unsigned char *output )
934{
935 int i;
936 unsigned char temp[16];
937
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000938 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +0000942 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +0000943 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000945 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +0200946
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000947 // If padlock data misaligned, we just fall back to
948 // unaccelerated mode
949 //
Paul Bakker5121ce52009-01-03 21:22:43 +0000950 }
951#endif
952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +0000954 {
955 while( length > 0 )
956 {
957 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200958 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000959
960 for( i = 0; i < 16; i++ )
961 output[i] = (unsigned char)( output[i] ^ iv[i] );
962
963 memcpy( iv, temp, 16 );
964
965 input += 16;
966 output += 16;
967 length -= 16;
968 }
969 }
970 else
971 {
972 while( length > 0 )
973 {
974 for( i = 0; i < 16; i++ )
975 output[i] = (unsigned char)( input[i] ^ iv[i] );
976
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200977 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000978 memcpy( iv, output, 16 );
979
980 input += 16;
981 output += 16;
982 length -= 16;
983 }
984 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000985
986 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000987}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000989
Aorimn0089d362016-01-31 12:15:51 +0100990#if defined(MBEDTLS_CIPHER_MODE_XEX)
991/*
992 * AES-XEX buffer encryption/decryption
993 */
994int mbedtls_aes_crypt_xex( mbedtls_aes_context *crypt_ctx,
995 mbedtls_aes_context *tweak_ctx,
996 int mode,
997 size_t length,
998 unsigned char iv[16],
999 const unsigned char *input,
1000 unsigned char *output )
1001{
Aorimn380162c2016-02-02 23:01:09 +01001002 union xex_buf128 {
1003 uint8_t u8[16];
1004 uint64_t u64[2];
1005 };
1006
1007 union xex_buf128 scratch;
1008 union xex_buf128 t_buf;
1009 union xex_buf128 *inbuf;
1010 union xex_buf128 *outbuf;
1011
1012 inbuf = (union xex_buf128*)input;
1013 outbuf = (union xex_buf128*)output;
Aorimn0089d362016-01-31 12:15:51 +01001014
1015 if( length % 16 )
1016 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
1017
1018
Aorimn380162c2016-02-02 23:01:09 +01001019 mbedtls_aes_crypt_ecb( tweak_ctx, MBEDTLS_AES_ENCRYPT, iv, t_buf.u8 );
Aorimn0089d362016-01-31 12:15:51 +01001020
1021 goto first;
1022
1023 do
1024 {
Aorimn380162c2016-02-02 23:01:09 +01001025 mbedtls_gf128mul_x_ble( t_buf.u8, t_buf.u8 );
Aorimn0089d362016-01-31 12:15:51 +01001026
1027first:
1028 /* PP <- T xor P */
Aorimn380162c2016-02-02 23:01:09 +01001029 scratch.u64[0] = (uint64_t)( inbuf->u64[0] ^ t_buf.u64[0] );
1030 scratch.u64[1] = (uint64_t)( inbuf->u64[1] ^ t_buf.u64[1] );
Aorimn0089d362016-01-31 12:15:51 +01001031
1032 /* CC <- E(Key2,PP) */
Aorimn380162c2016-02-02 23:01:09 +01001033 mbedtls_aes_crypt_ecb( crypt_ctx, mode, scratch.u8, outbuf->u8 );
Aorimn0089d362016-01-31 12:15:51 +01001034
1035 /* C <- T xor CC */
Aorimn380162c2016-02-02 23:01:09 +01001036 outbuf->u64[0] = (uint64_t)( outbuf->u64[0] ^ t_buf.u64[0] );
1037 outbuf->u64[1] = (uint64_t)( outbuf->u64[1] ^ t_buf.u64[1] );
Aorimn0089d362016-01-31 12:15:51 +01001038
Aorimn380162c2016-02-02 23:01:09 +01001039 inbuf += 1;
1040 outbuf += 1;
Aorimn0089d362016-01-31 12:15:51 +01001041 length -= 16;
1042 } while( length > 0 );
1043
1044 return( 0 );
1045}
1046#endif /* MBEDTLS_CIPHER_MODE_XEX */
1047
Aorimn5f778012016-06-09 23:22:58 +02001048#if defined(MBEDTLS_CIPHER_MODE_XTS)
1049/*
1050 * AES-XTS buffer encryption/decryption
1051 */
1052int mbedtls_aes_crypt_xts( mbedtls_aes_context *crypt_ctx,
1053 mbedtls_aes_context *tweak_ctx,
1054 int mode,
1055 size_t bits_length,
1056 unsigned char iv[16],
1057 const unsigned char *input,
1058 unsigned char *output )
1059{
1060 union xts_buf128 {
1061 uint8_t u8[16];
1062 uint64_t u64[2];
1063 };
1064
1065 union xts_buf128 scratch;
1066 union xts_buf128 cts_scratch;
1067 union xts_buf128 t_buf;
1068 union xts_buf128 cts_t_buf;
1069 union xts_buf128 *inbuf;
1070 union xts_buf128 *outbuf;
1071
1072 size_t length = bits_length / 8;
1073 size_t nblk = length / 16;
1074 size_t remn = length % 16;
1075
1076 inbuf = (union xts_buf128*)input;
1077 outbuf = (union xts_buf128*)output;
1078
1079 /* For performing the ciphertext-stealing operation, we have to get at least
1080 * one complete block */
1081 if( length < 16 )
1082 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
1083
1084
1085 mbedtls_aes_crypt_ecb( tweak_ctx, MBEDTLS_AES_ENCRYPT, iv, t_buf.u8 );
1086
1087 if( mode == MBEDTLS_AES_DECRYPT && remn )
1088 {
1089 if( nblk == 1 )
1090 goto decrypt_only_one_full_block;
1091 nblk--;
1092 }
1093
1094 goto first;
1095
1096 do
1097 {
1098 mbedtls_gf128mul_x_ble( t_buf.u8, t_buf.u8 );
1099
1100first:
1101 /* PP <- T xor P */
1102 scratch.u64[0] = (uint64_t)( inbuf->u64[0] ^ t_buf.u64[0] );
1103 scratch.u64[1] = (uint64_t)( inbuf->u64[1] ^ t_buf.u64[1] );
1104
1105 /* CC <- E(Key2,PP) */
1106 mbedtls_aes_crypt_ecb( crypt_ctx, mode, scratch.u8, outbuf->u8 );
1107
1108 /* C <- T xor CC */
1109 outbuf->u64[0] = (uint64_t)( outbuf->u64[0] ^ t_buf.u64[0] );
1110 outbuf->u64[1] = (uint64_t)( outbuf->u64[1] ^ t_buf.u64[1] );
1111
1112 inbuf += 1;
1113 outbuf += 1;
1114 nblk -= 1;
1115 } while( nblk > 0 );
1116
1117 /* Ciphertext stealing, if necessary */
1118 if( remn != 0 )
1119 {
1120 outbuf = (union xts_buf128*)output;
1121 inbuf = (union xts_buf128*)input;
1122 nblk = length / 16;
1123
1124 if( mode == MBEDTLS_AES_ENCRYPT )
1125 {
1126 memcpy( cts_scratch.u8, (uint8_t*)&inbuf[nblk], remn );
1127 memcpy( cts_scratch.u8 + remn, ((uint8_t*)&outbuf[nblk - 1]) + remn, 16 - remn );
1128 memcpy( (uint8_t*)&outbuf[nblk], (uint8_t*)&outbuf[nblk - 1], remn );
1129
1130 mbedtls_gf128mul_x_ble( t_buf.u8, t_buf.u8 );
1131
1132 /* PP <- T xor P */
1133 scratch.u64[0] = (uint64_t)( cts_scratch.u64[0] ^ t_buf.u64[0] );
1134 scratch.u64[1] = (uint64_t)( cts_scratch.u64[1] ^ t_buf.u64[1] );
1135
1136 /* CC <- E(Key2,PP) */
1137 mbedtls_aes_crypt_ecb( crypt_ctx, mode, scratch.u8, scratch.u8 );
1138
1139 /* C <- T xor CC */
1140 outbuf[nblk - 1].u64[0] = (uint64_t)( scratch.u64[0] ^ t_buf.u64[0] );
1141 outbuf[nblk - 1].u64[1] = (uint64_t)( scratch.u64[1] ^ t_buf.u64[1] );
1142 }
1143 else /* AES_DECRYPT */
1144 {
1145 mbedtls_gf128mul_x_ble( t_buf.u8, t_buf.u8 );
1146
1147decrypt_only_one_full_block:
1148 cts_t_buf.u64[0] = t_buf.u64[0];
1149 cts_t_buf.u64[1] = t_buf.u64[1];
1150
1151 mbedtls_gf128mul_x_ble( t_buf.u8, t_buf.u8 );
1152
1153 /* PP <- T xor P */
1154 scratch.u64[0] = (uint64_t)( inbuf[nblk - 1].u64[0] ^ t_buf.u64[0] );
1155 scratch.u64[1] = (uint64_t)( inbuf[nblk - 1].u64[1] ^ t_buf.u64[1] );
1156
1157 /* CC <- E(Key2,PP) */
1158 mbedtls_aes_crypt_ecb( crypt_ctx, mode, scratch.u8, scratch.u8 );
1159
1160 /* C <- T xor CC */
1161 cts_scratch.u64[0] = (uint64_t)( scratch.u64[0] ^ t_buf.u64[0] );
1162 cts_scratch.u64[1] = (uint64_t)( scratch.u64[1] ^ t_buf.u64[1] );
1163
1164
1165 memcpy( (uint8_t*)&inbuf[nblk - 1], (uint8_t*)&inbuf[nblk], remn );
1166 memcpy( (uint8_t*)&inbuf[nblk - 1] + remn, cts_scratch.u8 + remn, 16 - remn );
1167 memcpy( (uint8_t*)&outbuf[nblk], cts_scratch.u8, remn );
1168
1169
1170 /* PP <- T xor P */
1171 scratch.u64[0] = (uint64_t)( inbuf[nblk - 1].u64[0] ^ cts_t_buf.u64[0] );
1172 scratch.u64[1] = (uint64_t)( inbuf[nblk - 1].u64[1] ^ cts_t_buf.u64[1] );
1173
1174 /* CC <- E(Key2,PP) */
1175 mbedtls_aes_crypt_ecb( crypt_ctx, mode, scratch.u8, scratch.u8 );
1176
1177 /* C <- T xor CC */
1178 outbuf[nblk - 1].u64[0] = (uint64_t)( scratch.u64[0] ^ cts_t_buf.u64[0] );
1179 outbuf[nblk - 1].u64[1] = (uint64_t)( scratch.u64[1] ^ cts_t_buf.u64[1] );
1180 }
1181 }
1182
1183 return( 0 );
1184}
1185#endif /* MBEDTLS_CIPHER_MODE_XTS */
1186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001187#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001188/*
1189 * AES-CFB128 buffer encryption/decryption
1190 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001191int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +00001192 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +00001193 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +00001194 size_t *iv_off,
Paul Bakker5121ce52009-01-03 21:22:43 +00001195 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +00001196 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +00001197 unsigned char *output )
1198{
Paul Bakker27fdf462011-06-09 13:55:13 +00001199 int c;
1200 size_t n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +00001201
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001202 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001203 {
1204 while( length-- )
1205 {
1206 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001207 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001208
1209 c = *input++;
1210 *output++ = (unsigned char)( c ^ iv[n] );
1211 iv[n] = (unsigned char) c;
1212
Paul Bakker66d5d072014-06-17 16:39:18 +02001213 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001214 }
1215 }
1216 else
1217 {
1218 while( length-- )
1219 {
1220 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +00001222
1223 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
1224
Paul Bakker66d5d072014-06-17 16:39:18 +02001225 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +00001226 }
1227 }
1228
1229 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +00001230
1231 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001232}
Paul Bakker556efba2014-01-24 15:38:12 +01001233
1234/*
1235 * AES-CFB8 buffer encryption/decryption
1236 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Paul Bakker556efba2014-01-24 15:38:12 +01001238 int mode,
1239 size_t length,
1240 unsigned char iv[16],
1241 const unsigned char *input,
1242 unsigned char *output )
1243{
1244 unsigned char c;
1245 unsigned char ov[17];
1246
1247 while( length-- )
1248 {
Paul Bakker66d5d072014-06-17 16:39:18 +02001249 memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +01001251
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001252 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001253 ov[16] = *input;
1254
1255 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
1256
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001257 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +01001258 ov[16] = c;
1259
Paul Bakker66d5d072014-06-17 16:39:18 +02001260 memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +01001261 }
1262
1263 return( 0 );
1264}
Simon Butcher76a5b222018-04-22 22:57:27 +01001265#endif /* MBEDTLS_CIPHER_MODE_CFB */
1266
1267#if defined(MBEDTLS_CIPHER_MODE_OFB)
1268/*
1269 * AES-OFB (Output Feedback Mode) buffer encryption/decryption
1270 */
1271int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
Simon Butcher00131442018-05-22 22:40:36 +01001272 size_t length,
1273 size_t *iv_off,
1274 unsigned char iv[16],
1275 const unsigned char *input,
1276 unsigned char *output )
Simon Butcher76a5b222018-04-22 22:57:27 +01001277{
Simon Butcherad4e4932018-04-29 00:43:47 +01001278 int ret = 0;
Simon Butcher76a5b222018-04-22 22:57:27 +01001279 size_t n = *iv_off;
1280
1281 while( length-- )
1282 {
1283 if( n == 0 )
Simon Butcherad4e4932018-04-29 00:43:47 +01001284 {
1285 ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
1286 if( ret != 0 )
1287 goto exit;
1288 }
Simon Butcher76a5b222018-04-22 22:57:27 +01001289 *output++ = *input++ ^ iv[n];
1290
1291 n = ( n + 1 ) & 0x0F;
1292 }
1293
1294 *iv_off = n;
1295
Simon Butcherad4e4932018-04-29 00:43:47 +01001296exit:
1297 return( ret );
Simon Butcher76a5b222018-04-22 22:57:27 +01001298}
1299#endif /* MBEDTLS_CIPHER_MODE_OFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001300
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001301#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001302/*
1303 * AES-CTR buffer encryption/decryption
1304 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001305int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001306 size_t length,
1307 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001308 unsigned char nonce_counter[16],
1309 unsigned char stream_block[16],
1310 const unsigned char *input,
1311 unsigned char *output )
1312{
Paul Bakker369e14b2012-04-18 14:16:09 +00001313 int c, i;
Paul Bakker27fdf462011-06-09 13:55:13 +00001314 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001315
Mohammad Azim Khan3f7f8172017-11-23 17:49:05 +00001316 if ( n > 0x0F )
1317 return( MBEDTLS_ERR_AES_BAD_INPUT_DATA );
1318
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001319 while( length-- )
1320 {
1321 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001322 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001323
Paul Bakker369e14b2012-04-18 14:16:09 +00001324 for( i = 16; i > 0; i-- )
1325 if( ++nonce_counter[i - 1] != 0 )
1326 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001327 }
1328 c = *input++;
1329 *output++ = (unsigned char)( c ^ stream_block[n] );
1330
Paul Bakker66d5d072014-06-17 16:39:18 +02001331 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001332 }
1333
1334 *nc_off = n;
1335
1336 return( 0 );
1337}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001340#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001342#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001343/*
1344 * AES test vectors from:
1345 *
1346 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1347 */
1348static const unsigned char aes_test_ecb_dec[3][16] =
1349{
1350 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1351 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1352 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1353 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1354 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1355 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1356};
1357
1358static const unsigned char aes_test_ecb_enc[3][16] =
1359{
1360 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1361 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1362 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1363 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1364 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1365 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1366};
1367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001368#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001369static const unsigned char aes_test_cbc_dec[3][16] =
1370{
1371 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1372 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1373 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1374 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1375 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1376 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1377};
1378
1379static const unsigned char aes_test_cbc_enc[3][16] =
1380{
1381 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1382 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1383 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1384 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1385 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1386 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1387};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001390#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001391/*
1392 * AES-CFB128 test vectors from:
1393 *
1394 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1395 */
1396static const unsigned char aes_test_cfb128_key[3][32] =
1397{
1398 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1399 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1400 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1401 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1402 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1403 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1404 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1405 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1406 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1407};
1408
1409static const unsigned char aes_test_cfb128_iv[16] =
1410{
1411 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1412 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1413};
1414
1415static const unsigned char aes_test_cfb128_pt[64] =
1416{
1417 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1418 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1419 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1420 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1421 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1422 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1423 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1424 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1425};
1426
1427static const unsigned char aes_test_cfb128_ct[3][64] =
1428{
1429 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1430 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1431 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1432 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1433 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1434 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1435 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1436 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1437 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1438 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1439 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1440 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1441 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1442 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1443 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1444 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1445 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1446 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1447 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1448 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1449 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1450 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1451 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1452 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1453};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001455
Simon Butcherad4e4932018-04-29 00:43:47 +01001456#if defined(MBEDTLS_CIPHER_MODE_OFB)
1457/*
1458 * AES-OFB test vectors from:
1459 *
Simon Butcher5db13622018-06-04 22:11:25 +01001460 * https://csrc.nist.gov/publications/detail/sp/800-38a/final
Simon Butcherad4e4932018-04-29 00:43:47 +01001461 */
1462static const unsigned char aes_test_ofb_key[3][32] =
1463{
1464 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1465 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1466 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1467 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1468 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1469 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1470 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1471 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1472 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1473};
1474
1475static const unsigned char aes_test_ofb_iv[16] =
1476{
1477 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1478 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1479};
1480
1481static const unsigned char aes_test_ofb_pt[64] =
1482{
1483 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1484 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1485 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1486 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1487 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1488 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1489 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1490 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1491};
1492
1493static const unsigned char aes_test_ofb_ct[3][64] =
1494{
1495 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1496 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1497 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
1498 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
1499 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
1500 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
1501 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
1502 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e },
1503 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1504 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1505 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
1506 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
1507 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
1508 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
1509 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
1510 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a },
1511 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1512 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1513 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
1514 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
1515 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
1516 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
1517 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
1518 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 }
1519};
1520#endif /* MBEDTLS_CIPHER_MODE_OFB */
1521
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001523/*
1524 * AES-CTR test vectors from:
1525 *
1526 * http://www.faqs.org/rfcs/rfc3686.html
1527 */
1528
1529static const unsigned char aes_test_ctr_key[3][16] =
1530{
1531 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1532 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1533 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1534 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1535 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1536 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1537};
1538
1539static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1540{
1541 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1543 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1544 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1545 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1546 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1547};
1548
1549static const unsigned char aes_test_ctr_pt[3][48] =
1550{
1551 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1552 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1553
1554 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1555 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1556 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1557 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1558
1559 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1560 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1561 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1562 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1563 0x20, 0x21, 0x22, 0x23 }
1564};
1565
1566static const unsigned char aes_test_ctr_ct[3][48] =
1567{
1568 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1569 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1570 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1571 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1572 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1573 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1574 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1575 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1576 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1577 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1578 0x25, 0xB2, 0x07, 0x2F }
1579};
1580
1581static const int aes_test_ctr_len[3] =
1582 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001584
1585/*
1586 * Checkup routine
1587 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001588int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00001589{
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001590 int ret = 0, i, j, u, mode;
1591 unsigned int keybits;
Paul Bakker5121ce52009-01-03 21:22:43 +00001592 unsigned char key[32];
1593 unsigned char buf[64];
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001594 const unsigned char *aes_tests;
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001595#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001596 unsigned char iv[16];
Jussi Kivilinna4b541be2016-06-22 18:48:16 +03001597#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001598#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001599 unsigned char prv[16];
1600#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001601#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001602 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001603#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001604#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001605 int len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001606 unsigned char nonce_counter[16];
1607 unsigned char stream_block[16];
1608#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001609 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001610
1611 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001612 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00001613
1614 /*
1615 * ECB mode
1616 */
1617 for( i = 0; i < 6; i++ )
1618 {
1619 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001620 keybits = 128 + u * 64;
1621 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001622
1623 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001624 mbedtls_printf( " AES-ECB-%3d (%s): ", keybits,
1625 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001626
1627 memset( buf, 0, 16 );
1628
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001629 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001630 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001631 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1632 aes_tests = aes_test_ecb_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001633 }
1634 else
1635 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001636 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1637 aes_tests = aes_test_ecb_enc[u];
1638 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001639
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001640 /*
1641 * AES-192 is an optional feature that may be unavailable when
1642 * there is an alternative underlying implementation i.e. when
1643 * MBEDTLS_AES_ALT is defined.
1644 */
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001645 if( ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE && keybits == 192 )
1646 {
1647 mbedtls_printf( "skipped\n" );
1648 continue;
1649 }
1650 else if( ret != 0 )
1651 {
1652 goto exit;
1653 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001654
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001655 for( j = 0; j < 10000; j++ )
1656 {
1657 ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf );
1658 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001659 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001660 }
1661
1662 if( memcmp( buf, aes_tests, 16 ) != 0 )
1663 {
1664 ret = 1;
1665 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001666 }
1667
1668 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001669 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001670 }
1671
1672 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001673 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001675#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001676 /*
1677 * CBC mode
1678 */
1679 for( i = 0; i < 6; i++ )
1680 {
1681 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001682 keybits = 128 + u * 64;
1683 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001684
1685 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001686 mbedtls_printf( " AES-CBC-%3d (%s): ", keybits,
1687 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001688
1689 memset( iv , 0, 16 );
1690 memset( prv, 0, 16 );
1691 memset( buf, 0, 16 );
1692
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001693 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001694 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001695 ret = mbedtls_aes_setkey_dec( &ctx, key, keybits );
1696 aes_tests = aes_test_cbc_dec[u];
Paul Bakker5121ce52009-01-03 21:22:43 +00001697 }
1698 else
1699 {
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001700 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1701 aes_tests = aes_test_cbc_enc[u];
1702 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001703
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001704 /*
1705 * AES-192 is an optional feature that may be unavailable when
1706 * there is an alternative underlying implementation i.e. when
1707 * MBEDTLS_AES_ALT is defined.
1708 */
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001709 if( ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE && keybits == 192 )
1710 {
1711 mbedtls_printf( "skipped\n" );
1712 continue;
1713 }
1714 else if( ret != 0 )
1715 {
1716 goto exit;
1717 }
1718
1719 for( j = 0; j < 10000; j++ )
1720 {
1721 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001722 {
1723 unsigned char tmp[16];
1724
Paul Bakker5121ce52009-01-03 21:22:43 +00001725 memcpy( tmp, prv, 16 );
1726 memcpy( prv, buf, 16 );
1727 memcpy( buf, tmp, 16 );
1728 }
1729
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001730 ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf );
1731 if( ret != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001732 goto exit;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001733
1734 }
1735
1736 if( memcmp( buf, aes_tests, 16 ) != 0 )
1737 {
1738 ret = 1;
1739 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001740 }
1741
1742 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001743 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001744 }
1745
1746 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001747 mbedtls_printf( "\n" );
1748#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001750#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001751 /*
1752 * CFB128 mode
1753 */
1754 for( i = 0; i < 6; i++ )
1755 {
1756 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001757 keybits = 128 + u * 64;
1758 mode = i & 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001759
1760 if( verbose != 0 )
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001761 mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits,
1762 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001763
1764 memcpy( iv, aes_test_cfb128_iv, 16 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001765 memcpy( key, aes_test_cfb128_key[u], keybits / 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001766
1767 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001768 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
Andres Amaya Garciad3e7e7d2017-06-15 16:17:46 +01001769 /*
1770 * AES-192 is an optional feature that may be unavailable when
1771 * there is an alternative underlying implementation i.e. when
1772 * MBEDTLS_AES_ALT is defined.
1773 */
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001774 if( ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE && keybits == 192 )
1775 {
1776 mbedtls_printf( "skipped\n" );
1777 continue;
1778 }
1779 else if( ret != 0 )
1780 {
1781 goto exit;
1782 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001783
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001784 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001785 {
1786 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001787 aes_tests = aes_test_cfb128_pt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001788 }
1789 else
1790 {
1791 memcpy( buf, aes_test_cfb128_pt, 64 );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001792 aes_tests = aes_test_cfb128_ct[u];
1793 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001794
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001795 ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf );
1796 if( ret != 0 )
1797 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001798
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001799 if( memcmp( buf, aes_tests, 64 ) != 0 )
1800 {
1801 ret = 1;
1802 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001803 }
1804
1805 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001806 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001807 }
1808
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001809 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001810 mbedtls_printf( "\n" );
1811#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001812
Simon Butcherad4e4932018-04-29 00:43:47 +01001813#if defined(MBEDTLS_CIPHER_MODE_OFB)
1814 /*
1815 * OFB mode
1816 */
1817 for( i = 0; i < 6; i++ )
1818 {
1819 u = i >> 1;
1820 keybits = 128 + u * 64;
1821 mode = i & 1;
1822
1823 if( verbose != 0 )
1824 mbedtls_printf( " AES-OFB-%3d (%s): ", keybits,
1825 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
1826
1827 memcpy( iv, aes_test_ofb_iv, 16 );
1828 memcpy( key, aes_test_ofb_key[u], keybits / 8 );
1829
1830 offset = 0;
1831 ret = mbedtls_aes_setkey_enc( &ctx, key, keybits );
1832 /*
1833 * AES-192 is an optional feature that may be unavailable when
1834 * there is an alternative underlying implementation i.e. when
1835 * MBEDTLS_AES_ALT is defined.
1836 */
1837 if( ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE && keybits == 192 )
1838 {
1839 mbedtls_printf( "skipped\n" );
1840 continue;
1841 }
1842 else if( ret != 0 )
1843 {
1844 goto exit;
1845 }
1846
1847 if( mode == MBEDTLS_AES_DECRYPT )
1848 {
1849 memcpy( buf, aes_test_ofb_ct[u], 64 );
1850 aes_tests = aes_test_ofb_pt;
1851 }
1852 else
1853 {
1854 memcpy( buf, aes_test_ofb_pt, 64 );
1855 aes_tests = aes_test_ofb_ct[u];
1856 }
1857
1858 ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf );
1859 if( ret != 0 )
1860 goto exit;
1861
1862 if( memcmp( buf, aes_tests, 64 ) != 0 )
1863 {
1864 ret = 1;
1865 goto exit;
1866 }
1867
1868 if( verbose != 0 )
1869 mbedtls_printf( "passed\n" );
1870 }
1871
1872 if( verbose != 0 )
1873 mbedtls_printf( "\n" );
1874#endif /* MBEDTLS_CIPHER_MODE_OFB */
1875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001876#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001877 /*
1878 * CTR mode
1879 */
1880 for( i = 0; i < 6; i++ )
1881 {
1882 u = i >> 1;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001883 mode = i & 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001884
1885 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001886 mbedtls_printf( " AES-CTR-128 (%s): ",
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001887 ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001888
1889 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
1890 memcpy( key, aes_test_ctr_key[u], 16 );
1891
1892 offset = 0;
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001893 if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 )
1894 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001895
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001896 len = aes_test_ctr_len[u];
1897
1898 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001899 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001900 memcpy( buf, aes_test_ctr_ct[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001901 aes_tests = aes_test_ctr_pt[u];
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001902 }
1903 else
1904 {
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001905 memcpy( buf, aes_test_ctr_pt[u], len );
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001906 aes_tests = aes_test_ctr_ct[u];
1907 }
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001908
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001909 ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter,
1910 stream_block, buf, buf );
1911 if( ret != 0 )
1912 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001913
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001914 if( memcmp( buf, aes_tests, len ) != 0 )
1915 {
1916 ret = 1;
1917 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001918 }
1919
1920 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001921 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001922 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001923
1924 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001925 mbedtls_printf( "\n" );
1926#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001927
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001928 ret = 0;
1929
1930exit:
Andres Amaya Garcia58f98c22017-06-14 16:19:42 +01001931 if( ret != 0 && verbose != 0 )
1932 mbedtls_printf( "failed\n" );
1933
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001934 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001935
1936 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001937}
1938
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001939#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00001940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001941#endif /* MBEDTLS_AES_C */