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