4 #define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
6 static void SHA1_Transform(SHA1_CTX* ctx, const uint8_t data[64]) {
7 uint32_t a, b, c, d, e, i, j, t, m[80];
9 for (i = 0, j = 0; i < 16; ++i, j += 4)
10 m[i] = (data[j] << 24) | (data[j+1] << 16) | (data[j+2] << 8) | (data[j+3]);
12 m[i] = ROTLEFT(m[i-3] ^ m[i-8] ^ m[i-14] ^ m[i-16], 1);
20 for (i = 0; i < 80; ++i) {
22 t = ROTLEFT(a,5) + ((b & c) | (~b & d)) + e + m[i] + 0x5A827999;
24 t = ROTLEFT(a,5) + (b ^ c ^ d) + e + m[i] + 0x6ED9EBA1;
26 t = ROTLEFT(a,5) + ((b & c) | (b & d) | (c & d)) + e + m[i] + 0x8F1BBCDC;
28 t = ROTLEFT(a,5) + (b ^ c ^ d) + e + m[i] + 0xCA62C1D6;
44 void SHA1_Init(SHA1_CTX* ctx) {
45 ctx->state[0] = 0x67452301;
46 ctx->state[1] = 0xEFCDAB89;
47 ctx->state[2] = 0x98BADCFE;
48 ctx->state[3] = 0x10325476;
49 ctx->state[4] = 0xC3D2E1F0;
50 ctx->count[0] = ctx->count[1] = 0;
53 void SHA1_Update(SHA1_CTX* ctx, const uint8_t* data, uint32_t len) {
56 j = (ctx->count[0] >> 3) & 63;
57 if ((ctx->count[0] += len << 3) < (len << 3))
59 ctx->count[1] += (len >> 29);
62 memcpy(&ctx->buffer[j], data, (i = 64 - j));
63 SHA1_Transform(ctx, ctx->buffer);
64 for ( ; i + 63 < len; i += 64)
65 SHA1_Transform(ctx, &data[i]);
70 memcpy(&ctx->buffer[j], &data[i], len - i);
73 void SHA1_Final(uint8_t digest[20], SHA1_CTX* ctx) {
74 uint8_t finalcount[8];
78 for (i = 0; i < 8; i++)
79 finalcount[i] = (uint8_t)((ctx->count[(i >= 4 ? 0 : 1)]
80 >> ((3 - (i & 3)) * 8)) & 255);
83 SHA1_Update(ctx, &c, 1);
84 while ((ctx->count[0] & 504) != 448) {
86 SHA1_Update(ctx, &c, 1);
89 SHA1_Update(ctx, finalcount, 8);
91 for (i = 0; i < 20; i++)
92 digest[i] = (uint8_t)((ctx->state[i>>2] >> ((3 - (i & 3)) * 8)) & 255);
94 memset(ctx, 0, sizeof(*ctx));