00001
00002
00003
00004
00005
00006
00007 #include <string.h>
00008 #include <stdio.h>
00009 #include "sockRoutines.h"
00010 #include "conv-ccs.h"
00011 #include "ccs-auth.h"
00012
00013
00014 int CCS_AUTH_makeSecretKey(const char *str,CcsSec_secretKey *key)
00015 {
00016 int i;
00017 memset(key->data,0,sizeof(CcsSec_secretKey));
00018 for (i=0;i<sizeof(key->data);i++) {
00019 int cur=0;
00020 char tmp[3];
00021 tmp[0]=str[2*i+0];
00022 tmp[1]=str[2*i+1];
00023 if (tmp[1]==0 || tmp[1]==' ' || tmp[1]=='\n') tmp[1]='0';
00024 tmp[2]=0;
00025 if (1!=sscanf(tmp,"%d",&cur)) break;
00026 key->data[i]=(unsigned char)cur;
00027 }
00028 if (i==0) return 0;
00029 else return 1;
00030 }
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 typedef unsigned int word32;
00050 typedef unsigned char byte8;
00051
00052 static void SHA1_init(word32 *state)
00053 {
00054 state[0] = 0x67452301u;
00055 state[1] = 0xEFCDAB89u;
00056 state[2] = 0x98BADCFEu;
00057 state[3] = 0x10325476u;
00058 state[4] = 0xC3D2E1F0u;
00059 }
00060
00061 static word32 rotlFixed(word32 x, word32 y)
00062 {
00063 #if defined(_MSC_VER) || defined(__BCPLUSPLUS__)
00064 return y ? _lrotl(x, y) : x;
00065 #elif defined(__MWERKS__) && TARGET_CPU_PPC
00066 return y ? __rlwinm(x,y,0,31) : x;
00067 #else
00068 return ((0xFFffFFffu)&(x<<y)) | (((0xFFffFFffu)&x)>>(32-y));
00069 #endif
00070 }
00071
00072 #define blk0(i) (W[i] = data[i])
00073 #define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))
00074
00075 #define f1(x,y,z) (z^(x&(y^z)))
00076 #define f2(x,y,z) (x^y^z)
00077 #define f3(x,y,z) ((x&y)|(z&(x|y)))
00078 #define f4(x,y,z) (x^y^z)
00079
00080
00081 #define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999u+rotlFixed(v,5);w=rotlFixed(w,30);
00082 #define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999u+rotlFixed(v,5);w=rotlFixed(w,30);
00083 #define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1u+rotlFixed(v,5);w=rotlFixed(w,30);
00084 #define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDCu+rotlFixed(v,5);w=rotlFixed(w,30);
00085 #define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6u+rotlFixed(v,5);w=rotlFixed(w,30);
00086
00087 static void SHA1_transform(word32 *state, const word32 *data)
00088 {
00089 word32 W[16];
00090
00091 word32 a = state[0];
00092 word32 b = state[1];
00093 word32 c = state[2];
00094 word32 d = state[3];
00095 word32 e = state[4];
00096
00097 R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
00098 R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
00099 R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
00100 R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
00101 R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
00102 R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
00103 R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
00104 R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
00105 R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
00106 R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
00107 R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
00108 R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
00109 R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
00110 R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
00111 R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
00112 R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
00113 R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
00114 R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
00115 R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
00116 R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
00117
00118 state[0] += a;
00119 state[1] += b;
00120 state[2] += c;
00121 state[3] += d;
00122 state[4] += e;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 static void SHA1_hash(const byte8 *in,SHA1_hash_t *out)
00134 {
00135 int i;
00136 #define SHA1_data_len 16
00137 #define SHA1_hash_len 5
00138 word32 message[SHA1_data_len];
00139 word32 hash[SHA1_hash_len];
00140
00141
00142
00143 for (i=0;i<SHA1_data_len-3;i++)
00144 message[i]=(in[i*4+0]<<24)+(in[i*4+1]<<16)+
00145 (in[i*4+2]<< 8)+(in[i*4+3]<< 0);
00146
00147 message[13]=0x80000000u;
00148 message[14]=0x00000000u;
00149 message[15]=512-64-32;
00150
00151
00152 SHA1_init(hash);
00153 SHA1_transform(hash,message);
00154
00155
00156 for (i=0;i<SHA1_hash_len;i++) {
00157 out->data[i*4+0]=0xffu & (hash[i]>>24);
00158 out->data[i*4+1]=0xffu & (hash[i]>>16);
00159 out->data[i*4+2]=0xffu & (hash[i]>> 8);
00160 out->data[i*4+3]=0xffu & (hash[i]>> 0);
00161 }
00162 }
00163
00164 #if SHA1_TEST_DRIVER
00165
00166
00167
00168 int main(int argc,char *argv[])
00169 {
00170 int i;
00171 SHA1_hash_t h;
00172 byte8 message[52]; memset(message,0,52);
00173 message[0]=0x01;
00174 SHA1_hash(message, &h);
00175 for (i=0;i<sizeof(h);i++) printf("%02X",h.data[i]);
00176 printf("\n");
00177 }
00178 #endif
00179
00180
00181
00182 static int SHA1_differ(const SHA1_hash_t *a,const SHA1_hash_t *b)
00183 {
00184 return 0!=memcmp(a->data,b->data,sizeof(SHA1_hash_t));
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 void CCS_AUTH_hash(const CcsSec_secretKey *key,unsigned int salt,
00196 const CcsMessageHeader *hdrOrNull,SHA1_hash_t *out)
00197 {
00198
00199 byte8 mess[64];
00200 byte8 *messCur=mess;
00201
00202 memset(mess,0,64);
00203 memcpy(messCur,key,sizeof(CcsSec_secretKey));
00204 messCur+=sizeof(CcsSec_secretKey);
00205
00206 *(ChMessageInt_t *)messCur=ChMessageInt_new(salt);
00207 messCur+=sizeof(ChMessageInt_t);
00208
00209 if (hdrOrNull!=NULL) {
00210 const int headerBytes=16;
00211 memcpy(messCur,hdrOrNull,headerBytes);
00212 }
00213
00214 SHA1_hash(mess,out);
00215 }
00216
00217
00218 int CCS_AUTH_differ(const CcsSec_secretKey *key,unsigned int salt,
00219 const CcsMessageHeader *hdrOrNull,SHA1_hash_t *given)
00220 {
00221 SHA1_hash_t cur;
00222 CCS_AUTH_hash(key,salt,hdrOrNull,&cur);
00223 return SHA1_differ(&cur,given);
00224 }
00225
00226
00227
00228
00229 #include <stdlib.h>
00230
00231 #if defined(_WIN32)
00232 #include <sys/timeb.h>
00233 #else
00234 #include <sys/time.h>
00235 #include <fcntl.h>
00236 #endif
00237
00238 void CCS_RAND_new(CCS_RAND_state *s)
00239 {
00240 int i,randFD;
00241 static int newCount=0;
00242 byte8 tmp[sizeof(s->state)];
00243
00244
00245
00246 s->state[32] ^= newCount++;
00247
00248
00249
00250 #if defined(_WIN32)
00251 _ftime((struct _timeb *)tmp);
00252 for (i=0;i<sizeof(s->state);i++)
00253 s->state[i]^=tmp[i];
00254 #else
00255
00256 gettimeofday((struct timeval *)tmp,NULL);
00257 for (i=0;i<sizeof(s->state);i++)
00258 s->state[i]^=tmp[i];
00259
00260
00261 randFD=open("/dev/urandom",O_RDONLY);
00262 if (randFD!=-1) {
00263 if (sizeof(s->state)==read(randFD,tmp,sizeof(s->state)))
00264 for (i=0;i<sizeof(s->state);i++)
00265 s->state[i]^=tmp[i];
00266 close(randFD);
00267 }
00268 #endif
00269 }
00270
00271 word32 CCS_RAND_next(CCS_RAND_state *s) {
00272 SHA1_hash_t ret;
00273
00274 (*(int *)(s->state))++;
00275 SHA1_hash(s->state,&ret);
00276 return *(word32 *)(&ret);
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289