00001 
00002 
00003 
00004 
00005 
00006 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #include <aversive.h>
00038 #include "rc4.h"
00039 
00040 struct rc4_state s;
00041 
00042 
00043 
00044 void rc4_init(uint8_t *key,  uint8_t length )
00045 {
00046   uint8_t i, j, k, a;
00047   uint8_t * m;
00048 
00049   s.x = 0;
00050   s.y = 0;
00051   m = s.m;
00052   
00053   i=0;
00054   m[i] = i;
00055   for( i = 1; i !=0 ; i++ )
00056     {
00057       m[i] = i;
00058     }
00059   
00060   j = k = 0;
00061 
00062 
00063   i=0;
00064   a = m[i];
00065   j = (uint8_t) ( j + a + key[k] );
00066   m[i] = m[j]; m[j] = a;
00067   if( ++k >= length ) k = 0;
00068 
00069   for( i = 1; i != 0 ; i++ )
00070     {
00071       a = m[i];
00072       j = (uint8_t) ( j + a + key[k] );
00073       m[i] = m[j]; m[j] = a;
00074       if( ++k >= length ) k = 0;
00075     }
00076 }
00077 
00078 
00079 
00080 uint8_t rc4_crypt_char(uint8_t data)
00081 { 
00082     uint8_t a, b;
00083 
00084     s.x = (uint8_t) ( s.x + 1 ); 
00085     a = s.m[s.x];
00086     s.y = (uint8_t) ( s.y + a );
00087     s.m[s.x] = b = s.m[s.y];
00088     s.m[s.y] = a;
00089     data ^= s.m[(uint8_t) ( a + b )];
00090 
00091     return data;
00092 }
00093