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

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

Generated on Tue Jul 1 15:29:58 2008 for Mobile-C by  doxygen 1.5.4