/home/dko/projects/mobilec/trunk/src/security/xyssl-0.7/library/aes.c

Go to the documentation of this file.
00001 /*
00002  *  FIPS-197 compliant AES implementation
00003  *
00004  *  Copyright (C) 2006-2007  Christophe Devine
00005  *
00006  *  This library is free software; you can redistribute it and/or
00007  *  modify it under the terms of the GNU Lesser General Public
00008  *  License, version 2.1 as published by the Free Software Foundation.
00009  *
00010  *  This library is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  *  Lesser General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU Lesser General Public
00016  *  License along with this library; if not, write to the Free Software
00017  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
00018  *  MA  02110-1301  USA
00019  */
00020 /*
00021  *  The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
00022  *
00023  *  http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
00024  *  http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
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  * 32-bit integer manipulation macros (big endian)
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  * Uncomment the following line to use pre-computed tables,
00067  * otherwise the tables will be generated at the first run.
00068  *
00069  * #define FIXED_TABLES
00070  */
00071 
00072 #if !defined(FIXED_TABLES)
00073 
00074 /*
00075  * Forward S-box & tables
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  * Reverse S-box & tables
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  * Round constants
00094  */
00095 static uint32 RCON[10];
00096 
00097 /*
00098  * Tables generation code
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      * compute pow and log tables over GF(2^8)
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      * calculate the round constants
00123      */
00124     for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )
00125     {
00126         RCON[i] = (uint32) x << 24;
00127     }
00128 
00129     /*
00130      * generate the forward and reverse S-boxes
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      * generate the forward and reverse tables
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  * Forward S-box
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  * Forward tables
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  * Reverse S-box
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  * Reverse tables
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  * Round constants
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  * Decryption key schedule tables
00454  */
00455 static uint32 KT0[256];
00456 static uint32 KT1[256];
00457 static uint32 KT2[256];
00458 static uint32 KT3[256];
00459 
00460 /*
00461  * AES key schedule
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      * setup encryption round keys
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      * setup decryption round keys
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  * AES block decryption (ECB mode)
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  * AES-CBC buffer encryption
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  * AES-CBC buffer decryption
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  * AES-ECB test vectors (source: NIST, rijndael-vals.zip)
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  * Checkup routine
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

Generated on Fri May 16 14:49:55 2008 for Mobile-C by  doxygen 1.5.4