blob: 3e4ee31d087682b7961a7c734098f1a7743585a1 [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
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
24 *
25 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
26 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
27 */
28
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000030#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020033#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000036
Rich Evans00ab4702015-02-06 13:43:58 +000037#include <string.h>
38
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000039#include "mbedtls/aes.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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#if defined(MBEDTLS_SELF_TEST)
48#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000049#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010050#else
Rich Evans00ab4702015-02-06 13:43:58 +000051#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#define mbedtls_printf printf
53#endif /* MBEDTLS_PLATFORM_C */
54#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#if !defined(MBEDTLS_AES_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020057
Paul Bakker34617722014-06-13 17:20:13 +020058/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020060 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
61}
62
Paul Bakker5121ce52009-01-03 21:22:43 +000063/*
64 * 32-bit integer manipulation macros (little endian)
65 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000066#ifndef GET_UINT32_LE
67#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000068{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000069 (n) = ( (uint32_t) (b)[(i) ] ) \
70 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
71 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
72 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000073}
74#endif
75
Paul Bakker5c2364c2012-10-01 14:41:15 +000076#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000077#define PUT_UINT32_LE(n,b,i) \
78{ \
79 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
80 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
81 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
82 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000083}
84#endif
85
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020086#if defined(MBEDTLS_PADLOCK_C) && \
87 ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
Paul Bakker048d04e2012-02-12 17:31:04 +000088static int aes_padlock_ace = -1;
89#endif
90
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091#if defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +000092/*
93 * Forward S-box
94 */
95static const unsigned char FSb[256] =
96{
97 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
98 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
99 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
100 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
101 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
102 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
103 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
104 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
105 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
106 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
107 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
108 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
109 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
110 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
111 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
112 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
113 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
114 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
115 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
116 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
117 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
118 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
119 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
120 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
121 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
122 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
123 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
124 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
125 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
126 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
127 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
128 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
129};
130
131/*
132 * Forward tables
133 */
134#define FT \
135\
136 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
137 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
138 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
139 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
140 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
141 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
142 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
143 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
144 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
145 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
146 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
147 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
148 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
149 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
150 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
151 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
152 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
153 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
154 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
155 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
156 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
157 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
158 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
159 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
160 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
161 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
162 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
163 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
164 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
165 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
166 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
167 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
168 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
169 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
170 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
171 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
172 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
173 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
174 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
175 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
176 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
177 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
178 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
179 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
180 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
181 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
182 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
183 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
184 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
185 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
186 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
187 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
188 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
189 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
190 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
191 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
192 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
193 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
194 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
195 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
196 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
197 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
198 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
199 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
200
201#define V(a,b,c,d) 0x##a##b##c##d
Paul Bakker5c2364c2012-10-01 14:41:15 +0000202static const uint32_t FT0[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000203#undef V
204
205#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000206static const uint32_t FT1[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000207#undef V
208
209#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000210static const uint32_t FT2[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000211#undef V
212
213#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000214static const uint32_t FT3[256] = { FT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000215#undef V
216
217#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
332#define V(a,b,c,d) 0x##b##c##d##a
Paul Bakker5c2364c2012-10-01 14:41:15 +0000333static const uint32_t RT1[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000334#undef V
335
336#define V(a,b,c,d) 0x##c##d##a##b
Paul Bakker5c2364c2012-10-01 14:41:15 +0000337static const uint32_t RT2[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000338#undef V
339
340#define V(a,b,c,d) 0x##d##a##b##c
Paul Bakker5c2364c2012-10-01 14:41:15 +0000341static const uint32_t RT3[256] = { RT };
Paul Bakker5121ce52009-01-03 21:22:43 +0000342#undef V
343
344#undef RT
345
346/*
347 * Round constants
348 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000349static const uint32_t RCON[10] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000350{
351 0x00000001, 0x00000002, 0x00000004, 0x00000008,
352 0x00000010, 0x00000020, 0x00000040, 0x00000080,
353 0x0000001B, 0x00000036
354};
355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356#else /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000357
358/*
359 * Forward S-box & tables
360 */
361static unsigned char FSb[256];
Paul Bakker9af723c2014-05-01 13:03:14 +0200362static uint32_t FT0[256];
363static uint32_t FT1[256];
364static uint32_t FT2[256];
365static uint32_t FT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
367/*
368 * Reverse S-box & tables
369 */
370static unsigned char RSb[256];
Paul Bakker5c2364c2012-10-01 14:41:15 +0000371static uint32_t RT0[256];
372static uint32_t RT1[256];
373static uint32_t RT2[256];
374static uint32_t RT3[256];
Paul Bakker5121ce52009-01-03 21:22:43 +0000375
376/*
377 * Round constants
378 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000379static uint32_t RCON[10];
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
381/*
382 * Tables generation code
383 */
384#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
385#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
386#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
387
388static int aes_init_done = 0;
389
390static void aes_gen_tables( void )
391{
392 int i, x, y, z;
393 int pow[256];
394 int log[256];
395
396 /*
397 * compute pow and log tables over GF(2^8)
398 */
399 for( i = 0, x = 1; i < 256; i++ )
400 {
401 pow[i] = x;
402 log[x] = i;
403 x = ( x ^ XTIME( x ) ) & 0xFF;
404 }
405
406 /*
407 * calculate the round constants
408 */
409 for( i = 0, x = 1; i < 10; i++ )
410 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000411 RCON[i] = (uint32_t) x;
Paul Bakker5121ce52009-01-03 21:22:43 +0000412 x = XTIME( x ) & 0xFF;
413 }
414
415 /*
416 * generate the forward and reverse S-boxes
417 */
418 FSb[0x00] = 0x63;
419 RSb[0x63] = 0x00;
420
421 for( i = 1; i < 256; i++ )
422 {
423 x = pow[255 - log[i]];
424
Paul Bakker66d5d072014-06-17 16:39:18 +0200425 y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
426 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
427 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
428 x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
Paul Bakker5121ce52009-01-03 21:22:43 +0000429 x ^= y ^ 0x63;
430
431 FSb[i] = (unsigned char) x;
432 RSb[x] = (unsigned char) i;
433 }
434
435 /*
436 * generate the forward and reverse tables
437 */
438 for( i = 0; i < 256; i++ )
439 {
440 x = FSb[i];
441 y = XTIME( x ) & 0xFF;
442 z = ( y ^ x ) & 0xFF;
443
Paul Bakker5c2364c2012-10-01 14:41:15 +0000444 FT0[i] = ( (uint32_t) y ) ^
445 ( (uint32_t) x << 8 ) ^
446 ( (uint32_t) x << 16 ) ^
447 ( (uint32_t) z << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448
449 FT1[i] = ROTL8( FT0[i] );
450 FT2[i] = ROTL8( FT1[i] );
451 FT3[i] = ROTL8( FT2[i] );
452
453 x = RSb[i];
454
Paul Bakker5c2364c2012-10-01 14:41:15 +0000455 RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
456 ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
457 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
458 ( (uint32_t) MUL( 0x0B, x ) << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
460 RT1[i] = ROTL8( RT0[i] );
461 RT2[i] = ROTL8( RT1[i] );
462 RT3[i] = ROTL8( RT2[i] );
463 }
464}
465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466#endif /* MBEDTLS_AES_ROM_TABLES */
Paul Bakker5121ce52009-01-03 21:22:43 +0000467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468void mbedtls_aes_init( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200469{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470 memset( ctx, 0, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200471}
472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473void mbedtls_aes_free( mbedtls_aes_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200474{
475 if( ctx == NULL )
476 return;
477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478 mbedtls_zeroize( ctx, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200479}
480
Paul Bakker5121ce52009-01-03 21:22:43 +0000481/*
482 * AES key schedule (encryption)
483 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200484#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200486 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000487{
Paul Bakker23986e52011-04-24 08:57:21 +0000488 unsigned int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000489 uint32_t *RK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000490
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200491#if !defined(MBEDTLS_AES_ROM_TABLES)
Paul Bakker5121ce52009-01-03 21:22:43 +0000492 if( aes_init_done == 0 )
493 {
494 aes_gen_tables();
495 aes_init_done = 1;
Paul Bakker048d04e2012-02-12 17:31:04 +0000496
Paul Bakker5121ce52009-01-03 21:22:43 +0000497 }
498#endif
499
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200500 switch( keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000501 {
502 case 128: ctx->nr = 10; break;
503 case 192: ctx->nr = 12; break;
504 case 256: ctx->nr = 14; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505 default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 }
507
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000509 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100510 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000511
512 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000514 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000515#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000516 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100519 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200520 return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
Manuel Pégourié-Gonnard47a35362013-12-28 20:45:04 +0100521#endif
522
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200523 for( i = 0; i < ( keybits >> 5 ); i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000524 {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000525 GET_UINT32_LE( RK[i], key, i << 2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000526 }
527
528 switch( ctx->nr )
529 {
530 case 10:
531
532 for( i = 0; i < 10; i++, RK += 4 )
533 {
534 RK[4] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000535 ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
536 ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
537 ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
538 ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000539
540 RK[5] = RK[1] ^ RK[4];
541 RK[6] = RK[2] ^ RK[5];
542 RK[7] = RK[3] ^ RK[6];
543 }
544 break;
545
546 case 12:
547
548 for( i = 0; i < 8; i++, RK += 6 )
549 {
550 RK[6] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000551 ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
552 ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
553 ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
554 ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000555
556 RK[7] = RK[1] ^ RK[6];
557 RK[8] = RK[2] ^ RK[7];
558 RK[9] = RK[3] ^ RK[8];
559 RK[10] = RK[4] ^ RK[9];
560 RK[11] = RK[5] ^ RK[10];
561 }
562 break;
563
564 case 14:
565
566 for( i = 0; i < 7; i++, RK += 8 )
567 {
568 RK[8] = RK[0] ^ RCON[i] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000569 ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
570 ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
571 ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
572 ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
574 RK[9] = RK[1] ^ RK[8];
575 RK[10] = RK[2] ^ RK[9];
576 RK[11] = RK[3] ^ RK[10];
577
578 RK[12] = RK[4] ^
Paul Bakker5c2364c2012-10-01 14:41:15 +0000579 ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
580 ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
581 ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
582 ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000583
584 RK[13] = RK[5] ^ RK[12];
585 RK[14] = RK[6] ^ RK[13];
586 RK[15] = RK[7] ^ RK[14];
587 }
588 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000589 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000590
591 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000592}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200593#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000594
595/*
596 * AES key schedule (decryption)
597 */
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200598#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200600 unsigned int keybits )
Paul Bakker5121ce52009-01-03 21:22:43 +0000601{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200602 int i, j, ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_aes_context cty;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000604 uint32_t *RK;
605 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200606
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 mbedtls_aes_init( &cty );
Paul Bakker5121ce52009-01-03 21:22:43 +0000608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
Paul Bakker048d04e2012-02-12 17:31:04 +0000610 if( aes_padlock_ace == -1 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100611 aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
Paul Bakker048d04e2012-02-12 17:31:04 +0000612
613 if( aes_padlock_ace )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
Paul Bakker048d04e2012-02-12 17:31:04 +0000615 else
Paul Bakker5121ce52009-01-03 21:22:43 +0000616#endif
Paul Bakker048d04e2012-02-12 17:31:04 +0000617 ctx->rk = RK = ctx->buf;
Paul Bakker5121ce52009-01-03 21:22:43 +0000618
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200619 /* Also checks keybits */
620 if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200621 goto exit;
Paul Bakker2b222c82009-07-27 21:03:45 +0000622
Manuel Pégourié-Gonnardafd5a082014-05-28 21:52:59 +0200623 ctx->nr = cty.nr;
624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100626 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100627 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628 mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100629 (const unsigned char *) cty.rk, ctx->nr );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200630 goto exit;
Manuel Pégourié-Gonnard01e31bb2013-12-28 15:58:30 +0100631 }
632#endif
633
Paul Bakker5121ce52009-01-03 21:22:43 +0000634 SK = cty.rk + cty.nr * 4;
635
636 *RK++ = *SK++;
637 *RK++ = *SK++;
638 *RK++ = *SK++;
639 *RK++ = *SK++;
640
641 for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
642 {
643 for( j = 0; j < 4; j++, SK++ )
644 {
645 *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
646 RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
647 RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
648 RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
649 }
650 }
651
652 *RK++ = *SK++;
653 *RK++ = *SK++;
654 *RK++ = *SK++;
655 *RK++ = *SK++;
656
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200657exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658 mbedtls_aes_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000659
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200660 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000661}
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200662#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
664#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
665{ \
666 X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \
667 FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
668 FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
669 FT3[ ( Y3 >> 24 ) & 0xFF ]; \
670 \
671 X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \
672 FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
673 FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
674 FT3[ ( Y0 >> 24 ) & 0xFF ]; \
675 \
676 X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \
677 FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
678 FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
679 FT3[ ( Y1 >> 24 ) & 0xFF ]; \
680 \
681 X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \
682 FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
683 FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
684 FT3[ ( Y2 >> 24 ) & 0xFF ]; \
685}
686
687#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
688{ \
689 X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \
690 RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
691 RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
692 RT3[ ( Y1 >> 24 ) & 0xFF ]; \
693 \
694 X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \
695 RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
696 RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
697 RT3[ ( Y2 >> 24 ) & 0xFF ]; \
698 \
699 X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \
700 RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
701 RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
702 RT3[ ( Y3 >> 24 ) & 0xFF ]; \
703 \
704 X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \
705 RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
706 RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
707 RT3[ ( Y0 >> 24 ) & 0xFF ]; \
708}
709
710/*
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200711 * AES-ECB block encryption
712 */
713#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
714void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
715 const unsigned char input[16],
716 unsigned char output[16] )
717{
718 int i;
719 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
720
721 RK = ctx->rk;
722
723 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
724 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
725 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
726 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
727
728 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
729 {
730 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
731 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
732 }
733
734 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
735
736 X0 = *RK++ ^ \
737 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
738 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
739 ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
740 ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
741
742 X1 = *RK++ ^ \
743 ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
744 ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
745 ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
746 ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
747
748 X2 = *RK++ ^ \
749 ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
750 ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
751 ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
752 ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
753
754 X3 = *RK++ ^ \
755 ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
756 ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
757 ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
758 ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
759
760 PUT_UINT32_LE( X0, output, 0 );
761 PUT_UINT32_LE( X1, output, 4 );
762 PUT_UINT32_LE( X2, output, 8 );
763 PUT_UINT32_LE( X3, output, 12 );
764}
765#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
766
767/*
768 * AES-ECB block decryption
769 */
770#if !defined(MBEDTLS_AES_DECRYPT_ALT)
771void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
772 const unsigned char input[16],
773 unsigned char output[16] )
774{
775 int i;
776 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
777
778 RK = ctx->rk;
779
780 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
781 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
782 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
783 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
784
785 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
786 {
787 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
788 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
789 }
790
791 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
792
793 X0 = *RK++ ^ \
794 ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
795 ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
796 ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
797 ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
798
799 X1 = *RK++ ^ \
800 ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
801 ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
802 ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
803 ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
804
805 X2 = *RK++ ^ \
806 ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
807 ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
808 ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
809 ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
810
811 X3 = *RK++ ^ \
812 ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
813 ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
814 ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
815 ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
816
817 PUT_UINT32_LE( X0, output, 0 );
818 PUT_UINT32_LE( X1, output, 4 );
819 PUT_UINT32_LE( X2, output, 8 );
820 PUT_UINT32_LE( X3, output, 12 );
821}
822#endif /* !MBEDTLS_AES_DECRYPT_ALT */
823
824/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000825 * AES-ECB block encryption/decryption
826 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200827int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000828 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000829 const unsigned char input[16],
Paul Bakker5121ce52009-01-03 21:22:43 +0000830 unsigned char output[16] )
831{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200832#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100833 if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834 return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
Manuel Pégourié-Gonnard5b685652013-12-18 11:45:21 +0100835#endif
836
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200837#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +0000838 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +0000839 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200840 if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000841 return( 0 );
842
843 // If padlock data misaligned, we just fall back to
844 // unaccelerated mode
845 //
Paul Bakker5121ce52009-01-03 21:22:43 +0000846 }
847#endif
848
Manuel Pégourié-Gonnard31993f22015-05-12 15:41:08 +0200849 if( mode == MBEDTLS_AES_ENCRYPT )
850 mbedtls_aes_encrypt( ctx, input, output );
851 else
852 mbedtls_aes_decrypt( ctx, input, output );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000853
854 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000855}
856
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000858/*
859 * AES-CBC buffer encryption/decryption
860 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000862 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000863 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +0000864 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000865 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000866 unsigned char *output )
867{
868 int i;
869 unsigned char temp[16];
870
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000871 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200872 return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000873
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
Paul Bakker048d04e2012-02-12 17:31:04 +0000875 if( aes_padlock_ace )
Paul Bakker5121ce52009-01-03 21:22:43 +0000876 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877 if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000878 return( 0 );
Paul Bakker9af723c2014-05-01 13:03:14 +0200879
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000880 // If padlock data misaligned, we just fall back to
881 // unaccelerated mode
882 //
Paul Bakker5121ce52009-01-03 21:22:43 +0000883 }
884#endif
885
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +0000887 {
888 while( length > 0 )
889 {
890 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200891 mbedtls_aes_crypt_ecb( ctx, mode, input, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000892
893 for( i = 0; i < 16; i++ )
894 output[i] = (unsigned char)( output[i] ^ iv[i] );
895
896 memcpy( iv, temp, 16 );
897
898 input += 16;
899 output += 16;
900 length -= 16;
901 }
902 }
903 else
904 {
905 while( length > 0 )
906 {
907 for( i = 0; i < 16; i++ )
908 output[i] = (unsigned char)( input[i] ^ iv[i] );
909
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 mbedtls_aes_crypt_ecb( ctx, mode, output, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000911 memcpy( iv, output, 16 );
912
913 input += 16;
914 output += 16;
915 length -= 16;
916 }
917 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000918
919 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000920}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000922
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +0000924/*
925 * AES-CFB128 buffer encryption/decryption
926 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000928 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000929 size_t length,
Paul Bakker27fdf462011-06-09 13:55:13 +0000930 size_t *iv_off,
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{
Paul Bakker27fdf462011-06-09 13:55:13 +0000935 int c;
936 size_t n = *iv_off;
Paul Bakker5121ce52009-01-03 21:22:43 +0000937
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200938 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +0000939 {
940 while( length-- )
941 {
942 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +0000944
945 c = *input++;
946 *output++ = (unsigned char)( c ^ iv[n] );
947 iv[n] = (unsigned char) c;
948
Paul Bakker66d5d072014-06-17 16:39:18 +0200949 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +0000950 }
951 }
952 else
953 {
954 while( length-- )
955 {
956 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker5121ce52009-01-03 21:22:43 +0000958
959 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
960
Paul Bakker66d5d072014-06-17 16:39:18 +0200961 n = ( n + 1 ) & 0x0F;
Paul Bakker5121ce52009-01-03 21:22:43 +0000962 }
963 }
964
965 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000966
967 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000968}
Paul Bakker556efba2014-01-24 15:38:12 +0100969
970/*
971 * AES-CFB8 buffer encryption/decryption
972 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
Paul Bakker556efba2014-01-24 15:38:12 +0100974 int mode,
975 size_t length,
976 unsigned char iv[16],
977 const unsigned char *input,
978 unsigned char *output )
979{
980 unsigned char c;
981 unsigned char ov[17];
982
983 while( length-- )
984 {
Paul Bakker66d5d072014-06-17 16:39:18 +0200985 memcpy( ov, iv, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200986 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
Paul Bakker556efba2014-01-24 15:38:12 +0100987
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 if( mode == MBEDTLS_AES_DECRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +0100989 ov[16] = *input;
990
991 c = *output++ = (unsigned char)( iv[0] ^ *input++ );
992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 if( mode == MBEDTLS_AES_ENCRYPT )
Paul Bakker556efba2014-01-24 15:38:12 +0100994 ov[16] = c;
995
Paul Bakker66d5d072014-06-17 16:39:18 +0200996 memcpy( iv, ov + 1, 16 );
Paul Bakker556efba2014-01-24 15:38:12 +0100997 }
998
999 return( 0 );
1000}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001#endif /*MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001002
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001004/*
1005 * AES-CTR buffer encryption/decryption
1006 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
Paul Bakker27fdf462011-06-09 13:55:13 +00001008 size_t length,
1009 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001010 unsigned char nonce_counter[16],
1011 unsigned char stream_block[16],
1012 const unsigned char *input,
1013 unsigned char *output )
1014{
Paul Bakker369e14b2012-04-18 14:16:09 +00001015 int c, i;
Paul Bakker27fdf462011-06-09 13:55:13 +00001016 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001017
1018 while( length-- )
1019 {
1020 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021 mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001022
Paul Bakker369e14b2012-04-18 14:16:09 +00001023 for( i = 16; i > 0; i-- )
1024 if( ++nonce_counter[i - 1] != 0 )
1025 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001026 }
1027 c = *input++;
1028 *output++ = (unsigned char)( c ^ stream_block[n] );
1029
Paul Bakker66d5d072014-06-17 16:39:18 +02001030 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001031 }
1032
1033 *nc_off = n;
1034
1035 return( 0 );
1036}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037#endif /* MBEDTLS_CIPHER_MODE_CTR */
Manuel Pégourié-Gonnard1ec220b2014-03-10 11:20:17 +01001038
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001039#endif /* !MBEDTLS_AES_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +00001040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001042/*
1043 * AES test vectors from:
1044 *
1045 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
1046 */
1047static const unsigned char aes_test_ecb_dec[3][16] =
1048{
1049 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
1050 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
1051 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
1052 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
1053 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
1054 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
1055};
1056
1057static const unsigned char aes_test_ecb_enc[3][16] =
1058{
1059 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
1060 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
1061 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
1062 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
1063 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
1064 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
1065};
1066
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001068static const unsigned char aes_test_cbc_dec[3][16] =
1069{
1070 { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
1071 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
1072 { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
1073 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
1074 { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
1075 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
1076};
1077
1078static const unsigned char aes_test_cbc_enc[3][16] =
1079{
1080 { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
1081 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
1082 { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
1083 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
1084 { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
1085 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
1086};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001090/*
1091 * AES-CFB128 test vectors from:
1092 *
1093 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
1094 */
1095static const unsigned char aes_test_cfb128_key[3][32] =
1096{
1097 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
1098 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
1099 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
1100 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
1101 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
1102 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
1103 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
1104 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
1105 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
1106};
1107
1108static const unsigned char aes_test_cfb128_iv[16] =
1109{
1110 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1111 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
1112};
1113
1114static const unsigned char aes_test_cfb128_pt[64] =
1115{
1116 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
1117 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
1118 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
1119 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
1120 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
1121 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
1122 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
1123 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
1124};
1125
1126static const unsigned char aes_test_cfb128_ct[3][64] =
1127{
1128 { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
1129 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
1130 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
1131 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
1132 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
1133 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
1134 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
1135 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
1136 { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
1137 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
1138 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
1139 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
1140 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
1141 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
1142 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
1143 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
1144 { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
1145 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
1146 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
1147 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
1148 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
1149 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
1150 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
1151 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
1152};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001156/*
1157 * AES-CTR test vectors from:
1158 *
1159 * http://www.faqs.org/rfcs/rfc3686.html
1160 */
1161
1162static const unsigned char aes_test_ctr_key[3][16] =
1163{
1164 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
1165 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
1166 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
1167 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
1168 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
1169 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
1170};
1171
1172static const unsigned char aes_test_ctr_nonce_counter[3][16] =
1173{
1174 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
1175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
1176 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
1177 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
1178 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
1179 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
1180};
1181
1182static const unsigned char aes_test_ctr_pt[3][48] =
1183{
1184 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
1185 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
1186
1187 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1188 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1189 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1190 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
1191
1192 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1193 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1194 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1195 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1196 0x20, 0x21, 0x22, 0x23 }
1197};
1198
1199static const unsigned char aes_test_ctr_ct[3][48] =
1200{
1201 { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
1202 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
1203 { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
1204 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
1205 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
1206 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
1207 { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
1208 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
1209 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
1210 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
1211 0x25, 0xB2, 0x07, 0x2F }
1212};
1213
1214static const int aes_test_ctr_len[3] =
1215 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001216#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001217
1218/*
1219 * Checkup routine
1220 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221int mbedtls_aes_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +00001222{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001223 int ret = 0, i, j, u, v;
Paul Bakker5121ce52009-01-03 21:22:43 +00001224 unsigned char key[32];
1225 unsigned char buf[64];
Paul Bakker5121ce52009-01-03 21:22:43 +00001226 unsigned char iv[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001228 unsigned char prv[16];
1229#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001230#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker27fdf462011-06-09 13:55:13 +00001231 size_t offset;
Paul Bakkere91d01e2011-04-19 15:55:50 +00001232#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001233#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkere91d01e2011-04-19 15:55:50 +00001234 int len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001235 unsigned char nonce_counter[16];
1236 unsigned char stream_block[16];
1237#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001238 mbedtls_aes_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +00001239
1240 memset( key, 0, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241 mbedtls_aes_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00001242
1243 /*
1244 * ECB mode
1245 */
1246 for( i = 0; i < 6; i++ )
1247 {
1248 u = i >> 1;
1249 v = i & 1;
1250
1251 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001252 mbedtls_printf( " AES-ECB-%3d (%s): ", 128 + u * 64,
1253 ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001254
1255 memset( buf, 0, 16 );
1256
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001257 if( v == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001258 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001259 mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001260
1261 for( j = 0; j < 10000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262 mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001263
1264 if( memcmp( buf, aes_test_ecb_dec[u], 16 ) != 0 )
1265 {
1266 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001267 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001268
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001269 ret = 1;
1270 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001271 }
1272 }
1273 else
1274 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001275 mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001276
1277 for( j = 0; j < 10000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278 mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001279
1280 if( memcmp( buf, aes_test_ecb_enc[u], 16 ) != 0 )
1281 {
1282 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001283 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001284
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001285 ret = 1;
1286 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001287 }
1288 }
1289
1290 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001291 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001292 }
1293
1294 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001295 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001297#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +00001298 /*
1299 * CBC mode
1300 */
1301 for( i = 0; i < 6; i++ )
1302 {
1303 u = i >> 1;
1304 v = i & 1;
1305
1306 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001307 mbedtls_printf( " AES-CBC-%3d (%s): ", 128 + u * 64,
1308 ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001309
1310 memset( iv , 0, 16 );
1311 memset( prv, 0, 16 );
1312 memset( buf, 0, 16 );
1313
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001314 if( v == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001315 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316 mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001317
1318 for( j = 0; j < 10000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001319 mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001320
1321 if( memcmp( buf, aes_test_cbc_dec[u], 16 ) != 0 )
1322 {
1323 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001325
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001326 ret = 1;
1327 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001328 }
1329 }
1330 else
1331 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001332 mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001333
1334 for( j = 0; j < 10000; j++ )
1335 {
1336 unsigned char tmp[16];
1337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338 mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001339
1340 memcpy( tmp, prv, 16 );
1341 memcpy( prv, buf, 16 );
1342 memcpy( buf, tmp, 16 );
1343 }
1344
1345 if( memcmp( prv, aes_test_cbc_enc[u], 16 ) != 0 )
1346 {
1347 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001349
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001350 ret = 1;
1351 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001352 }
1353 }
1354
1355 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001356 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001357 }
1358
1359 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001360 mbedtls_printf( "\n" );
1361#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001363#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker5121ce52009-01-03 21:22:43 +00001364 /*
1365 * CFB128 mode
1366 */
1367 for( i = 0; i < 6; i++ )
1368 {
1369 u = i >> 1;
1370 v = i & 1;
1371
1372 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001373 mbedtls_printf( " AES-CFB128-%3d (%s): ", 128 + u * 64,
1374 ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001375
1376 memcpy( iv, aes_test_cfb128_iv, 16 );
1377 memcpy( key, aes_test_cfb128_key[u], 16 + u * 8 );
1378
1379 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380 mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382 if( v == MBEDTLS_AES_DECRYPT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001383 {
1384 memcpy( buf, aes_test_cfb128_ct[u], 64 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001385 mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001386
1387 if( memcmp( buf, aes_test_cfb128_pt, 64 ) != 0 )
1388 {
1389 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001390 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001391
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001392 ret = 1;
1393 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001394 }
1395 }
1396 else
1397 {
1398 memcpy( buf, aes_test_cfb128_pt, 64 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001399 mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00001400
1401 if( memcmp( buf, aes_test_cfb128_ct[u], 64 ) != 0 )
1402 {
1403 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001404 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001405
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001406 ret = 1;
1407 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001408 }
1409 }
1410
1411 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001412 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001413 }
1414
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001415 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001416 mbedtls_printf( "\n" );
1417#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001420 /*
1421 * CTR mode
1422 */
1423 for( i = 0; i < 6; i++ )
1424 {
1425 u = i >> 1;
1426 v = i & 1;
1427
1428 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001429 mbedtls_printf( " AES-CTR-128 (%s): ",
1430 ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001431
1432 memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
1433 memcpy( key, aes_test_ctr_key[u], 16 );
1434
1435 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001436 mbedtls_aes_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438 if( v == MBEDTLS_AES_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001439 {
1440 len = aes_test_ctr_len[u];
1441 memcpy( buf, aes_test_ctr_ct[u], len );
1442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443 mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001444 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001445
1446 if( memcmp( buf, aes_test_ctr_pt[u], len ) != 0 )
1447 {
1448 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001450
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001451 ret = 1;
1452 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001453 }
1454 }
1455 else
1456 {
1457 len = aes_test_ctr_len[u];
1458 memcpy( buf, aes_test_ctr_pt[u], len );
1459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460 mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001461 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001462
1463 if( memcmp( buf, aes_test_ctr_ct[u], len ) != 0 )
1464 {
1465 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001467
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001468 ret = 1;
1469 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001470 }
1471 }
1472
1473 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001474 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001475 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001476
1477 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001478 mbedtls_printf( "\n" );
1479#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker5121ce52009-01-03 21:22:43 +00001480
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001481 ret = 0;
1482
1483exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001484 mbedtls_aes_free( &ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001485
1486 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001487}
1488
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001489#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +00001490
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001491#endif /* MBEDTLS_AES_C */