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