00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 #include <stdio.h>
00104 #include <string.h>
00105
00106 #include "common/h/Types.h"
00107 #include "common/h/sha1.h"
00108
00109
00110
00111 typedef struct {
00112 uint32_t state[5];
00113 uint32_t count[2];
00114 unsigned char buffer[64];
00115 } SHA1_CTX;
00116
00117 void SHA1Transform(uint32_t state[5], unsigned char buffer[64]);
00118 void SHA1Init(SHA1_CTX* context);
00119 void SHA1Update(SHA1_CTX* context, unsigned char* data, uint32_t len);
00120 void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
00121
00122 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
00123
00124
00125
00126 #if defined(arch_power) //Big Endian
00127 #define blk0(i) block->l[i]
00128 #else
00129 #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
00130 |(rol(block->l[i],8)&0x00FF00FF))
00131 #endif
00132 #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
00133 ^block->l[(i+2)&15]^block->l[i&15],1))
00134
00135
00136 #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
00137 #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
00138 #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
00139 #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
00140 #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
00141
00142
00143 #ifdef VERBOSE
00144 void SHAPrintContext(SHA1_CTX *context, char *msg){
00145 printf("%s (%d,%d) %x %x %x %x %x\n",
00146 msg,
00147 context->count[0], context->count[1],
00148 context->state[0],
00149 context->state[1],
00150 context->state[2],
00151 context->state[3],
00152 context->state[4]);
00153 }
00154 #endif
00155
00156
00157
00158 void SHA1Transform(uint32_t state[5], unsigned char buffer[64])
00159 {
00160 uint32_t a, b, c, d, e;
00161 typedef union {
00162 unsigned char c[64];
00163 uint32_t l[16];
00164 } CHAR64LONG16;
00165 CHAR64LONG16* block;
00166 #ifdef SHA1HANDSOFF
00167 static unsigned char workspace[64];
00168 block = (CHAR64LONG16*)workspace;
00169 memcpy(block, buffer, 64);
00170 #else
00171 block = (CHAR64LONG16*)(void*)buffer;
00172 #endif
00173
00174 a = state[0];
00175 b = state[1];
00176 c = state[2];
00177 d = state[3];
00178 e = state[4];
00179
00180 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);
00181 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);
00182 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);
00183 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);
00184 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);
00185 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);
00186 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);
00187 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);
00188 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);
00189 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);
00190 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);
00191 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);
00192 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);
00193 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);
00194 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);
00195 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);
00196 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);
00197 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);
00198 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);
00199 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);
00200
00201 state[0] += a;
00202 state[1] += b;
00203 state[2] += c;
00204 state[3] += d;
00205 state[4] += e;
00206
00207 a = b = c = d = e = 0;
00208 }
00209
00210
00211
00212
00213 void SHA1Init(SHA1_CTX* context)
00214 {
00215
00216 context->state[0] = 0x67452301;
00217 context->state[1] = 0xEFCDAB89;
00218 context->state[2] = 0x98BADCFE;
00219 context->state[3] = 0x10325476;
00220 context->state[4] = 0xC3D2E1F0;
00221 context->count[0] = context->count[1] = 0;
00222 }
00223
00224
00225
00226
00227 void SHA1Update(SHA1_CTX* context, unsigned char* data, uint32_t len)
00228 {
00229 uint32_t i, j;
00230
00231 #ifdef VERBOSE
00232 SHAPrintContext(context, "before");
00233 #endif
00234 j = (context->count[0] >> 3) & 63;
00235 if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
00236 context->count[1] += (len >> 29);
00237 if ((j + len) > 63) {
00238 memcpy(&context->buffer[j], data, (i = 64-j));
00239 SHA1Transform(context->state, context->buffer);
00240 for ( ; i + 63 < len; i += 64) {
00241 SHA1Transform(context->state, &data[i]);
00242 }
00243 j = 0;
00244 }
00245 else i = 0;
00246 memcpy(&context->buffer[j], &data[i], len - i);
00247 #ifdef VERBOSE
00248 SHAPrintContext(context, "after ");
00249 #endif
00250 }
00251
00252
00253
00254
00255 void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
00256 {
00257 uint32_t i;
00258 unsigned char finalcount[8];
00259
00260 for (i = 0; i < 8; i++) {
00261 finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
00262 >> ((3-(i & 3)) * 8) ) & 255);
00263 }
00264 SHA1Update(context, (unsigned char *)const_cast< char *>("\200"), 1);
00265 while ((context->count[0] & 504) != 448) {
00266 SHA1Update(context, (unsigned char *)const_cast<char *>("\0"), 1);
00267 }
00268 SHA1Update(context, finalcount, 8);
00269 for (i = 0; i < 20; i++) {
00270 digest[i] = (unsigned char)
00271 ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
00272 }
00273
00274 i = 0;
00275 memset(context->buffer, 0, 64);
00276 memset(context->state, 0, 20);
00277 memset(context->count, 0, 8);
00278 memset(finalcount, 0, 8);
00279 #ifdef SHA1HANDSOFF
00280 SHA1Transform(context->state, context->buffer);
00281 #endif
00282 }
00283
00284
00285
00286 char *sha1_file(const char *filename, char *result_ptr)
00287 {
00288 static char result[SHA1_STRING_LEN] = {0};
00289
00290 SHA1_CTX ctx;
00291 unsigned char buf[16384];
00292
00293 if (result_ptr == NULL)
00294 result_ptr = result;
00295
00296 FILE *fd = fopen(filename, "r");
00297 if (!fd) return NULL;
00298
00299 SHA1Init(&ctx);
00300 while (!feof(fd)) {
00301 unsigned long len = fread((char *)buf, sizeof(char), sizeof(buf), fd);
00302 if (ferror(fd)) {
00303 fclose(fd);
00304 return NULL;
00305 }
00306 SHA1Update(&ctx, buf, len);
00307 }
00308 SHA1Final(buf, &ctx);
00309
00310 fclose(fd);
00311
00312 for (unsigned int i = 0; i < SHA1_DIGEST_LEN; ++i)
00313 sprintf(&result_ptr[i*2], "%02x", buf[i]);
00314
00315 return result_ptr;
00316 }