00001
00007 #define DKUTIL_C_ARCFOUR_C
00008 #include "dkcArcfour.h"
00009 #include "dkcStdio.h"
00010
00011
00012
00013 DKC_ARCFOUR_STATE *WINAPI dkcAllocArcfour(
00014 const unsigned char *key,size_t keylen)
00015 {
00016
00017 int i,j;
00018 unsigned char temp;
00019 unsigned char *sb1,sb2[256];
00020 DKC_ARCFOUR_STATE *p;
00021
00022 memset(sb2,0,sizeof(sb2));
00023
00024 p = (DKC_ARCFOUR_STATE *)dkcAllocate(sizeof(DKC_ARCFOUR_STATE));
00025 if(NULL==p){
00026 return NULL;
00027 }
00028 sb1 = p->msbox;
00029
00030
00031 for(i=0;i<256;i++){
00032 sb1[i] = (unsigned char)i;
00033
00034
00035 }
00036 j=i=0;
00037
00038 for(;j<256;j++){
00039 sb2[j] = key [j % keylen];
00040 }
00041
00042
00043 for(i=0;i<256;i++){
00044
00045 j = (j + sb1[i] + sb2[i]) & 0xff;
00046 temp = sb1 [i];
00047 sb1 [i] = sb1 [j];
00048 sb1 [j] = temp;
00049
00050
00051
00052
00053 }
00054 return p;
00055 }
00056
00057 DKC_EXTERN unsigned char WINAPI dkcArcfourByte(DKC_ARCFOUR_STATE *p){
00058 unsigned char i,j,temp;
00059 unsigned char *sb1 = p->msbox;
00060
00061
00062 i = (unsigned char )(p->mi+1);
00063 j = (unsigned char )(p->mj + sb1[i]);
00064
00065
00066 temp = sb1 [i];
00067 sb1 [i] = sb1 [j];
00068 sb1 [j] = temp;
00069
00070
00071
00072 p->mi = i;
00073 p->mj = j;
00074
00075 i = (unsigned char )(sb1 [i] + sb1 [j]);
00076 j = (unsigned char )sb1[i];
00077 return j;
00078 }
00079
00080 static DKC_INLINE void dkcArcfourEncrypt_Base(DKC_ARCFOUR_STATE *p,
00081 unsigned char *dest,unsigned const char *src,size_t srcsize)
00082 {
00083
00084 size_t cc;
00085 unsigned char i,j;
00086 unsigned char *sb1 = p->msbox;
00087 unsigned char temp;
00088
00089
00090 i = (unsigned char )(p->mi);
00091 j = (unsigned char )(p->mj);
00092
00093 for(cc = 0;cc < srcsize;cc++){
00094
00095 i = (unsigned char )(i+1);
00096 j = (unsigned char )(j + sb1[i]);
00097
00098
00099
00100 temp = sb1 [i];
00101 sb1 [i] = sb1 [j];
00102 sb1 [j] = temp;
00103
00104
00105
00106
00107
00108 dest[cc] = (unsigned char )
00109 (src[cc] ^ (unsigned char )sb1[
00110 (unsigned char )(sb1 [i] + sb1 [j])
00111 ]
00112 );
00113 }
00114
00115 p->mi = i;
00116 p->mj = j;
00117
00118 }
00119
00120 int WINAPI dkcArcfourEncrypt(DKC_ARCFOUR_STATE *p,
00121 unsigned char *dest,size_t destsize,
00122 const unsigned char *src,size_t srcsize)
00123 {
00124
00125 if(destsize < srcsize){
00126 return edk_BufferOverFlow;
00127 }
00128 dkcArcfourEncrypt_Base(p,dest,src,srcsize);
00129
00130
00131
00132
00133
00134 return edk_SUCCEEDED;
00135 }
00136
00137
00138
00139 void WINAPI dkcArcfourEncryptNoDest(DKC_ARCFOUR_STATE *p,
00140 unsigned char *dest_and_src,size_t dest_and_srcsize)
00141 {
00142 dkcArcfourEncrypt_Base(p,dest_and_src,dest_and_src,dest_and_srcsize);
00143 }
00144
00145 int WINAPI dkcFreeArcfour(DKC_ARCFOUR_STATE **p){
00146 if(NULL==p){
00147 return edk_FAILED;
00148 }
00149 return dkcFree((void **)p);
00150 }
00151
00152
00153
00154