9 typedef UINT32 uint32_t;
18 #define GET_UINT32_BE(n,b,i) \
20 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
21 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
22 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
23 | ( (uint32_t) (b)[(i) + 3] ); \
28 #define PUT_UINT32_BE(n,b,i) \
30 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
31 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
32 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
33 (b)[(i) + 3] = (unsigned char) ( (n) ); \
37 int unhexify(
unsigned char *obuf,
const char *ibuf)
40 int len = strlen(ibuf) / 2;
41 assert(!(strlen(ibuf) %1));
46 if( c >=
'0' && c <=
'9' )
48 else if( c >=
'a' && c <=
'f' )
50 else if( c >=
'A' && c <=
'F' )
56 if( c2 >=
'0' && c2 <=
'9' )
58 else if( c2 >=
'a' && c2 <=
'f' )
60 else if( c2 >=
'A' && c2 <=
'F' )
65 *obuf++ = ( c << 4 ) | c2;
71 void hexify(
unsigned char *obuf,
const unsigned char *ibuf,
int len)
83 *obuf++ =
'a' + h - 10;
88 *obuf++ =
'a' + l - 10;
104 static int rnd_std_rand(
void *rng_state,
unsigned char *output,
size_t len )
108 if( rng_state != NULL )
111 for( i = 0; i < len; ++i )
122 static int rnd_zero_rand(
void *rng_state,
unsigned char *output,
size_t len )
124 if( rng_state != NULL )
127 memset( output, 0, len );
154 if( rng_state == NULL )
163 memcpy( output, info->
buf, use_len );
164 info->
buf += use_len;
168 if( len - use_len > 0 )
169 return(
rnd_std_rand( NULL, output + use_len, len - use_len ) );
198 uint32_t i, *k, sum, delta=0x9E3779B9;
199 unsigned char result[4];
201 if( rng_state == NULL )
208 size_t use_len = ( len > 4 ) ? 4 : len;
211 for( i = 0; i < 32; i++ )
213 info->
v0 += (((info->
v1 << 4) ^ (info->
v1 >> 5)) + info->
v1) ^ (sum + k[sum & 3]);
215 info->
v1 += (((info->
v0 << 4) ^ (info->
v0 >> 5)) + info->
v0) ^ (sum + k[(sum>>11) & 3]);
219 memcpy( output, result, use_len );
229 #ifdef POLARSSL_ARC4_C
232 FCT_SUITE_BGN(test_suite_arc4)
235 FCT_TEST_BGN(test_vector_arc4_cryptlib)
237 unsigned char src_str[1000];
238 unsigned char key_str[1000];
239 unsigned char dst_str[1000];
240 unsigned char dst_hexstr[2000];
241 int src_len, key_len;
244 memset(src_str, 0x00, 1000);
245 memset(key_str, 0x00, 1000);
246 memset(dst_str, 0x00, 1000);
247 memset(dst_hexstr, 0x00, 2000);
249 src_len =
unhexify( src_str,
"0000000000000000" );
250 key_len =
unhexify( key_str,
"0123456789abcdef" );
253 fct_chk(
arc4_crypt(&ctx, src_len, src_str, dst_str ) == 0 );
254 hexify( dst_hexstr, dst_str, src_len );
256 fct_chk( strcmp( (
char *) dst_hexstr,
"7494c2e7104b0879" ) == 0 );
261 FCT_TEST_BGN(test_vector_arc4_commerce)
263 unsigned char src_str[1000];
264 unsigned char key_str[1000];
265 unsigned char dst_str[1000];
266 unsigned char dst_hexstr[2000];
267 int src_len, key_len;
270 memset(src_str, 0x00, 1000);
271 memset(key_str, 0x00, 1000);
272 memset(dst_str, 0x00, 1000);
273 memset(dst_hexstr, 0x00, 2000);
275 src_len =
unhexify( src_str,
"dcee4cf92c" );
276 key_len =
unhexify( key_str,
"618a63d2fb" );
279 fct_chk(
arc4_crypt(&ctx, src_len, src_str, dst_str ) == 0 );
280 hexify( dst_hexstr, dst_str, src_len );
282 fct_chk( strcmp( (
char *) dst_hexstr,
"f13829c9de" ) == 0 );
287 FCT_TEST_BGN(test_vector_arc4_ssh_arcfour)
289 unsigned char src_str[1000];
290 unsigned char key_str[1000];
291 unsigned char dst_str[1000];
292 unsigned char dst_hexstr[2000];
293 int src_len, key_len;
296 memset(src_str, 0x00, 1000);
297 memset(key_str, 0x00, 1000);
298 memset(dst_str, 0x00, 1000);
299 memset(dst_hexstr, 0x00, 2000);
301 src_len =
unhexify( src_str,
"527569736c696e6e756e206c61756c75206b6f727669737373616e692c2074e4686be470e46964656e2070e4e46c6ce42074e47973696b75752e204b6573e479f66e206f6e206f6e6e69206f6d616e616e692c206b61736b6973617675756e206c61616b736f7420766572686f75752e20456e206d6120696c6f697473652c20737572652068756f6b61612c206d75747461206d657473e46e2074756d6d757573206d756c6c652074756f6b61612e205075756e746f2070696c76656e2c206d692068756b6b75752c207369696e746f20766172616e207475756c6973656e2c206d69206e756b6b75752e2054756f6b7375742076616e616d6f6e206a61207661726a6f74207665656e2c206e69697374e420737964e46d656e69206c61756c756e207465656e2e202d2045696e6f204c65696e6f" );
302 key_len =
unhexify( key_str,
"29041972fb42ba5fc7127712f13829c9" );
305 fct_chk(
arc4_crypt(&ctx, src_len, src_str, dst_str ) == 0 );
306 hexify( dst_hexstr, dst_str, src_len );
308 fct_chk( strcmp( (
char *) dst_hexstr,
"358186999001e6b5daf05eceeb7eee21e0689c1f00eea81f7dd2caaee1d2763e68af0ead33d66c268bc946c484fbe94c5f5e0b86a59279e4f824e7a640bd223210b0a61160b7bce986ea65688003596b630a6b90f8e0caf6912a98eb872176e83c202caa64166d2cce57ff1bca57b213f0ed1aa72fb8ea52b0be01cd1e412867720b326eb389d011bd70d8af035fb0d8589dbce3c666f5ea8d4c7954c50c3f340b0467f81b425961c11843074df620f208404b394cf9d37ff54b5f1ad8f6ea7da3c561dfa7281f964463d2cc35a4d1b03490dec51b0711fbd6f55f79234d5b7c766622a66de92be996461d5e4dc878ef9bca030521e8351e4baed2fd04f9467368c4ad6ac186d08245b263a2666d1f6c5420f1599dfd9f438921c2f5a463938ce0982265eef70179bc553f339eb1a4c1af5f6a547f" ) == 0 );
312 #ifdef POLARSSL_SELF_TEST
314 FCT_TEST_BGN(arc4_selftest)