2 * FIPS-197 compliant AES implementation
4 * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
6 * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * * Neither the names of PolarSSL or XySSL nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
38 * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
39 * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
42 #include "tropicssl/config.h"
44 #if defined(TROPICSSL_AES_C)
46 #include "tropicssl/aes.h"
47 #include "tropicssl/padlock.h"
52 * 32-bit integer manipulation macros (little endian)
55 #define GET_ULONG_LE(n,b,i) \
57 (n) = ( (unsigned long) (b)[(i) ] ) \
58 | ( (unsigned long) (b)[(i) + 1] << 8 ) \
59 | ( (unsigned long) (b)[(i) + 2] << 16 ) \
60 | ( (unsigned long) (b)[(i) + 3] << 24 ); \
65 #define PUT_ULONG_LE(n,b,i) \
67 (b)[(i) ] = (unsigned char) ( (n) ); \
68 (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
69 (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
70 (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
74 #if defined(TROPICSSL_AES_ROM_TABLES)
78 static const unsigned char FSb
[256] = {
79 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
80 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
81 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
82 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
83 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
84 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
85 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
86 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
87 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
88 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
89 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
90 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
91 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
92 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
93 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
94 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
95 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
96 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
97 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
98 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
99 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
100 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
101 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
102 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
103 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
104 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
105 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
106 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
107 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
108 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
109 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
110 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
118 V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
119 V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
120 V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
121 V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
122 V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
123 V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
124 V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
125 V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
126 V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
127 V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
128 V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
129 V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
130 V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
131 V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
132 V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
133 V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
134 V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
135 V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
136 V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
137 V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
138 V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
139 V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
140 V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
141 V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
142 V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
143 V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
144 V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
145 V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
146 V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
147 V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
148 V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
149 V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
150 V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
151 V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
152 V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
153 V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
154 V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
155 V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
156 V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
157 V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
158 V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
159 V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
160 V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
161 V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
162 V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
163 V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
164 V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
165 V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
166 V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
167 V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
168 V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
169 V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
170 V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
171 V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
172 V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
173 V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
174 V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
175 V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
176 V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
177 V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
178 V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
179 V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
180 V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
181 V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
183 #define V(a,b,c,d) 0x##a##b##c##d
184 static const unsigned long FT0
[256] = { FT
};
188 #define V(a,b,c,d) 0x##b##c##d##a
189 static const unsigned long FT1
[256] = { FT
};
193 #define V(a,b,c,d) 0x##c##d##a##b
194 static const unsigned long FT2
[256] = { FT
};
198 #define V(a,b,c,d) 0x##d##a##b##c
199 static const unsigned long FT3
[256] = { FT
};
208 static const unsigned char RSb
[256] = {
209 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
210 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
211 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
212 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
213 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
214 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
215 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
216 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
217 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
218 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
219 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
220 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
221 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
222 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
223 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
224 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
225 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
226 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
227 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
228 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
229 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
230 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
231 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
232 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
233 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
234 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
235 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
236 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
237 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
238 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
239 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
240 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
248 V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
249 V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
250 V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
251 V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
252 V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
253 V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
254 V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
255 V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
256 V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
257 V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
258 V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
259 V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
260 V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
261 V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
262 V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
263 V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
264 V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
265 V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
266 V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
267 V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
268 V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
269 V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
270 V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
271 V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
272 V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
273 V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
274 V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
275 V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
276 V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
277 V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
278 V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
279 V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
280 V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
281 V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
282 V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
283 V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
284 V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
285 V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
286 V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
287 V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
288 V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
289 V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
290 V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
291 V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
292 V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
293 V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
294 V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
295 V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
296 V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
297 V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
298 V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
299 V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
300 V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
301 V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
302 V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
303 V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
304 V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
305 V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
306 V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
307 V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
308 V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
309 V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
310 V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
311 V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
313 #define V(a,b,c,d) 0x##a##b##c##d
314 static const unsigned long RT0
[256] = { RT
};
318 #define V(a,b,c,d) 0x##b##c##d##a
319 static const unsigned long RT1
[256] = { RT
};
323 #define V(a,b,c,d) 0x##c##d##a##b
324 static const unsigned long RT2
[256] = { RT
};
328 #define V(a,b,c,d) 0x##d##a##b##c
329 static const unsigned long RT3
[256] = { RT
};
338 static const unsigned long RCON
[10] = {
339 0x00000001, 0x00000002, 0x00000004, 0x00000008,
340 0x00000010, 0x00000020, 0x00000040, 0x00000080,
341 0x0000001B, 0x00000036
347 * Forward S-box & tables
349 static unsigned char FSb
[256];
350 static unsigned long FT0
[256];
351 static unsigned long FT1
[256];
352 static unsigned long FT2
[256];
353 static unsigned long FT3
[256];
356 * Reverse S-box & tables
358 static unsigned char RSb
[256];
359 static unsigned long RT0
[256];
360 static unsigned long RT1
[256];
361 static unsigned long RT2
[256];
362 static unsigned long RT3
[256];
367 static unsigned long RCON
[10];
370 * Tables generation code
372 #define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
373 #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
374 #define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
376 static int aes_init_done
= 0;
378 static void aes_gen_tables(void)
385 * compute pow and log tables over GF(2^8)
387 for (i
= 0, x
= 1; i
< 256; i
++) {
390 x
= (x
^ XTIME(x
)) & 0xFF;
394 * calculate the round constants
396 for (i
= 0, x
= 1; i
< 10; i
++) {
397 RCON
[i
] = (unsigned long)x
;
402 * generate the forward and reverse S-boxes
407 for (i
= 1; i
< 256; i
++) {
408 x
= pow
[255 - log
[i
]];
411 y
= ((y
<< 1) | (y
>> 7)) & 0xFF;
413 y
= ((y
<< 1) | (y
>> 7)) & 0xFF;
415 y
= ((y
<< 1) | (y
>> 7)) & 0xFF;
417 y
= ((y
<< 1) | (y
>> 7)) & 0xFF;
420 FSb
[i
] = (unsigned char)x
;
421 RSb
[x
] = (unsigned char)i
;
425 * generate the forward and reverse tables
427 for (i
= 0; i
< 256; i
++) {
432 FT0
[i
] = ((unsigned long)y
) ^
433 ((unsigned long)x
<< 8) ^
434 ((unsigned long)x
<< 16) ^ ((unsigned long)z
<< 24);
436 FT1
[i
] = ROTL8(FT0
[i
]);
437 FT2
[i
] = ROTL8(FT1
[i
]);
438 FT3
[i
] = ROTL8(FT2
[i
]);
442 RT0
[i
] = ((unsigned long)MUL(0x0E, x
)) ^
443 ((unsigned long)MUL(0x09, x
) << 8) ^
444 ((unsigned long)MUL(0x0D, x
) << 16) ^
445 ((unsigned long)MUL(0x0B, x
) << 24);
447 RT1
[i
] = ROTL8(RT0
[i
]);
448 RT2
[i
] = ROTL8(RT1
[i
]);
449 RT3
[i
] = ROTL8(RT2
[i
]);
456 * AES key schedule (encryption)
458 void aes_setkey_enc(aes_context
* ctx
, const unsigned char *key
, int keysize
)
463 #if !defined(TROPICSSL_AES_ROM_TABLES)
464 if (aes_init_done
== 0) {
484 #if defined(PADLOCK_ALIGN16)
485 ctx
->rk
= RK
= PADLOCK_ALIGN16(ctx
->buf
);
487 ctx
->rk
= RK
= ctx
->buf
;
490 for (i
= 0; i
< (keysize
>> 5); i
++) {
491 GET_ULONG_LE(RK
[i
], key
, i
<< 2);
497 for (i
= 0; i
< 10; i
++, RK
+= 4) {
498 RK
[4] = RK
[0] ^ RCON
[i
] ^
499 ((unsigned long)FSb
[(RK
[3] >> 8) & 0xFF]) ^
500 ((unsigned long)FSb
[(RK
[3] >> 16) & 0xFF] << 8) ^
501 ((unsigned long)FSb
[(RK
[3] >> 24) & 0xFF] << 16) ^
502 ((unsigned long)FSb
[(RK
[3]) & 0xFF] << 24);
504 RK
[5] = RK
[1] ^ RK
[4];
505 RK
[6] = RK
[2] ^ RK
[5];
506 RK
[7] = RK
[3] ^ RK
[6];
512 for (i
= 0; i
< 8; i
++, RK
+= 6) {
513 RK
[6] = RK
[0] ^ RCON
[i
] ^
514 ((unsigned long)FSb
[(RK
[5] >> 8) & 0xFF]) ^
515 ((unsigned long)FSb
[(RK
[5] >> 16) & 0xFF] << 8) ^
516 ((unsigned long)FSb
[(RK
[5] >> 24) & 0xFF] << 16) ^
517 ((unsigned long)FSb
[(RK
[5]) & 0xFF] << 24);
519 RK
[7] = RK
[1] ^ RK
[6];
520 RK
[8] = RK
[2] ^ RK
[7];
521 RK
[9] = RK
[3] ^ RK
[8];
522 RK
[10] = RK
[4] ^ RK
[9];
523 RK
[11] = RK
[5] ^ RK
[10];
529 for (i
= 0; i
< 7; i
++, RK
+= 8) {
530 RK
[8] = RK
[0] ^ RCON
[i
] ^
531 ((unsigned long)FSb
[(RK
[7] >> 8) & 0xFF]) ^
532 ((unsigned long)FSb
[(RK
[7] >> 16) & 0xFF] << 8) ^
533 ((unsigned long)FSb
[(RK
[7] >> 24) & 0xFF] << 16) ^
534 ((unsigned long)FSb
[(RK
[7]) & 0xFF] << 24);
536 RK
[9] = RK
[1] ^ RK
[8];
537 RK
[10] = RK
[2] ^ RK
[9];
538 RK
[11] = RK
[3] ^ RK
[10];
541 ((unsigned long)FSb
[(RK
[11]) & 0xFF]) ^
542 ((unsigned long)FSb
[(RK
[11] >> 8) & 0xFF] << 8) ^
543 ((unsigned long)FSb
[(RK
[11] >> 16) & 0xFF] << 16) ^
544 ((unsigned long)FSb
[(RK
[11] >> 24) & 0xFF] << 24);
546 RK
[13] = RK
[5] ^ RK
[12];
547 RK
[14] = RK
[6] ^ RK
[13];
548 RK
[15] = RK
[7] ^ RK
[14];
559 * AES key schedule (decryption)
561 void aes_setkey_dec(aes_context
* ctx
, const unsigned char *key
, int keysize
)
582 #if defined(PADLOCK_ALIGN16)
583 ctx
->rk
= RK
= PADLOCK_ALIGN16(ctx
->buf
);
585 ctx
->rk
= RK
= ctx
->buf
;
588 aes_setkey_enc(&cty
, key
, keysize
);
589 SK
= cty
.rk
+ cty
.nr
* 4;
596 for (i
= ctx
->nr
- 1, SK
-= 8; i
> 0; i
--, SK
-= 8) {
597 for (j
= 0; j
< 4; j
++, SK
++) {
598 *RK
++ = RT0
[FSb
[(*SK
) & 0xFF]] ^
599 RT1
[FSb
[(*SK
>> 8) & 0xFF]] ^
600 RT2
[FSb
[(*SK
>> 16) & 0xFF]] ^
601 RT3
[FSb
[(*SK
>> 24) & 0xFF]];
610 memset(&cty
, 0, sizeof(aes_context
));
613 #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
615 X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \
616 FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
617 FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
618 FT3[ ( Y3 >> 24 ) & 0xFF ]; \
620 X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \
621 FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
622 FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
623 FT3[ ( Y0 >> 24 ) & 0xFF ]; \
625 X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \
626 FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
627 FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
628 FT3[ ( Y1 >> 24 ) & 0xFF ]; \
630 X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \
631 FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
632 FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
633 FT3[ ( Y2 >> 24 ) & 0xFF ]; \
636 #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
638 X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \
639 RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
640 RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
641 RT3[ ( Y1 >> 24 ) & 0xFF ]; \
643 X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \
644 RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
645 RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
646 RT3[ ( Y2 >> 24 ) & 0xFF ]; \
648 X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \
649 RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
650 RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
651 RT3[ ( Y3 >> 24 ) & 0xFF ]; \
653 X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \
654 RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
655 RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
656 RT3[ ( Y0 >> 24 ) & 0xFF ]; \
660 * AES-ECB block encryption/decryption
662 void aes_crypt_ecb(aes_context
* ctx
,
663 int mode
, const unsigned char input
[16],
664 unsigned char output
[16])
667 unsigned long *RK
, X0
, X1
, X2
, X3
, Y0
, Y1
, Y2
, Y3
;
669 #if defined(TROPICSSL_PADLOCK_C) && defined(TROPICSSL_HAVE_X86)
670 if (padlock_supports(PADLOCK_ACE
)) {
671 if (padlock_xcryptecb(ctx
, mode
, input
, output
) == 0)
678 GET_ULONG_LE(X0
, input
, 0);
680 GET_ULONG_LE(X1
, input
, 4);
682 GET_ULONG_LE(X2
, input
, 8);
684 GET_ULONG_LE(X3
, input
, 12);
687 if (mode
== AES_DECRYPT
) {
688 for (i
= (ctx
->nr
>> 1) - 1; i
> 0; i
--) {
689 AES_RROUND(Y0
, Y1
, Y2
, Y3
, X0
, X1
, X2
, X3
);
690 AES_RROUND(X0
, X1
, X2
, X3
, Y0
, Y1
, Y2
, Y3
);
693 AES_RROUND(Y0
, Y1
, Y2
, Y3
, X0
, X1
, X2
, X3
);
696 ((unsigned long)RSb
[(Y0
) & 0xFF]) ^
697 ((unsigned long)RSb
[(Y3
>> 8) & 0xFF] << 8) ^
698 ((unsigned long)RSb
[(Y2
>> 16) & 0xFF] << 16) ^
699 ((unsigned long)RSb
[(Y1
>> 24) & 0xFF] << 24);
702 ((unsigned long)RSb
[(Y1
) & 0xFF]) ^
703 ((unsigned long)RSb
[(Y0
>> 8) & 0xFF] << 8) ^
704 ((unsigned long)RSb
[(Y3
>> 16) & 0xFF] << 16) ^
705 ((unsigned long)RSb
[(Y2
>> 24) & 0xFF] << 24);
708 ((unsigned long)RSb
[(Y2
) & 0xFF]) ^
709 ((unsigned long)RSb
[(Y1
>> 8) & 0xFF] << 8) ^
710 ((unsigned long)RSb
[(Y0
>> 16) & 0xFF] << 16) ^
711 ((unsigned long)RSb
[(Y3
>> 24) & 0xFF] << 24);
714 ((unsigned long)RSb
[(Y3
) & 0xFF]) ^
715 ((unsigned long)RSb
[(Y2
>> 8) & 0xFF] << 8) ^
716 ((unsigned long)RSb
[(Y1
>> 16) & 0xFF] << 16) ^
717 ((unsigned long)RSb
[(Y0
>> 24) & 0xFF] << 24);
718 } else { /* AES_ENCRYPT */
719 for (i
= (ctx
->nr
>> 1) - 1; i
> 0; i
--) {
720 AES_FROUND(Y0
, Y1
, Y2
, Y3
, X0
, X1
, X2
, X3
);
721 AES_FROUND(X0
, X1
, X2
, X3
, Y0
, Y1
, Y2
, Y3
);
724 AES_FROUND(Y0
, Y1
, Y2
, Y3
, X0
, X1
, X2
, X3
);
727 ((unsigned long)FSb
[(Y0
) & 0xFF]) ^
728 ((unsigned long)FSb
[(Y1
>> 8) & 0xFF] << 8) ^
729 ((unsigned long)FSb
[(Y2
>> 16) & 0xFF] << 16) ^
730 ((unsigned long)FSb
[(Y3
>> 24) & 0xFF] << 24);
733 ((unsigned long)FSb
[(Y1
) & 0xFF]) ^
734 ((unsigned long)FSb
[(Y2
>> 8) & 0xFF] << 8) ^
735 ((unsigned long)FSb
[(Y3
>> 16) & 0xFF] << 16) ^
736 ((unsigned long)FSb
[(Y0
>> 24) & 0xFF] << 24);
739 ((unsigned long)FSb
[(Y2
) & 0xFF]) ^
740 ((unsigned long)FSb
[(Y3
>> 8) & 0xFF] << 8) ^
741 ((unsigned long)FSb
[(Y0
>> 16) & 0xFF] << 16) ^
742 ((unsigned long)FSb
[(Y1
>> 24) & 0xFF] << 24);
745 ((unsigned long)FSb
[(Y3
) & 0xFF]) ^
746 ((unsigned long)FSb
[(Y0
>> 8) & 0xFF] << 8) ^
747 ((unsigned long)FSb
[(Y1
>> 16) & 0xFF] << 16) ^
748 ((unsigned long)FSb
[(Y2
>> 24) & 0xFF] << 24);
751 PUT_ULONG_LE(X0
, output
, 0);
752 PUT_ULONG_LE(X1
, output
, 4);
753 PUT_ULONG_LE(X2
, output
, 8);
754 PUT_ULONG_LE(X3
, output
, 12);
758 * AES-CBC buffer encryption/decryption
760 void aes_crypt_cbc(aes_context
* ctx
,
763 unsigned char iv
[16],
764 const unsigned char *input
,
765 unsigned char *output
)
768 unsigned char temp
[16];
770 #if defined(TROPICSSL_PADLOCK_C) && defined(TROPICSSL_HAVE_X86)
771 if (padlock_supports(PADLOCK_ACE
)) {
772 if (padlock_xcryptcbc(ctx
, mode
, length
, iv
, input
, output
) ==
778 if (mode
== AES_DECRYPT
) {
780 memcpy(temp
, input
, 16);
781 aes_crypt_ecb(ctx
, mode
, input
, output
);
783 for (i
= 0; i
< 16; i
++)
784 output
[i
] = (unsigned char)(output
[i
] ^ iv
[i
]);
786 memcpy(iv
, temp
, 16);
794 for (i
= 0; i
< 16; i
++)
795 output
[i
] = (unsigned char)(input
[i
] ^ iv
[i
]);
797 aes_crypt_ecb(ctx
, mode
, output
, output
);
798 memcpy(iv
, output
, 16);
808 * AES-CFB128 buffer encryption/decryption
810 void aes_crypt_cfb128(aes_context
* ctx
,
814 unsigned char iv
[16],
815 const unsigned char *input
,
816 unsigned char *output
)
820 if (mode
== AES_DECRYPT
) {
823 aes_crypt_ecb(ctx
, AES_ENCRYPT
, iv
, iv
);
826 *output
++ = (unsigned char)(c
^ iv
[n
]);
827 iv
[n
] = (unsigned char)c
;
834 aes_crypt_ecb(ctx
, AES_ENCRYPT
, iv
, iv
);
836 iv
[n
] = *output
++ = (unsigned char)(iv
[n
] ^ *input
++);
845 #if defined(TROPICSSL_SELF_TEST)
850 * AES test vectors from:
852 * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
854 static const unsigned char aes_test_ecb_dec
[3][16] = {
856 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
857 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0},
859 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
860 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4},
862 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
863 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE}
866 static const unsigned char aes_test_ecb_enc
[3][16] = {
868 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
869 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F},
871 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
872 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14},
874 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
875 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4}
878 static const unsigned char aes_test_cbc_dec
[3][16] = {
880 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
881 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86},
883 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
884 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B},
886 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
887 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13}
890 static const unsigned char aes_test_cbc_enc
[3][16] = {
892 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
893 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D},
895 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
896 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04},
898 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
899 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0}
903 * AES-CFB128 test vectors from:
905 * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
907 static const unsigned char aes_test_cfb128_key
[3][32] = {
909 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
910 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C},
912 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
913 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
914 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B},
916 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
917 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
918 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
919 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4}
922 static const unsigned char aes_test_cfb128_iv
[16] = {
923 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
924 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
927 static const unsigned char aes_test_cfb128_pt
[64] = {
928 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
929 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
930 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
931 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
932 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
933 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
934 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
935 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
938 static const unsigned char aes_test_cfb128_ct
[3][64] = {
940 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
941 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
942 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
943 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
944 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
945 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
946 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
947 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6},
949 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
950 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
951 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
952 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
953 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
954 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
955 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
956 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF},
958 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
959 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
960 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
961 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
962 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
963 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
964 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
965 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71}
971 int aes_self_test(int verbose
)
973 int i
, j
, u
, v
, offset
;
974 unsigned char key
[32];
975 unsigned char buf
[64];
976 unsigned char prv
[16];
977 unsigned char iv
[16];
985 for (i
= 0; i
< 6; i
++) {
990 printf(" AES-ECB-%3d (%s): ", 128 + u
* 64,
991 (v
== AES_DECRYPT
) ? "dec" : "enc");
995 if (v
== AES_DECRYPT
) {
996 aes_setkey_dec(&ctx
, key
, 128 + u
* 64);
998 for (j
= 0; j
< 10000; j
++)
999 aes_crypt_ecb(&ctx
, v
, buf
, buf
);
1001 if (memcmp(buf
, aes_test_ecb_dec
[u
], 16) != 0) {
1008 aes_setkey_enc(&ctx
, key
, 128 + u
* 64);
1010 for (j
= 0; j
< 10000; j
++)
1011 aes_crypt_ecb(&ctx
, v
, buf
, buf
);
1013 if (memcmp(buf
, aes_test_ecb_enc
[u
], 16) != 0) {
1031 for (i
= 0; i
< 6; i
++) {
1036 printf(" AES-CBC-%3d (%s): ", 128 + u
* 64,
1037 (v
== AES_DECRYPT
) ? "dec" : "enc");
1043 if (v
== AES_DECRYPT
) {
1044 aes_setkey_dec(&ctx
, key
, 128 + u
* 64);
1046 for (j
= 0; j
< 10000; j
++)
1047 aes_crypt_cbc(&ctx
, v
, 16, iv
, buf
, buf
);
1049 if (memcmp(buf
, aes_test_cbc_dec
[u
], 16) != 0) {
1056 aes_setkey_enc(&ctx
, key
, 128 + u
* 64);
1058 for (j
= 0; j
< 10000; j
++) {
1059 unsigned char tmp
[16];
1061 aes_crypt_cbc(&ctx
, v
, 16, iv
, buf
, buf
);
1063 memcpy(tmp
, prv
, 16);
1064 memcpy(prv
, buf
, 16);
1065 memcpy(buf
, tmp
, 16);
1068 if (memcmp(prv
, aes_test_cbc_enc
[u
], 16) != 0) {
1086 for (i
= 0; i
< 6; i
++) {
1091 printf(" AES-CFB128-%3d (%s): ", 128 + u
* 64,
1092 (v
== AES_DECRYPT
) ? "dec" : "enc");
1094 memcpy(iv
, aes_test_cfb128_iv
, 16);
1095 memcpy(key
, aes_test_cfb128_key
[u
], 16 + u
* 8);
1098 aes_setkey_enc(&ctx
, key
, 128 + u
* 64);
1100 if (v
== AES_DECRYPT
) {
1101 memcpy(buf
, aes_test_cfb128_ct
[u
], 64);
1102 aes_crypt_cfb128(&ctx
, v
, 64, &offset
, iv
, buf
, buf
);
1104 if (memcmp(buf
, aes_test_cfb128_pt
, 64) != 0) {
1111 memcpy(buf
, aes_test_cfb128_pt
, 64);
1112 aes_crypt_cfb128(&ctx
, v
, 64, &offset
, iv
, buf
, buf
);
1114 if (memcmp(buf
, aes_test_cfb128_ct
[u
], 64) != 0) {