00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _CRT_SECURE_NO_DEPRECATE
00031 #define _CRT_SECURE_NO_DEPRECATE 1
00032 #endif
00033
00034 #include <string.h>
00035
00036 #include "xyssl/aes.h"
00037
00038 #ifndef uint8
00039 #define uint8 unsigned char
00040 #endif
00041
00042 #ifndef uint32
00043 #define uint32 unsigned long
00044 #endif
00045
00046
00047
00048
00049 #ifndef GET_UINT32_BE
00050 #define GET_UINT32_BE(n,b,i) \
00051 { \
00052 (n) = ( (uint32) (b)[(i) ] << 24 ) \
00053 | ( (uint32) (b)[(i) + 1] << 16 ) \
00054 | ( (uint32) (b)[(i) + 2] << 8 ) \
00055 | ( (uint32) (b)[(i) + 3] ); \
00056 }
00057 #endif
00058 #ifndef PUT_UINT32_BE
00059 #define PUT_UINT32_BE(n,b,i) \
00060 { \
00061 (b)[(i) ] = (uint8) ( (n) >> 24 ); \
00062 (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \
00063 (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \
00064 (b)[(i) + 3] = (uint8) ( (n) ); \
00065 }
00066 #endif
00067
00068
00069
00070
00071
00072
00073
00074
00075 #if !defined(FIXED_TABLES)
00076
00077
00078
00079
00080 static uint8 FSb[256];
00081 static uint32 FT0[256];
00082 static uint32 FT1[256];
00083 static uint32 FT2[256];
00084 static uint32 FT3[256];
00085
00086
00087
00088
00089 static uint8 RSb[256];
00090 static uint32 RT0[256];
00091 static uint32 RT1[256];
00092 static uint32 RT2[256];
00093 static uint32 RT3[256];
00094
00095
00096
00097
00098 static uint32 RCON[10];
00099
00100
00101
00102
00103 #define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | \
00104 ( ( x & 0xFFFFFFFF ) >> 8 ) )
00105 #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
00106 #define MUL(x,y) ( ( x && y ) ? pow[(log[x] + log[y]) % 255] : 0 )
00107
00108 static void aes_gen_tables( void )
00109 {
00110 int i;
00111 uint8 x, y;
00112 uint8 pow[256];
00113 uint8 log[256];
00114
00115
00116
00117
00118 for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )
00119 {
00120 pow[i] = x;
00121 log[x] = i;
00122 }
00123
00124
00125
00126
00127 for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )
00128 {
00129 RCON[i] = (uint32) x << 24;
00130 }
00131
00132
00133
00134
00135 FSb[0x00] = 0x63;
00136 RSb[0x63] = 0x00;
00137
00138 for( i = 1; i < 256; i++ )
00139 {
00140 x = pow[255 - log[i]];
00141
00142 y = x; y = ( y << 1 ) | ( y >> 7 );
00143 x ^= y; y = ( y << 1 ) | ( y >> 7 );
00144 x ^= y; y = ( y << 1 ) | ( y >> 7 );
00145 x ^= y; y = ( y << 1 ) | ( y >> 7 );
00146 x ^= y ^ 0x63;
00147
00148 FSb[i] = x;
00149 RSb[x] = i;
00150 }
00151
00152
00153
00154
00155 for( i = 0; i < 256; i++ )
00156 {
00157 x = FSb[i]; y = XTIME( x );
00158
00159 FT0[i] = (uint32) ( x ^ y ) ^
00160 ( (uint32) x << 8 ) ^
00161 ( (uint32) x << 16 ) ^
00162 ( (uint32) y << 24 );
00163
00164 FT0[i] &= 0xFFFFFFFF;
00165
00166 FT1[i] = ROTR8( FT0[i] );
00167 FT2[i] = ROTR8( FT1[i] );
00168 FT3[i] = ROTR8( FT2[i] );
00169
00170 y = RSb[i];
00171
00172 RT0[i] = ( (uint32) MUL( 0x0B, y ) ) ^
00173 ( (uint32) MUL( 0x0D, y ) << 8 ) ^
00174 ( (uint32) MUL( 0x09, y ) << 16 ) ^
00175 ( (uint32) MUL( 0x0E, y ) << 24 );
00176
00177 RT0[i] &= 0xFFFFFFFF;
00178
00179 RT1[i] = ROTR8( RT0[i] );
00180 RT2[i] = ROTR8( RT1[i] );
00181 RT3[i] = ROTR8( RT2[i] );
00182 }
00183 }
00184
00185 #else
00186
00187
00188
00189
00190 static const uint8 FSb[256] =
00191 {
00192 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
00193 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
00194 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
00195 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
00196 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
00197 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
00198 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
00199 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
00200 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
00201 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
00202 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
00203 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
00204 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
00205 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
00206 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
00207 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
00208 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
00209 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
00210 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
00211 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
00212 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
00213 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
00214 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
00215 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
00216 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
00217 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
00218 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
00219 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
00220 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
00221 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
00222 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
00223 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
00224 };
00225
00226
00227
00228
00229 #define FT \
00230 \
00231 V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \
00232 V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \
00233 V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \
00234 V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \
00235 V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \
00236 V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \
00237 V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \
00238 V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \
00239 V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \
00240 V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \
00241 V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \
00242 V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \
00243 V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \
00244 V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \
00245 V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \
00246 V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \
00247 V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \
00248 V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \
00249 V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \
00250 V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \
00251 V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \
00252 V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \
00253 V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \
00254 V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \
00255 V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \
00256 V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \
00257 V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \
00258 V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \
00259 V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \
00260 V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \
00261 V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \
00262 V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \
00263 V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \
00264 V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \
00265 V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \
00266 V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \
00267 V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \
00268 V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \
00269 V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \
00270 V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \
00271 V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \
00272 V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \
00273 V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \
00274 V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \
00275 V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \
00276 V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \
00277 V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \
00278 V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \
00279 V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \
00280 V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \
00281 V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \
00282 V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \
00283 V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \
00284 V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \
00285 V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \
00286 V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \
00287 V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \
00288 V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \
00289 V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \
00290 V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \
00291 V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \
00292 V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \
00293 V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \
00294 V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)
00295
00296 #define V(a,b,c,d) 0x##a##b##c##d
00297 static const uint32 FT0[256] = { FT };
00298 #undef V
00299
00300 #define V(a,b,c,d) 0x##d##a##b##c
00301 static const uint32 FT1[256] = { FT };
00302 #undef V
00303
00304 #define V(a,b,c,d) 0x##c##d##a##b
00305 static const uint32 FT2[256] = { FT };
00306 #undef V
00307
00308 #define V(a,b,c,d) 0x##b##c##d##a
00309 static const uint32 FT3[256] = { FT };
00310 #undef V
00311
00312 #undef FT
00313
00314
00315
00316
00317 static const uint8 RSb[256] =
00318 {
00319 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
00320 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
00321 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
00322 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
00323 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
00324 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
00325 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
00326 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
00327 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
00328 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
00329 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
00330 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
00331 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
00332 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
00333 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
00334 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
00335 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
00336 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
00337 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
00338 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
00339 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
00340 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
00341 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
00342 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
00343 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
00344 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
00345 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
00346 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
00347 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
00348 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
00349 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
00350 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
00351 };
00352
00353
00354
00355
00356 #define RT \
00357 \
00358 V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \
00359 V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \
00360 V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \
00361 V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \
00362 V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \
00363 V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \
00364 V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \
00365 V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \
00366 V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \
00367 V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \
00368 V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \
00369 V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \
00370 V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \
00371 V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \
00372 V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \
00373 V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \
00374 V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \
00375 V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \
00376 V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \
00377 V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \
00378 V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \
00379 V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \
00380 V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \
00381 V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \
00382 V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \
00383 V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \
00384 V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \
00385 V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \
00386 V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \
00387 V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \
00388 V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \
00389 V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \
00390 V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \
00391 V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \
00392 V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \
00393 V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \
00394 V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \
00395 V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \
00396 V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \
00397 V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \
00398 V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \
00399 V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \
00400 V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \
00401 V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \
00402 V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \
00403 V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \
00404 V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \
00405 V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \
00406 V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \
00407 V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \
00408 V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \
00409 V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \
00410 V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \
00411 V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \
00412 V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \
00413 V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \
00414 V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \
00415 V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \
00416 V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \
00417 V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \
00418 V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \
00419 V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \
00420 V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \
00421 V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42)
00422
00423 #define V(a,b,c,d) 0x##a##b##c##d
00424 static const uint32 RT0[256] = { RT };
00425 #undef V
00426
00427 #define V(a,b,c,d) 0x##d##a##b##c
00428 static const uint32 RT1[256] = { RT };
00429 #undef V
00430
00431 #define V(a,b,c,d) 0x##c##d##a##b
00432 static const uint32 RT2[256] = { RT };
00433 #undef V
00434
00435 #define V(a,b,c,d) 0x##b##c##d##a
00436 static const uint32 RT3[256] = { RT };
00437 #undef V
00438
00439 #undef RT
00440
00441
00442
00443
00444 static const uint32 RCON[10] =
00445 {
00446 0x01000000, 0x02000000, 0x04000000, 0x08000000,
00447 0x10000000, 0x20000000, 0x40000000, 0x80000000,
00448 0x1B000000, 0x36000000
00449 };
00450
00451 static void aes_gen_tables( void ) {}
00452
00453 #endif
00454
00455
00456
00457
00458 static uint32 KT0[256];
00459 static uint32 KT1[256];
00460 static uint32 KT2[256];
00461 static uint32 KT3[256];
00462
00463
00464
00465
00466 void aes_set_key( aes_context *ctx, uint8 *key, int keysize )
00467 {
00468 int i;
00469 uint32 *RK, *SK;
00470 static int ft_init = 0;
00471 static int kt_init = 0;
00472
00473 if( ft_init == 0 )
00474 {
00475 aes_gen_tables();
00476
00477 ft_init = 1;
00478 }
00479
00480 switch( keysize )
00481 {
00482 case 128: ctx->nr = 10; break;
00483 case 192: ctx->nr = 12; break;
00484 case 256: ctx->nr = 14; break;
00485 default : return;
00486 }
00487
00488 RK = ctx->erk;
00489
00490 for( i = 0; i < (keysize >> 5); i++ )
00491 {
00492 GET_UINT32_BE( RK[i], key, i << 2 );
00493 }
00494
00495
00496
00497
00498 switch( ctx->nr )
00499 {
00500 case 10:
00501
00502 for( i = 0; i < 10; i++, RK += 4 )
00503 {
00504 RK[4] = RK[0] ^ RCON[i] ^
00505 ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^
00506 ( FSb[ (uint8) ( RK[3] >> 8 ) ] << 16 ) ^
00507 ( FSb[ (uint8) ( RK[3] ) ] << 8 ) ^
00508 ( FSb[ (uint8) ( RK[3] >> 24 ) ] );
00509
00510 RK[5] = RK[1] ^ RK[4];
00511 RK[6] = RK[2] ^ RK[5];
00512 RK[7] = RK[3] ^ RK[6];
00513 }
00514 break;
00515
00516 case 12:
00517
00518 for( i = 0; i < 8; i++, RK += 6 )
00519 {
00520 RK[6] = RK[0] ^ RCON[i] ^
00521 ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^
00522 ( FSb[ (uint8) ( RK[5] >> 8 ) ] << 16 ) ^
00523 ( FSb[ (uint8) ( RK[5] ) ] << 8 ) ^
00524 ( FSb[ (uint8) ( RK[5] >> 24 ) ] );
00525
00526 RK[7] = RK[1] ^ RK[6];
00527 RK[8] = RK[2] ^ RK[7];
00528 RK[9] = RK[3] ^ RK[8];
00529 RK[10] = RK[4] ^ RK[9];
00530 RK[11] = RK[5] ^ RK[10];
00531 }
00532 break;
00533
00534 case 14:
00535
00536 for( i = 0; i < 7; i++, RK += 8 )
00537 {
00538 RK[8] = RK[0] ^ RCON[i] ^
00539 ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^
00540 ( FSb[ (uint8) ( RK[7] >> 8 ) ] << 16 ) ^
00541 ( FSb[ (uint8) ( RK[7] ) ] << 8 ) ^
00542 ( FSb[ (uint8) ( RK[7] >> 24 ) ] );
00543
00544 RK[9] = RK[1] ^ RK[8];
00545 RK[10] = RK[2] ^ RK[9];
00546 RK[11] = RK[3] ^ RK[10];
00547
00548 RK[12] = RK[4] ^
00549 ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^
00550 ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^
00551 ( FSb[ (uint8) ( RK[11] >> 8 ) ] << 8 ) ^
00552 ( FSb[ (uint8) ( RK[11] ) ] );
00553
00554 RK[13] = RK[5] ^ RK[12];
00555 RK[14] = RK[6] ^ RK[13];
00556 RK[15] = RK[7] ^ RK[14];
00557 }
00558 break;
00559
00560 default:
00561
00562 break;
00563 }
00564
00565
00566
00567
00568 if( kt_init == 0 )
00569 {
00570 for( i = 0; i < 256; i++ )
00571 {
00572 KT0[i] = RT0[ FSb[i] ];
00573 KT1[i] = RT1[ FSb[i] ];
00574 KT2[i] = RT2[ FSb[i] ];
00575 KT3[i] = RT3[ FSb[i] ];
00576 }
00577
00578 kt_init = 1;
00579 }
00580
00581 SK = ctx->drk;
00582
00583 *SK++ = *RK++;
00584 *SK++ = *RK++;
00585 *SK++ = *RK++;
00586 *SK++ = *RK++;
00587
00588 for( i = 1; i < ctx->nr; i++ )
00589 {
00590 RK -= 8;
00591
00592 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
00593 KT1[ (uint8) ( *RK >> 16 ) ] ^
00594 KT2[ (uint8) ( *RK >> 8 ) ] ^
00595 KT3[ (uint8) ( *RK ) ]; RK++;
00596
00597 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
00598 KT1[ (uint8) ( *RK >> 16 ) ] ^
00599 KT2[ (uint8) ( *RK >> 8 ) ] ^
00600 KT3[ (uint8) ( *RK ) ]; RK++;
00601
00602 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
00603 KT1[ (uint8) ( *RK >> 16 ) ] ^
00604 KT2[ (uint8) ( *RK >> 8 ) ] ^
00605 KT3[ (uint8) ( *RK ) ]; RK++;
00606
00607 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
00608 KT1[ (uint8) ( *RK >> 16 ) ] ^
00609 KT2[ (uint8) ( *RK >> 8 ) ] ^
00610 KT3[ (uint8) ( *RK ) ]; RK++;
00611 }
00612
00613 RK -= 8;
00614
00615 *SK++ = *RK++;
00616 *SK++ = *RK++;
00617 *SK++ = *RK++;
00618 *SK++ = *RK++;
00619 }
00620
00624 void aes_encrypt( aes_context *ctx,
00625 unsigned char input[16],
00626 unsigned char output[16] )
00627 {
00628 uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
00629
00630 RK = ctx->erk;
00631
00632 GET_UINT32_BE( X0, input, 0 ); X0 ^= RK[0];
00633 GET_UINT32_BE( X1, input, 4 ); X1 ^= RK[1];
00634 GET_UINT32_BE( X2, input, 8 ); X2 ^= RK[2];
00635 GET_UINT32_BE( X3, input, 12 ); X3 ^= RK[3];
00636
00637 #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
00638 { \
00639 RK += 4; \
00640 \
00641 X0 = RK[0] ^ FT0[ (uint8) ( Y0 >> 24 ) ] ^ \
00642 FT1[ (uint8) ( Y1 >> 16 ) ] ^ \
00643 FT2[ (uint8) ( Y2 >> 8 ) ] ^ \
00644 FT3[ (uint8) ( Y3 ) ]; \
00645 \
00646 X1 = RK[1] ^ FT0[ (uint8) ( Y1 >> 24 ) ] ^ \
00647 FT1[ (uint8) ( Y2 >> 16 ) ] ^ \
00648 FT2[ (uint8) ( Y3 >> 8 ) ] ^ \
00649 FT3[ (uint8) ( Y0 ) ]; \
00650 \
00651 X2 = RK[2] ^ FT0[ (uint8) ( Y2 >> 24 ) ] ^ \
00652 FT1[ (uint8) ( Y3 >> 16 ) ] ^ \
00653 FT2[ (uint8) ( Y0 >> 8 ) ] ^ \
00654 FT3[ (uint8) ( Y1 ) ]; \
00655 \
00656 X3 = RK[3] ^ FT0[ (uint8) ( Y3 >> 24 ) ] ^ \
00657 FT1[ (uint8) ( Y0 >> 16 ) ] ^ \
00658 FT2[ (uint8) ( Y1 >> 8 ) ] ^ \
00659 FT3[ (uint8) ( Y2 ) ]; \
00660 }
00661
00662 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00663 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00664 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00665 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00666 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00667 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00668 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00669 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00670 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00671
00672 if( ctx->nr > 10 )
00673 {
00674 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00675 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00676 }
00677
00678 if( ctx->nr > 12 )
00679 {
00680 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00681 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00682 }
00683
00684 RK += 4;
00685
00686 X0 = RK[0] ^ ( FSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^
00687 ( FSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
00688 ( FSb[ (uint8) ( Y2 >> 8 ) ] << 8 ) ^
00689 ( FSb[ (uint8) ( Y3 ) ] );
00690
00691 X1 = RK[1] ^ ( FSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^
00692 ( FSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
00693 ( FSb[ (uint8) ( Y3 >> 8 ) ] << 8 ) ^
00694 ( FSb[ (uint8) ( Y0 ) ] );
00695
00696 X2 = RK[2] ^ ( FSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^
00697 ( FSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
00698 ( FSb[ (uint8) ( Y0 >> 8 ) ] << 8 ) ^
00699 ( FSb[ (uint8) ( Y1 ) ] );
00700
00701 X3 = RK[3] ^ ( FSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^
00702 ( FSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
00703 ( FSb[ (uint8) ( Y1 >> 8 ) ] << 8 ) ^
00704 ( FSb[ (uint8) ( Y2 ) ] );
00705
00706 PUT_UINT32_BE( X0, output, 0 );
00707 PUT_UINT32_BE( X1, output, 4 );
00708 PUT_UINT32_BE( X2, output, 8 );
00709 PUT_UINT32_BE( X3, output, 12 );
00710 }
00711
00712
00713
00714
00715 void aes_decrypt( aes_context *ctx,
00716 unsigned char input[16],
00717 unsigned char output[16] )
00718 {
00719 uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
00720
00721 RK = ctx->drk;
00722
00723 GET_UINT32_BE( X0, input, 0 ); X0 ^= RK[0];
00724 GET_UINT32_BE( X1, input, 4 ); X1 ^= RK[1];
00725 GET_UINT32_BE( X2, input, 8 ); X2 ^= RK[2];
00726 GET_UINT32_BE( X3, input, 12 ); X3 ^= RK[3];
00727
00728 #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
00729 { \
00730 RK += 4; \
00731 \
00732 X0 = RK[0] ^ RT0[ (uint8) ( Y0 >> 24 ) ] ^ \
00733 RT1[ (uint8) ( Y3 >> 16 ) ] ^ \
00734 RT2[ (uint8) ( Y2 >> 8 ) ] ^ \
00735 RT3[ (uint8) ( Y1 ) ]; \
00736 \
00737 X1 = RK[1] ^ RT0[ (uint8) ( Y1 >> 24 ) ] ^ \
00738 RT1[ (uint8) ( Y0 >> 16 ) ] ^ \
00739 RT2[ (uint8) ( Y3 >> 8 ) ] ^ \
00740 RT3[ (uint8) ( Y2 ) ]; \
00741 \
00742 X2 = RK[2] ^ RT0[ (uint8) ( Y2 >> 24 ) ] ^ \
00743 RT1[ (uint8) ( Y1 >> 16 ) ] ^ \
00744 RT2[ (uint8) ( Y0 >> 8 ) ] ^ \
00745 RT3[ (uint8) ( Y3 ) ]; \
00746 \
00747 X3 = RK[3] ^ RT0[ (uint8) ( Y3 >> 24 ) ] ^ \
00748 RT1[ (uint8) ( Y2 >> 16 ) ] ^ \
00749 RT2[ (uint8) ( Y1 >> 8 ) ] ^ \
00750 RT3[ (uint8) ( Y0 ) ]; \
00751 }
00752
00753 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00754 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00755 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00756 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00757 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00758 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00759 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00760 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00761 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00762
00763 if( ctx->nr > 10 )
00764 {
00765 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00766 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00767 }
00768
00769 if( ctx->nr > 12 )
00770 {
00771 AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
00772 AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
00773 }
00774
00775 RK += 4;
00776
00777 X0 = RK[0] ^ ( RSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^
00778 ( RSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
00779 ( RSb[ (uint8) ( Y2 >> 8 ) ] << 8 ) ^
00780 ( RSb[ (uint8) ( Y1 ) ] );
00781
00782 X1 = RK[1] ^ ( RSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^
00783 ( RSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
00784 ( RSb[ (uint8) ( Y3 >> 8 ) ] << 8 ) ^
00785 ( RSb[ (uint8) ( Y2 ) ] );
00786
00787 X2 = RK[2] ^ ( RSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^
00788 ( RSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
00789 ( RSb[ (uint8) ( Y0 >> 8 ) ] << 8 ) ^
00790 ( RSb[ (uint8) ( Y3 ) ] );
00791
00792 X3 = RK[3] ^ ( RSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^
00793 ( RSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
00794 ( RSb[ (uint8) ( Y1 >> 8 ) ] << 8 ) ^
00795 ( RSb[ (uint8) ( Y0 ) ] );
00796
00797 PUT_UINT32_BE( X0, output, 0 );
00798 PUT_UINT32_BE( X1, output, 4 );
00799 PUT_UINT32_BE( X2, output, 8 );
00800 PUT_UINT32_BE( X3, output, 12 );
00801 }
00802
00803
00804
00805
00806 void aes_cbc_encrypt( aes_context *ctx,
00807 unsigned char iv[16],
00808 unsigned char *input,
00809 unsigned char *output,
00810 int len )
00811 {
00812 int i;
00813
00814 while( len > 0 )
00815 {
00816 for( i = 0; i < 16; i++ )
00817 output[i] = input[i] ^ iv[i];
00818
00819 aes_encrypt( ctx, output, output );
00820 memcpy( iv, output, 16 );
00821
00822 input += 16;
00823 output += 16;
00824 len -= 16;
00825 }
00826 }
00827
00828
00829
00830
00831 void aes_cbc_decrypt( aes_context *ctx,
00832 unsigned char iv[16],
00833 unsigned char *input,
00834 unsigned char *output,
00835 int len )
00836 {
00837 int i;
00838 unsigned char temp[16];
00839
00840 while( len > 0 )
00841 {
00842 memcpy( temp, input, 16 );
00843 aes_decrypt( ctx, input, output );
00844
00845 for( i = 0; i < 16; i++ )
00846 output[i] = output[i] ^ iv[i];
00847
00848 memcpy( iv, temp, 16 );
00849
00850 input += 16;
00851 output += 16;
00852 len -= 16;
00853 }
00854 }
00855
00856 static const char _aes_src[] = "_aes_src";
00857
00858 #if defined(SELF_TEST)
00859
00860 #include <stdio.h>
00861
00862
00863
00864
00865 static const uint8 aes_enc_test[3][16] =
00866 {
00867 { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
00868 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
00869 { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
00870 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
00871 { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
00872 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
00873 };
00874
00875 static const uint8 aes_dec_test[3][16] =
00876 {
00877 { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
00878 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
00879 { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
00880 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
00881 { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
00882 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
00883 };
00884
00885
00886
00887
00888 int aes_self_test( int verbose )
00889 {
00890 int i, j, u, v;
00891 aes_context ctx;
00892 unsigned char buf[32];
00893
00894 for( i = 0; i < 6; i++ )
00895 {
00896 u = i >> 1;
00897 v = i & 1;
00898
00899 if( verbose != 0 )
00900 printf( " AES-ECB-%3d (%s): ", 128 + u * 64,
00901 ( v == 0 ) ? "enc" : "dec" );
00902
00903 memset( buf, 0, 32 );
00904 aes_set_key( &ctx, buf, 128 + u * 64 );
00905
00906 for( j = 0; j < 10000; j++ )
00907 {
00908 if( v == 0 ) aes_encrypt( &ctx, buf, buf );
00909 if( v == 1 ) aes_decrypt( &ctx, buf, buf );
00910 }
00911
00912 if( ( v == 0 && memcmp( buf, aes_enc_test[u], 16 ) != 0 ) ||
00913 ( v == 1 && memcmp( buf, aes_dec_test[u], 16 ) != 0 ) )
00914 {
00915 if( verbose != 0 )
00916 printf( "failed\n" );
00917
00918 return( 1 );
00919 }
00920
00921 if( verbose != 0 )
00922 printf( "passed\n" );
00923 }
00924
00925 if( verbose != 0 )
00926 printf( "\n" );
00927
00928 return( 0 );
00929 }
00930 #else
00931 int aes_self_test( int verbose )
00932 {
00933 return( 0 );
00934 }
00935 #endif