22#include <ascii-chat/crypto/sha1.h>
25#if !defined(BYTE_ORDER)
26#if defined(__BYTE_ORDER__)
27#define BYTE_ORDER __BYTE_ORDER__
28#define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
29#define BIG_ENDIAN __ORDER_BIG_ENDIAN__
32#define BYTE_ORDER 1234
33#define LITTLE_ENDIAN 1234
34#define BIG_ENDIAN 4321
38#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
42#if BYTE_ORDER == LITTLE_ENDIAN
43#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF))
45#define blk0(i) block->l[i]
49 rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
52#define R0(v, w, x, y, z, i) \
53 z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
55#define R1(v, w, x, y, z, i) \
56 z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
58#define R2(v, w, x, y, z, i) \
59 z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \
61#define R3(v, w, x, y, z, i) \
62 z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
64#define R4(v, w, x, y, z, i) \
65 z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
70void SHA1Transform(uint32_t state[5],
const unsigned char buffer[SHA1_BLOCK_LENGTH]) {
71 uint32_t a, b, c, d, e;
78 unsigned char workspace[SHA1_BLOCK_LENGTH];
80 block = (CHAR64LONG16 *)workspace;
81 memcpy(block, buffer, SHA1_BLOCK_LENGTH);
83 block = (CHAR64LONG16 *)buffer;
100 R0(d, e, a, b, c, 7);
101 R0(c, d, e, a, b, 8);
102 R0(b, c, d, e, a, 9);
103 R0(a, b, c, d, e, 10);
104 R0(e, a, b, c, d, 11);
105 R0(d, e, a, b, c, 12);
106 R0(c, d, e, a, b, 13);
107 R0(b, c, d, e, a, 14);
108 R0(a, b, c, d, e, 15);
109 R1(e, a, b, c, d, 16);
110 R1(d, e, a, b, c, 17);
111 R1(c, d, e, a, b, 18);
112 R1(b, c, d, e, a, 19);
113 R2(a, b, c, d, e, 20);
114 R2(e, a, b, c, d, 21);
115 R2(d, e, a, b, c, 22);
116 R2(c, d, e, a, b, 23);
117 R2(b, c, d, e, a, 24);
118 R2(a, b, c, d, e, 25);
119 R2(e, a, b, c, d, 26);
120 R2(d, e, a, b, c, 27);
121 R2(c, d, e, a, b, 28);
122 R2(b, c, d, e, a, 29);
123 R2(a, b, c, d, e, 30);
124 R2(e, a, b, c, d, 31);
125 R2(d, e, a, b, c, 32);
126 R2(c, d, e, a, b, 33);
127 R2(b, c, d, e, a, 34);
128 R2(a, b, c, d, e, 35);
129 R2(e, a, b, c, d, 36);
130 R2(d, e, a, b, c, 37);
131 R2(c, d, e, a, b, 38);
132 R2(b, c, d, e, a, 39);
133 R3(a, b, c, d, e, 40);
134 R3(e, a, b, c, d, 41);
135 R3(d, e, a, b, c, 42);
136 R3(c, d, e, a, b, 43);
137 R3(b, c, d, e, a, 44);
138 R3(a, b, c, d, e, 45);
139 R3(e, a, b, c, d, 46);
140 R3(d, e, a, b, c, 47);
141 R3(c, d, e, a, b, 48);
142 R3(b, c, d, e, a, 49);
143 R3(a, b, c, d, e, 50);
144 R3(e, a, b, c, d, 51);
145 R3(d, e, a, b, c, 52);
146 R3(c, d, e, a, b, 53);
147 R3(b, c, d, e, a, 54);
148 R3(a, b, c, d, e, 55);
149 R3(e, a, b, c, d, 56);
150 R3(d, e, a, b, c, 57);
151 R3(c, d, e, a, b, 58);
152 R3(b, c, d, e, a, 59);
153 R4(a, b, c, d, e, 60);
154 R4(e, a, b, c, d, 61);
155 R4(d, e, a, b, c, 62);
156 R4(c, d, e, a, b, 63);
157 R4(b, c, d, e, a, 64);
158 R4(a, b, c, d, e, 65);
159 R4(e, a, b, c, d, 66);
160 R4(d, e, a, b, c, 67);
161 R4(c, d, e, a, b, 68);
162 R4(b, c, d, e, a, 69);
163 R4(a, b, c, d, e, 70);
164 R4(e, a, b, c, d, 71);
165 R4(d, e, a, b, c, 72);
166 R4(c, d, e, a, b, 73);
167 R4(b, c, d, e, a, 74);
168 R4(a, b, c, d, e, 75);
169 R4(e, a, b, c, d, 76);
170 R4(d, e, a, b, c, 77);
171 R4(c, d, e, a, b, 78);
172 R4(b, c, d, e, a, 79);
181 a = b = c = d = e = 0;
189 context->state[0] = 0x67452301;
190 context->state[1] = 0xEFCDAB89;
191 context->state[2] = 0x98BADCFE;
192 context->state[3] = 0x10325476;
193 context->state[4] = 0xC3D2E1F0;
198void SHA1Update(SHA1_CTX *context,
const void *dataptr,
unsigned int len) {
199 const uint8_t *data = dataptr;
203 j = (uint32_t)((context->count >> 3) & 63);
204 context->count += (len << 3);
205 if ((j + len) > 63) {
206 memcpy(&context->buffer[j], data, (i = 64 - j));
208 for (; i + 63 < len; i += 64) {
214 memcpy(&context->buffer[j], &data[i], len - i);
219void SHA1Final(
unsigned char digest[SHA1_DIGEST_LENGTH], SHA1_CTX *context) {
221 unsigned char finalcount[8];
223 for (i = 0; i < 8; i++) {
224 finalcount[i] = (
unsigned char)((context->count >> ((7 - (i & 7)) * 8)) & 255);
227 while ((context->count & 504) != 448) {
232 for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
233 digest[i] = (
unsigned char)((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
235 memset(&finalcount, 0,
sizeof(finalcount));
236 memset(context, 0,
sizeof(*context));
void SHA1Update(SHA1_CTX *context, const void *dataptr, unsigned int len)
void SHA1Init(SHA1_CTX *context)
#define R1(v, w, x, y, z, i)
#define R2(v, w, x, y, z, i)
#define R0(v, w, x, y, z, i)
void SHA1Transform(uint32_t state[5], const unsigned char buffer[SHA1_BLOCK_LENGTH])
#define R3(v, w, x, y, z, i)
void SHA1Final(unsigned char digest[SHA1_DIGEST_LENGTH], SHA1_CTX *context)
#define R4(v, w, x, y, z, i)