33 #if defined(POLARSSL_ARC4_C)
37 #if !defined(POLARSSL_ARC4_ALT)
52 for( i = 0; i < 256; i++ )
53 m[i] = (
unsigned char) i;
57 for( i = 0; i < 256; i++, k++ )
59 if( k >= keylen ) k = 0;
62 j = ( j + a + key[k] ) & 0xFF;
64 m[j] = (
unsigned char) a;
72 unsigned char *output )
82 for( i = 0; i < length; i++ )
84 x = ( x + 1 ) & 0xFF; a = m[x];
85 y = ( y + a ) & 0xFF; b = m[y];
87 m[x] = (
unsigned char) b;
88 m[y] = (
unsigned char) a;
90 output[i] = (
unsigned char)
91 ( input[i] ^ m[(
unsigned char)( a + b )] );
102 #if defined(POLARSSL_SELF_TEST)
112 static const unsigned char arc4_test_key[3][8] =
114 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
115 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
116 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
119 static const unsigned char arc4_test_pt[3][8] =
121 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
122 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
123 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
126 static const unsigned char arc4_test_ct[3][8] =
128 { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },
129 { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },
130 { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }
139 unsigned char ibuf[8];
140 unsigned char obuf[8];
143 for( i = 0; i < 3; i++ )
146 printf(
" ARC4 test #%d: ", i + 1 );
148 memcpy( ibuf, arc4_test_pt[i], 8 );
153 if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 )
156 printf(
"failed\n" );
162 printf(
"passed\n" );
int arc4_crypt(arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output)
ARC4 cipher function.
void arc4_setup(arc4_context *ctx, const unsigned char *key, unsigned int keylen)
ARC4 key schedule.
int arc4_self_test(int verbose)
Checkup routine.
Configuration options (set of defines)
The ARCFOUR stream cipher.