32 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
36 # define LITTLE_ENDIAN 1234
37 # define BIG_ENDIAN 4321
38 # if defined(sparc) || defined(__sparc) || defined(__sparc__)
39 # define BYTE_ORDER BIG_ENDIAN
41 # define BYTE_ORDER LITTLE_ENDIAN
49 #if BYTE_ORDER == LITTLE_ENDIAN
50 # define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
51 |(rol(block->l[i],8)&0x00FF00FF))
53 # define blk0(i) block->l[i]
55 #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
56 ^block->l[(i+2)&15]^block->l[i&15],1))
61 #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
62 #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
63 #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
64 #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
65 #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
71 SHA1Transform(uint32_t state[5],
const uint8_t buffer[SHA1_BLOCK_LENGTH])
73 uint32_t a, b, c, d, e;
78 CHAR64LONG16 realBlock;
79 CHAR64LONG16 *block= &realBlock;
81 (void)memcpy(block, buffer, SHA1_BLOCK_LENGTH);
91 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);
92 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);
93 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);
94 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);
95 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);
96 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);
97 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);
98 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);
99 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);
100 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);
101 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);
102 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);
103 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);
104 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);
105 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);
106 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);
107 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);
108 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);
109 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);
110 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);
120 a = b = c = d = e = 0;
133 context->state[0] = 0x67452301;
134 context->state[1] = 0xEFCDAB89;
135 context->state[2] = 0x98BADCFE;
136 context->state[3] = 0x10325476;
137 context->state[4] = 0xC3D2E1F0;
145 SHA1Update(
SHA1_CTX *context,
const uint8_t *data,
size_t len)
149 j = (size_t)((context->count >> 3) & 63);
150 context->count += (len << 3);
151 if ((j + len) > 63) {
152 (void)memcpy(&context->buffer[j], data, (i = 64-j));
153 SHA1Transform(context->state, context->buffer);
154 for ( ; i + 63 < len; i += 64)
155 SHA1Transform(context->state, (uint8_t *)&data[i]);
160 (void)memcpy(&context->buffer[j], &data[i], len - i);
170 uint8_t finalcount[8];
173 for (i = 0; i < 8; i++) {
174 finalcount[i] = (uint8_t)((context->count >>
175 ((7 - (i & 7)) * 8)) & 255);
177 SHA1Update(context, (uint8_t *)
"\200", 1);
178 while ((context->count & 504) != 448)
179 SHA1Update(context, (uint8_t *)
"\0", 1);
180 SHA1Update(context, finalcount, 8);
184 SHA1Final(uint8_t digest[SHA1_DIGEST_LENGTH],
SHA1_CTX *context)
190 for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
191 digest[i] = (uint8_t)
192 ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
194 memset(context, 0,
sizeof(*context));
198 void do_sha1(
data_ref in, uint8_t out[SHA1_DIGEST_LENGTH])
202 SHA1Update(&ctx, in.data(), in.size());
203 SHA1Final(out, &ctx);