69 {
70 uint32_t a, b, c, d, e;
71 typedef union {
72 unsigned char c[64];
73 uint32_t l[16];
74 } CHAR64LONG16;
75 CHAR64LONG16 *block;
76#ifdef SHA1HANDSOFF
77 unsigned char workspace[SHA1_BLOCK_LENGTH];
78
79 block = (CHAR64LONG16 *)workspace;
80 memcpy(block, buffer, SHA1_BLOCK_LENGTH);
81#else
82 block = (CHAR64LONG16 *)buffer;
83#endif
84
85 a = state[0];
86 b = state[1];
87 c = state[2];
88 d = state[3];
89 e = state[4];
90
91
100 R0(c, d, e, a, b, 8);
101 R0(b, c, d, e, a, 9);
102 R0(a, b, c, d, e, 10);
103 R0(e, a, b, c, d, 11);
104 R0(d, e, a, b, c, 12);
105 R0(c, d, e, a, b, 13);
106 R0(b, c, d, e, a, 14);
107 R0(a, b, c, d, e, 15);
108 R1(e, a, b, c, d, 16);
109 R1(d, e, a, b, c, 17);
110 R1(c, d, e, a, b, 18);
111 R1(b, c, d, e, a, 19);
112 R2(a, b, c, d, e, 20);
113 R2(e, a, b, c, d, 21);
114 R2(d, e, a, b, c, 22);
115 R2(c, d, e, a, b, 23);
116 R2(b, c, d, e, a, 24);
117 R2(a, b, c, d, e, 25);
118 R2(e, a, b, c, d, 26);
119 R2(d, e, a, b, c, 27);
120 R2(c, d, e, a, b, 28);
121 R2(b, c, d, e, a, 29);
122 R2(a, b, c, d, e, 30);
123 R2(e, a, b, c, d, 31);
124 R2(d, e, a, b, c, 32);
125 R2(c, d, e, a, b, 33);
126 R2(b, c, d, e, a, 34);
127 R2(a, b, c, d, e, 35);
128 R2(e, a, b, c, d, 36);
129 R2(d, e, a, b, c, 37);
130 R2(c, d, e, a, b, 38);
131 R2(b, c, d, e, a, 39);
132 R3(a, b, c, d, e, 40);
133 R3(e, a, b, c, d, 41);
134 R3(d, e, a, b, c, 42);
135 R3(c, d, e, a, b, 43);
136 R3(b, c, d, e, a, 44);
137 R3(a, b, c, d, e, 45);
138 R3(e, a, b, c, d, 46);
139 R3(d, e, a, b, c, 47);
140 R3(c, d, e, a, b, 48);
141 R3(b, c, d, e, a, 49);
142 R3(a, b, c, d, e, 50);
143 R3(e, a, b, c, d, 51);
144 R3(d, e, a, b, c, 52);
145 R3(c, d, e, a, b, 53);
146 R3(b, c, d, e, a, 54);
147 R3(a, b, c, d, e, 55);
148 R3(e, a, b, c, d, 56);
149 R3(d, e, a, b, c, 57);
150 R3(c, d, e, a, b, 58);
151 R3(b, c, d, e, a, 59);
152 R4(a, b, c, d, e, 60);
153 R4(e, a, b, c, d, 61);
154 R4(d, e, a, b, c, 62);
155 R4(c, d, e, a, b, 63);
156 R4(b, c, d, e, a, 64);
157 R4(a, b, c, d, e, 65);
158 R4(e, a, b, c, d, 66);
159 R4(d, e, a, b, c, 67);
160 R4(c, d, e, a, b, 68);
161 R4(b, c, d, e, a, 69);
162 R4(a, b, c, d, e, 70);
163 R4(e, a, b, c, d, 71);
164 R4(d, e, a, b, c, 72);
165 R4(c, d, e, a, b, 73);
166 R4(b, c, d, e, a, 74);
167 R4(a, b, c, d, e, 75);
168 R4(e, a, b, c, d, 76);
169 R4(d, e, a, b, c, 77);
170 R4(c, d, e, a, b, 78);
171 R4(b, c, d, e, a, 79);
172
173
174 state[0] += a;
175 state[1] += b;
176 state[2] += c;
177 state[3] += d;
178 state[4] += e;
179
180 a = b = c = d = e = 0;
181}
182
183
184
186
187 context->count = 0;
188 context->state[0] = 0x67452301;
189 context->state[1] = 0xEFCDAB89;
190 context->state[2] = 0x98BADCFE;
191 context->state[3] = 0x10325476;
192 context->state[4] = 0xC3D2E1F0;
193}
194
195
196
197void SHA1Update(SHA1_CTX *context,
const void *dataptr,
unsigned int len) {
198 const uint8_t *data = dataptr;
199 unsigned int i;
200 unsigned int j;
201
202 j = (uint32_t)((context->count >> 3) & 63);
203 context->count += (len << 3);
204 if ((j + len) > 63) {
205 memcpy(&context->buffer[j], data, (i = 64 - j));
207 for (; i + 63 < len; i += 64) {
209 }
210 j = 0;
211 } else
212 i = 0;
213 memcpy(&context->buffer[j], &data[i], len - i);
214}
215
216
217
218void SHA1Final(
unsigned char digest[SHA1_DIGEST_LENGTH], SHA1_CTX *context) {
219 unsigned int i;
220 unsigned char finalcount[8];
221
222 for (i = 0; i < 8; i++) {
223 finalcount[i] = (unsigned char)((context->count >> ((7 - (i & 7)) * 8)) & 255);
224 }
226 while ((context->count & 504) != 448) {
228 }
230
231 for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
232 digest[i] = (unsigned char)((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
233 }
234 memset(&finalcount, 0, sizeof(finalcount));
235 memset(context, 0, sizeof(*context));
236}
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)