00001 00002 00003 #include "dkcCamellia.h" 00004 00005 00006 static const uint8 sbox1[256]={ 00007 0x70,0x82,0x2c,0xec,0xb3,0x27,0xc0,0xe5,0xe4,0x85,0x57,0x35,0xea,0x0c,0xae,0x41, 00008 0x23,0xef,0x6b,0x93,0x45,0x19,0xa5,0x21,0xed,0x0e,0x4f,0x4e,0x1d,0x65,0x92,0xbd, 00009 0x86,0xb8,0xaf,0x8f,0x7c,0xeb,0x1f,0xce,0x3e,0x30,0xdc,0x5f,0x5e,0xc5,0x0b,0x1a, 00010 0xa6,0xe1,0x39,0xca,0xd5,0x47,0x5d,0x3d,0xd9,0x01,0x5a,0xd6,0x51,0x56,0x6c,0x4d, 00011 0x8b,0x0d,0x9a,0x66,0xfb,0xcc,0xb0,0x2d,0x74,0x12,0x2b,0x20,0xf0,0xb1,0x84,0x99, 00012 0xdf,0x4c,0xcb,0xc2,0x34,0x7e,0x76,0x05,0x6d,0xb7,0xa9,0x31,0xd1,0x17,0x04,0xd7, 00013 0x14,0x58,0x3a,0x61,0xde,0x1b,0x11,0x1c,0x32,0x0f,0x9c,0x16,0x53,0x18,0xf2,0x22, 00014 0xfe,0x44,0xcf,0xb2,0xc3,0xb5,0x7a,0x91,0x24,0x08,0xe8,0xa8,0x60,0xfc,0x69,0x50, 00015 0xaa,0xd0,0xa0,0x7d,0xa1,0x89,0x62,0x97,0x54,0x5b,0x1e,0x95,0xe0,0xff,0x64,0xd2, 00016 0x10,0xc4,0x00,0x48,0xa3,0xf7,0x75,0xdb,0x8a,0x03,0xe6,0xda,0x09,0x3f,0xdd,0x94, 00017 0x87,0x5c,0x83,0x02,0xcd,0x4a,0x90,0x33,0x73,0x67,0xf6,0xf3,0x9d,0x7f,0xbf,0xe2, 00018 0x52,0x9b,0xd8,0x26,0xc8,0x37,0xc6,0x3b,0x81,0x96,0x6f,0x4b,0x13,0xbe,0x63,0x2e, 00019 0xe9,0x79,0xa7,0x8c,0x9f,0x6e,0xbc,0x8e,0x29,0xf5,0xf9,0xb6,0x2f,0xfd,0xb4,0x59, 00020 0x78,0x98,0x06,0x6a,0xe7,0x46,0x71,0xba,0xd4,0x25,0xab,0x42,0x88,0xa2,0x8d,0xfa, 00021 0x72,0x07,0xb9,0x55,0xf8,0xee,0xac,0x0a,0x36,0x49,0x2a,0x68,0x3c,0x38,0xf1,0xa4, 00022 0x40,0x28,0xd3,0x7b,0xbb,0xc9,0x43,0xc1,0x15,0xe3,0xad,0xf4,0x77,0xc7,0x80,0x9e 00023 }; 00024 static const uint8 sbox2[256]={ 00025 0xe0,0x05,0x58,0xd9,0x67,0x4e,0x81,0xcb,0xc9,0x0b,0xae,0x6a,0xd5,0x18,0x5d,0x82, 00026 0x46,0xdf,0xd6,0x27,0x8a,0x32,0x4b,0x42,0xdb,0x1c,0x9e,0x9c,0x3a,0xca,0x25,0x7b, 00027 0x0d,0x71,0x5f,0x1f,0xf8,0xd7,0x3e,0x9d,0x7c,0x60,0xb9,0xbe,0xbc,0x8b,0x16,0x34, 00028 0x4d,0xc3,0x72,0x95,0xab,0x8e,0xba,0x7a,0xb3,0x02,0xb4,0xad,0xa2,0xac,0xd8,0x9a, 00029 0x17,0x1a,0x35,0xcc,0xf7,0x99,0x61,0x5a,0xe8,0x24,0x56,0x40,0xe1,0x63,0x09,0x33, 00030 0xbf,0x98,0x97,0x85,0x68,0xfc,0xec,0x0a,0xda,0x6f,0x53,0x62,0xa3,0x2e,0x08,0xaf, 00031 0x28,0xb0,0x74,0xc2,0xbd,0x36,0x22,0x38,0x64,0x1e,0x39,0x2c,0xa6,0x30,0xe5,0x44, 00032 0xfd,0x88,0x9f,0x65,0x87,0x6b,0xf4,0x23,0x48,0x10,0xd1,0x51,0xc0,0xf9,0xd2,0xa0, 00033 0x55,0xa1,0x41,0xfa,0x43,0x13,0xc4,0x2f,0xa8,0xb6,0x3c,0x2b,0xc1,0xff,0xc8,0xa5, 00034 0x20,0x89,0x00,0x90,0x47,0xef,0xea,0xb7,0x15,0x06,0xcd,0xb5,0x12,0x7e,0xbb,0x29, 00035 0x0f,0xb8,0x07,0x04,0x9b,0x94,0x21,0x66,0xe6,0xce,0xed,0xe7,0x3b,0xfe,0x7f,0xc5, 00036 0xa4,0x37,0xb1,0x4c,0x91,0x6e,0x8d,0x76,0x03,0x2d,0xde,0x96,0x26,0x7d,0xc6,0x5c, 00037 0xd3,0xf2,0x4f,0x19,0x3f,0xdc,0x79,0x1d,0x52,0xeb,0xf3,0x6d,0x5e,0xfb,0x69,0xb2, 00038 0xf0,0x31,0x0c,0xd4,0xcf,0x8c,0xe2,0x75,0xa9,0x4a,0x57,0x84,0x11,0x45,0x1b,0xf5, 00039 0xe4,0x0e,0x73,0xaa,0xf1,0xdd,0x59,0x14,0x6c,0x92,0x54,0xd0,0x78,0x70,0xe3,0x49, 00040 0x80,0x50,0xa7,0xf6,0x77,0x93,0x86,0x83,0x2a,0xc7,0x5b,0xe9,0xee,0x8f,0x01,0x3d 00041 }; 00042 static const uint8 sbox3[256]={ 00043 0x38,0x41,0x16,0x76,0xd9,0x93,0x60,0xf2,0x72,0xc2,0xab,0x9a,0x75,0x06,0x57,0xa0, 00044 0x91,0xf7,0xb5,0xc9,0xa2,0x8c,0xd2,0x90,0xf6,0x07,0xa7,0x27,0x8e,0xb2,0x49,0xde, 00045 0x43,0x5c,0xd7,0xc7,0x3e,0xf5,0x8f,0x67,0x1f,0x18,0x6e,0xaf,0x2f,0xe2,0x85,0x0d, 00046 0x53,0xf0,0x9c,0x65,0xea,0xa3,0xae,0x9e,0xec,0x80,0x2d,0x6b,0xa8,0x2b,0x36,0xa6, 00047 0xc5,0x86,0x4d,0x33,0xfd,0x66,0x58,0x96,0x3a,0x09,0x95,0x10,0x78,0xd8,0x42,0xcc, 00048 0xef,0x26,0xe5,0x61,0x1a,0x3f,0x3b,0x82,0xb6,0xdb,0xd4,0x98,0xe8,0x8b,0x02,0xeb, 00049 0x0a,0x2c,0x1d,0xb0,0x6f,0x8d,0x88,0x0e,0x19,0x87,0x4e,0x0b,0xa9,0x0c,0x79,0x11, 00050 0x7f,0x22,0xe7,0x59,0xe1,0xda,0x3d,0xc8,0x12,0x04,0x74,0x54,0x30,0x7e,0xb4,0x28, 00051 0x55,0x68,0x50,0xbe,0xd0,0xc4,0x31,0xcb,0x2a,0xad,0x0f,0xca,0x70,0xff,0x32,0x69, 00052 0x08,0x62,0x00,0x24,0xd1,0xfb,0xba,0xed,0x45,0x81,0x73,0x6d,0x84,0x9f,0xee,0x4a, 00053 0xc3,0x2e,0xc1,0x01,0xe6,0x25,0x48,0x99,0xb9,0xb3,0x7b,0xf9,0xce,0xbf,0xdf,0x71, 00054 0x29,0xcd,0x6c,0x13,0x64,0x9b,0x63,0x9d,0xc0,0x4b,0xb7,0xa5,0x89,0x5f,0xb1,0x17, 00055 0xf4,0xbc,0xd3,0x46,0xcf,0x37,0x5e,0x47,0x94,0xfa,0xfc,0x5b,0x97,0xfe,0x5a,0xac, 00056 0x3c,0x4c,0x03,0x35,0xf3,0x23,0xb8,0x5d,0x6a,0x92,0xd5,0x21,0x44,0x51,0xc6,0x7d, 00057 0x39,0x83,0xdc,0xaa,0x7c,0x77,0x56,0x05,0x1b,0xa4,0x15,0x34,0x1e,0x1c,0xf8,0x52, 00058 0x20,0x14,0xe9,0xbd,0xdd,0xe4,0xa1,0xe0,0x8a,0xf1,0xd6,0x7a,0xbb,0xe3,0x40,0x4f 00059 }; 00060 static const uint8 sbos4[256]={ 00061 0x70,0x2c,0xb3,0xc0,0xe4,0x57,0xea,0xae,0x23,0x6b,0x45,0xa5,0xed,0x4f,0x1d,0x92, 00062 0x86,0xaf,0x7c,0x1f,0x3e,0xdc,0x5e,0x0b,0xa6,0x39,0xd5,0x5d,0xd9,0x5a,0x51,0x6c, 00063 0x8b,0x9a,0xfb,0xb0,0x74,0x2b,0xf0,0x84,0xdf,0xcb,0x34,0x76,0x6d,0xa9,0xd1,0x04, 00064 0x14,0x3a,0xde,0x11,0x32,0x9c,0x53,0xf2,0xfe,0xcf,0xc3,0x7a,0x24,0xe8,0x60,0x69, 00065 0xaa,0xa0,0xa1,0x62,0x54,0x1e,0xe0,0x64,0x10,0x00,0xa3,0x75,0x8a,0xe6,0x09,0xdd, 00066 0x87,0x83,0xcd,0x90,0x73,0xf6,0x9d,0xbf,0x52,0xd8,0xc8,0xc6,0x81,0x6f,0x13,0x63, 00067 0xe9,0xa7,0x9f,0xbc,0x29,0xf9,0x2f,0xb4,0x78,0x06,0xe7,0x71,0xd4,0xab,0x88,0x8d, 00068 0x72,0xb9,0xf8,0xac,0x36,0x2a,0x3c,0xf1,0x40,0xd3,0xbb,0x43,0x15,0xad,0x77,0x80, 00069 0x82,0xec,0x27,0xe5,0x85,0x35,0x0c,0x41,0xef,0x93,0x19,0x21,0x0e,0x4e,0x65,0xbd, 00070 0xb8,0x8f,0xeb,0xce,0x30,0x5f,0xc5,0x1a,0xe1,0xca,0x47,0x3d,0x01,0xd6,0x56,0x4d, 00071 0x0d,0x66,0xcc,0x2d,0x12,0x20,0xb1,0x99,0x4c,0xc2,0x7e,0x05,0xb7,0x31,0x17,0xd7, 00072 0x58,0x61,0x1b,0x1c,0x0f,0x16,0x18,0x22,0x44,0xb2,0xb5,0x91,0x08,0xa8,0xfc,0x50, 00073 0xd0,0x7d,0x89,0x97,0x5b,0x95,0xff,0xd2,0xc4,0x48,0xf7,0xdb,0x03,0xda,0x3f,0x94, 00074 0x5c,0x02,0x4a,0x33,0x67,0xf3,0x7f,0xe2,0x9b,0x26,0x37,0x3b,0x96,0x4b,0xbe,0x2e, 00075 0x79,0x8c,0x6e,0x8e,0xf5,0xb6,0xfd,0x59,0x98,0x6a,0x46,0xba,0x25,0x42,0xa2,0xfa, 00076 0x07,0x55,0xee,0x0a,0x49,0x68,0x38,0xa4,0x28,0x7b,0xc9,0xc1,0xe3,0xf4,0xc7,0x9e 00077 }; 00078 00079 00080 00081 00082 void Camellia_Ekeygen( const int, const Byte *, Byte * ); 00083 void Camellia_Encrypt( const int, const Byte *, const Byte *, Byte * ); 00084 void Camellia_Decrypt( const int, const Byte *, const Byte *, Byte * ); 00085 void Camellia_Feistel( const Byte *, const Byte *, Byte * ); 00086 void Camellia_FLlayer( Byte *, const Byte *, const Byte * ); 00087 00088 void ByteWord( const Byte *, uint32 * ); 00089 void WordByte( const uint32 *, Byte * ); 00090 void XorBlock( const Byte *, const Byte *, Byte * ); 00091 void SwapHalf( Byte * ); 00092 void RotBlock( const uint32 *, const int, uint32 * ); 00093 00094 const Byte SIGMA[48] = { 00095 0xa0,0x9e,0x66,0x7f,0x3b,0xcc,0x90,0x8b, 00096 0xb6,0x7a,0xe8,0x58,0x4c,0xaa,0x73,0xb2, 00097 0xc6,0xef,0x37,0x2f,0xe9,0x4f,0x82,0xbe, 00098 0x54,0xff,0x53,0xa5,0xf1,0xd3,0x6f,0x1c, 00099 0x10,0xe5,0x27,0xfa,0xde,0x68,0x2d,0x1d, 00100 0xb0,0x56,0x88,0xc2,0xb3,0xe6,0xc1,0xfd}; 00101 00102 const int KSFT1[26] = { 00103 0,64,0,64,15,79,15,79,30,94,45,109,45,124,60,124,77,13, 00104 94,30,94,30,111,47,111,47 }; 00105 const int KIDX1[26] = { 00106 0,0,4,4,0,0,4,4,4,4,0,0,4,0,4,4,0,0,0,0,4,4,0,0,4,4 }; 00107 const int KSFT2[34] = { 00108 0,64,0,64,15,79,15,79,30,94,30,94,45,109,45,109,60,124, 00109 60,124,60,124,77,13,77,13,94,30,94,30,111,47,111,47 }; 00110 const int KIDX2[34] = { 00111 0,0,12,12,8,8,4,4,8,8,12,12,0,0,4,4,0,0,8,8,12,12, 00112 0,0,4,4,8,8,4,4,0,0,12,12 }; 00113 00114 const Byte SBOX[256] = { 00115 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65, 00116 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189, 00117 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26, 00118 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77, 00119 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153, 00120 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215, 00121 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34, 00122 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80, 00123 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210, 00124 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148, 00125 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226, 00126 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46, 00127 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89, 00128 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250, 00129 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164, 00130 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158}; 00131 00132 #define SBOX1(n) SBOX[(n)] 00133 #define SBOX2(n) (Byte)((SBOX[(n)]>>7^SBOX[(n)]<<1)&0xff) 00134 #define SBOX3(n) (Byte)((SBOX[(n)]>>1^SBOX[(n)]<<7)&0xff) 00135 #define SBOX4(n) SBOX[((n)<<1^(n)>>7)&0xff] 00136 00137 void Camellia_Ekeygen( const int n, const Byte *k, Byte *e ) 00138 { 00139 Byte t[64]; 00140 uint32 u[20]; 00141 int i; 00142 00143 if( n == 128 ){ 00144 for( i=0 ; i<16; i++ ) t[i] = k[i]; 00145 for( i=16; i<32; i++ ) t[i] = 0; 00146 } 00147 else if( n == 192 ){ 00148 for( i=0 ; i<24; i++ ) t[i] = k[i]; 00149 for( i=24; i<32; i++ ) t[i] = k[i-8]^0xff; 00150 } 00151 else if( n == 256 ){ 00152 for( i=0 ; i<32; i++ ) t[i] = k[i]; 00153 } 00154 00155 XorBlock( t+0, t+16, t+32 ); 00156 00157 Camellia_Feistel( t+32, SIGMA+0, t+40 ); 00158 Camellia_Feistel( t+40, SIGMA+8, t+32 ); 00159 00160 XorBlock( t+32, t+0, t+32 ); 00161 00162 Camellia_Feistel( t+32, SIGMA+16, t+40 ); 00163 Camellia_Feistel( t+40, SIGMA+24, t+32 ); 00164 00165 ByteWord( t+0, u+0 ); 00166 ByteWord( t+32, u+4 ); 00167 00168 if( n == 128 ){ 00169 for( i=0; i<26; i+=2 ){ 00170 RotBlock( u+KIDX1[i+0], KSFT1[i+0], u+16 ); 00171 RotBlock( u+KIDX1[i+1], KSFT1[i+1], u+18 ); 00172 WordByte( u+16, e+i*8 ); 00173 } 00174 } 00175 else{ 00176 XorBlock( t+32, t+16, t+48 ); 00177 00178 Camellia_Feistel( t+48, SIGMA+32, t+56 ); 00179 Camellia_Feistel( t+56, SIGMA+40, t+48 ); 00180 00181 ByteWord( t+16, u+8 ); 00182 ByteWord( t+48, u+12 ); 00183 00184 for( i=0; i<34; i+=2 ){ 00185 RotBlock( u+KIDX2[i+0], KSFT2[i+0], u+16 ); 00186 RotBlock( u+KIDX2[i+1], KSFT2[i+1], u+18 ); 00187 WordByte( u+16, e+(i<<3) ); 00188 } 00189 } 00190 } 00191 00192 void Camellia_Encrypt( const int n, const Byte *p, const Byte *e, Byte *c ) 00193 { 00194 int i; 00195 00196 XorBlock( p, e+0, c ); 00197 00198 for( i=0; i<3; i++ ){ 00199 Camellia_Feistel( c+0, e+16+(i<<4), c+8 ); 00200 Camellia_Feistel( c+8, e+24+(i<<4), c+0 ); 00201 } 00202 00203 Camellia_FLlayer( c, e+64, e+72 ); 00204 00205 for( i=0; i<3; i++ ){ 00206 Camellia_Feistel( c+0, e+80+(i<<4), c+8 ); 00207 Camellia_Feistel( c+8, e+88+(i<<4), c+0 ); 00208 } 00209 00210 Camellia_FLlayer( c, e+128, e+136 ); 00211 00212 for( i=0; i<3; i++ ){ 00213 Camellia_Feistel( c+0, e+144+(i<<4), c+8 ); 00214 Camellia_Feistel( c+8, e+152+(i<<4), c+0 ); 00215 } 00216 00217 if( n == 128 ){ 00218 SwapHalf( c ); 00219 XorBlock( c, e+192, c ); 00220 } 00221 else{ 00222 Camellia_FLlayer( c, e+192, e+200 ); 00223 00224 for( i=0; i<3; i++ ){ 00225 Camellia_Feistel( c+0, e+208+(i<<4), c+8 ); 00226 Camellia_Feistel( c+8, e+216+(i<<4), c+0 ); 00227 } 00228 00229 SwapHalf( c ); 00230 XorBlock( c, e+256, c ); 00231 } 00232 } 00233 00234 void Camellia_Decrypt( const int n, const Byte *c, const Byte *e, Byte *p ) 00235 { 00236 int i; 00237 00238 if( n == 128 ){ 00239 XorBlock( c, e+192, p ); 00240 } 00241 else{ 00242 XorBlock( c, e+256, p ); 00243 00244 for( i=2; i>=0; i-- ){ 00245 Camellia_Feistel( p+0, e+216+(i<<4), p+8 ); 00246 Camellia_Feistel( p+8, e+208+(i<<4), p+0 ); 00247 } 00248 00249 Camellia_FLlayer( p, e+200, e+192 ); 00250 } 00251 00252 for( i=2; i>=0; i-- ){ 00253 Camellia_Feistel( p+0, e+152+(i<<4), p+8 ); 00254 Camellia_Feistel( p+8, e+144+(i<<4), p+0 ); 00255 } 00256 00257 Camellia_FLlayer( p, e+136, e+128 ); 00258 00259 for( i=2; i>=0; i-- ){ 00260 Camellia_Feistel( p+0, e+88+(i<<4), p+8 ); 00261 Camellia_Feistel( p+8, e+80+(i<<4), p+0 ); 00262 } 00263 00264 Camellia_FLlayer( p, e+72, e+64 ); 00265 00266 for( i=2; i>=0; i-- ){ 00267 Camellia_Feistel( p+0, e+24+(i<<4), p+8 ); 00268 Camellia_Feistel( p+8, e+16+(i<<4), p+0 ); 00269 } 00270 00271 SwapHalf( p ); 00272 XorBlock( p, e+0, p ); 00273 } 00274 00275 void Camellia_Feistel( const Byte *x, const Byte *k, Byte *y ) 00276 { 00277 Byte t[8]; 00278 00279 t[0] = SBOX1(x[0]^k[0]); 00280 t[1] = SBOX2(x[1]^k[1]); 00281 t[2] = SBOX3(x[2]^k[2]); 00282 t[3] = SBOX4(x[3]^k[3]); 00283 t[4] = SBOX2(x[4]^k[4]); 00284 t[5] = SBOX3(x[5]^k[5]); 00285 t[6] = SBOX4(x[6]^k[6]); 00286 t[7] = SBOX1(x[7]^k[7]); 00287 00288 y[0] ^= t[0]^t[2]^t[3]^t[5]^t[6]^t[7]; 00289 y[1] ^= t[0]^t[1]^t[3]^t[4]^t[6]^t[7]; 00290 y[2] ^= t[0]^t[1]^t[2]^t[4]^t[5]^t[7]; 00291 y[3] ^= t[1]^t[2]^t[3]^t[4]^t[5]^t[6]; 00292 y[4] ^= t[0]^t[1]^t[5]^t[6]^t[7]; 00293 y[5] ^= t[1]^t[2]^t[4]^t[6]^t[7]; 00294 y[6] ^= t[2]^t[3]^t[4]^t[5]^t[7]; 00295 y[7] ^= t[0]^t[3]^t[4]^t[5]^t[6]; 00296 } 00297 00298 void Camellia_FLlayer( Byte *x, const Byte *kl, const Byte *kr ) 00299 { 00300 uint32 t[4],u[4],v[4]; 00301 00302 ByteWord( x, t ); 00303 ByteWord( kl, u ); 00304 ByteWord( kr, v ); 00305 00306 t[1] ^= (t[0]&u[0])<<1^(t[0]&u[0])>>31; 00307 t[0] ^= t[1]|u[1]; 00308 t[2] ^= t[3]|v[1]; 00309 t[3] ^= (t[2]&v[0])<<1^(t[2]&v[0])>>31; 00310 00311 WordByte( t, x ); 00312 } 00313 00314 void ByteWord( const Byte *x, uint32 *y ) 00315 { 00316 int i; 00317 for( i=0; i<4; i++ ){ 00318 y[i] = ((uint32)x[(i<<2)+0]<<24) + ((uint32)x[(i<<2)+1]<<16) 00319 + ((uint32)x[(i<<2)+2]<<8 ) + ((uint32)x[(i<<2)+3]<<0 ); 00320 } 00321 } 00322 00323 void WordByte( const uint32 *x, Byte *y ) 00324 { 00325 int i; 00326 for( i=0; i<4; i++ ){ 00327 y[(i<<2)+0] = (Byte)(x[i]>>24&0xff); 00328 y[(i<<2)+1] = (Byte)(x[i]>>16&0xff); 00329 y[(i<<2)+2] = (Byte)(x[i]>> 8&0xff); 00330 y[(i<<2)+3] = (Byte)(x[i]>> 0&0xff); 00331 } 00332 } 00333 00334 void RotBlock( const uint32 *x, const int n, uint32 *y ) 00335 { 00336 int r; 00337 if( r = (n & 31) ){ 00338 y[0] = x[((n>>5)+0)&3]<<r^x[((n>>5)+1)&3]>>(32-r); 00339 y[1] = x[((n>>5)+1)&3]<<r^x[((n>>5)+2)&3]>>(32-r); 00340 } 00341 else{ 00342 y[0] = x[((n>>5)+0)&3]; 00343 y[1] = x[((n>>5)+1)&3]; 00344 } 00345 } 00346 00347 void SwapHalf( Byte *x ) 00348 { 00349 Byte t; 00350 int i; 00351 for( i=0; i<8; i++ ){ 00352 t = x[i]; 00353 x[i] = x[8+i]; 00354 x[8+i] = t; 00355 } 00356 } 00357 00358 void XorBlock( const Byte *x, const Byte *y, Byte *z ) 00359 { 00360 int i; 00361 for( i=0; i<16; i++ ) z[i] = x[i] ^ y[i]; 00362 }