00001
00002
00003
00004
00005 #include "db_config.h"
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 #define SHA1HANDSOFF
00078
00079 #ifndef NO_SYSTEM_INCLUDES
00080 #include <string.h>
00081 #endif
00082
00083 #include "db_int.h"
00084 #include "dbinc/hmac.h"
00085
00086
00087
00088
00089 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
00090
00091
00092
00093 #define blk0(i) is_bigendian ? block->l[i] : \
00094 (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
00095 |(rol(block->l[i],8)&0x00FF00FF))
00096 #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
00097 ^block->l[(i+2)&15]^block->l[i&15],1))
00098
00099
00100 #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
00101 #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
00102 #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
00103 #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
00104 #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
00105
00106
00107 #ifdef VERBOSE
00108 static void __db_SHAPrintContext __P((SHA1_CTX *, char *));
00109 static void
00110 __db_SHAPrintContext(context, msg)
00111 SHA1_CTX *context;
00112 char *msg;
00113 {
00114 printf("%s (%d,%d) %x %x %x %x %x\n",
00115 msg,
00116 context->count[0], context->count[1],
00117 context->state[0],
00118 context->state[1],
00119 context->state[2],
00120 context->state[3],
00121 context->state[4]);
00122 }
00123 #endif
00124
00125
00126
00127
00128
00129
00130
00131
00132 void
00133 __db_SHA1Transform(state, buffer)
00134 u_int32_t *state;
00135 unsigned char *buffer;
00136 {
00137 u_int32_t a, b, c, d, e;
00138 typedef union {
00139 unsigned char c[64];
00140 u_int32_t l[16];
00141 } CHAR64LONG16;
00142 CHAR64LONG16* block;
00143 static int is_bigendian = -1;
00144 #ifdef SHA1HANDSOFF
00145 unsigned char workspace[64];
00146
00147 block = (CHAR64LONG16*)workspace;
00148 memcpy(block, buffer, 64);
00149 #else
00150 block = (CHAR64LONG16*)buffer;
00151 #endif
00152 if (is_bigendian == -1)
00153 is_bigendian = __db_isbigendian();
00154
00155 a = state[0];
00156 b = state[1];
00157 c = state[2];
00158 d = state[3];
00159 e = state[4];
00160
00161 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);
00162 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);
00163 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);
00164 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);
00165 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);
00166 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);
00167 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);
00168 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);
00169 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);
00170 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);
00171 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);
00172 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);
00173 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);
00174 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);
00175 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);
00176 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);
00177 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);
00178 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);
00179 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);
00180 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);
00181
00182 state[0] += a;
00183 state[1] += b;
00184 state[2] += c;
00185 state[3] += d;
00186 state[4] += e;
00187
00188 a = b = c = d = e = 0;
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 void
00201 __db_SHA1Init(context)
00202 SHA1_CTX *context;
00203 {
00204
00205 context->state[0] = 0x67452301;
00206 context->state[1] = 0xEFCDAB89;
00207 context->state[2] = 0x98BADCFE;
00208 context->state[3] = 0x10325476;
00209 context->state[4] = 0xC3D2E1F0;
00210 context->count[0] = context->count[1] = 0;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 void
00224 __db_SHA1Update(context, data, len)
00225 SHA1_CTX *context;
00226 unsigned char *data;
00227 size_t len;
00228 {
00229 u_int32_t i, j;
00230
00231 #ifdef VERBOSE
00232 __db_SHAPrintContext(context, "before");
00233 #endif
00234 j = (context->count[0] >> 3) & 63;
00235 if ((context->count[0] += (u_int32_t)len << 3) < (len << 3)) context->count[1]++;
00236 context->count[1] += (u_int32_t)(len >> 29);
00237 if ((j + len) > 63) {
00238 memcpy(&context->buffer[j], data, (i = 64-j));
00239 __db_SHA1Transform(context->state, context->buffer);
00240 for ( ; i + 63 < len; i += 64) {
00241 __db_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 __db_SHAPrintContext(context, "after ");
00249 #endif
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 void
00262 __db_SHA1Final(digest, context)
00263 unsigned char *digest;
00264 SHA1_CTX *context;
00265 {
00266 u_int32_t i;
00267 unsigned char finalcount[8];
00268
00269 for (i = 0; i < 8; i++) {
00270 finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
00271 >> ((3-(i & 3)) * 8) ) & 255);
00272 }
00273 __db_SHA1Update(context, (unsigned char *)"\200", 1);
00274 while ((context->count[0] & 504) != 448) {
00275 __db_SHA1Update(context, (unsigned char *)"\0", 1);
00276 }
00277 __db_SHA1Update(context, finalcount, 8);
00278
00279 for (i = 0; i < 20; i++) {
00280 digest[i] = (unsigned char)
00281 ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
00282 }
00283
00284 i = 0;
00285 memset(context->buffer, 0, 64);
00286 memset(context->state, 0, 20);
00287 memset(context->count, 0, 8);
00288 memset(finalcount, 0, 8);
00289 #ifdef SHA1HANDSOFF
00290 __db_SHA1Transform(context->state, context->buffer);
00291 #endif
00292 }
00293
00294
00295