44 #include <isc/assertions.h> 46 #include <isc/string.h> 47 #include <isc/types.h> 51 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) 57 #if !defined(WORDS_BIGENDIAN) 59 (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) \ 60 | (rol(block->l[i], 8) & 0x00FF00FF)) 62 # define blk0(i) block->l[i] 65 (block->l[i & 15] = rol(block->l[(i + 13) & 15] \ 66 ^ block->l[(i + 8) & 15] \ 67 ^ block->l[(i + 2) & 15] \ 68 ^ block->l[i & 15], 1)) 73 #define R0(v,w,x,y,z,i) \ 74 z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \ 76 #define R1(v,w,x,y,z,i) \ 77 z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \ 79 #define R2(v,w,x,y,z,i) \ 80 z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \ 82 #define R3(v,w,x,y,z,i) \ 83 z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \ 85 #define R4(v,w,x,y,z,i) \ 86 z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \ 105 #define nR0(v,w,x,y,z,i) R0(*v,*w,*x,*y,*z,i) 106 #define nR1(v,w,x,y,z,i) R1(*v,*w,*x,*y,*z,i) 107 #define nR2(v,w,x,y,z,i) R2(*v,*w,*x,*y,*z,i) 108 #define nR3(v,w,x,y,z,i) R3(*v,*w,*x,*y,*z,i) 109 #define nR4(v,w,x,y,z,i) R4(*v,*w,*x,*y,*z,i) 115 nR0(a, b, c, d, e, 0);
116 nR0(e, a, b, c, d, 1);
117 nR0(d, e, a, b, c, 2);
118 nR0(c, d, e, a, b, 3);
119 nR0(b, c, d, e, a, 4);
120 nR0(a, b, c, d, e, 5);
121 nR0(e, a, b, c, d, 6);
122 nR0(d, e, a, b, c, 7);
123 nR0(c, d, e, a, b, 8);
124 nR0(b, c, d, e, a, 9);
125 nR0(a, b, c, d, e, 10);
126 nR0(e, a, b, c, d, 11);
127 nR0(d, e, a, b, c, 12);
128 nR0(c, d, e, a, b, 13);
129 nR0(b, c, d, e, a, 14);
130 nR0(a, b, c, d, e, 15);
131 nR1(e, a, b, c, d, 16);
132 nR1(d, e, a, b, c, 17);
133 nR1(c, d, e, a, b, 18);
134 nR1(b, c, d, e, a, 19);
141 nR2(a, b, c, d, e, 20);
142 nR2(e, a, b, c, d, 21);
143 nR2(d, e, a, b, c, 22);
144 nR2(c, d, e, a, b, 23);
145 nR2(b, c, d, e, a, 24);
146 nR2(a, b, c, d, e, 25);
147 nR2(e, a, b, c, d, 26);
148 nR2(d, e, a, b, c, 27);
149 nR2(c, d, e, a, b, 28);
150 nR2(b, c, d, e, a, 29);
151 nR2(a, b, c, d, e, 30);
152 nR2(e, a, b, c, d, 31);
153 nR2(d, e, a, b, c, 32);
154 nR2(c, d, e, a, b, 33);
155 nR2(b, c, d, e, a, 34);
156 nR2(a, b, c, d, e, 35);
157 nR2(e, a, b, c, d, 36);
158 nR2(d, e, a, b, c, 37);
159 nR2(c, d, e, a, b, 38);
160 nR2(b, c, d, e, a, 39);
167 nR3(a, b, c, d, e, 40);
168 nR3(e, a, b, c, d, 41);
169 nR3(d, e, a, b, c, 42);
170 nR3(c, d, e, a, b, 43);
171 nR3(b, c, d, e, a, 44);
172 nR3(a, b, c, d, e, 45);
173 nR3(e, a, b, c, d, 46);
174 nR3(d, e, a, b, c, 47);
175 nR3(c, d, e, a, b, 48);
176 nR3(b, c, d, e, a, 49);
177 nR3(a, b, c, d, e, 50);
178 nR3(e, a, b, c, d, 51);
179 nR3(d, e, a, b, c, 52);
180 nR3(c, d, e, a, b, 53);
181 nR3(b, c, d, e, a, 54);
182 nR3(a, b, c, d, e, 55);
183 nR3(e, a, b, c, d, 56);
184 nR3(d, e, a, b, c, 57);
185 nR3(c, d, e, a, b, 58);
186 nR3(b, c, d, e, a, 59);
193 nR4(a, b, c, d, e, 60);
194 nR4(e, a, b, c, d, 61);
195 nR4(d, e, a, b, c, 62);
196 nR4(c, d, e, a, b, 63);
197 nR4(b, c, d, e, a, 64);
198 nR4(a, b, c, d, e, 65);
199 nR4(e, a, b, c, d, 66);
200 nR4(d, e, a, b, c, 67);
201 nR4(c, d, e, a, b, 68);
202 nR4(b, c, d, e, a, 69);
203 nR4(a, b, c, d, e, 70);
204 nR4(e, a, b, c, d, 71);
205 nR4(d, e, a, b, c, 72);
206 nR4(c, d, e, a, b, 73);
207 nR4(b, c, d, e, a, 74);
208 nR4(a, b, c, d, e, 75);
209 nR4(e, a, b, c, d, 76);
210 nR4(d, e, a, b, c, 77);
211 nR4(c, d, e, a, b, 78);
212 nR4(b, c, d, e, a, 79);
220 transform(
uint32_t state[5],
const unsigned char buffer[64])
230 (void)
memcpy(block, buffer, 64);
240 do_R01(&a, &b, &c, &d, &e, block);
241 do_R2(&a, &b, &c, &d, &e, block);
242 do_R3(&a, &b, &c, &d, &e, block);
243 do_R4(&a, &b, &c, &d, &e, block);
246 R0(a, b, c, d, e, 0);
247 R0(e, a, b, c, d, 1);
248 R0(d, e, a, b, c, 2);
249 R0(c, d, e, a, b, 3);
250 R0(b, c, d, e, a, 4);
251 R0(a, b, c, d, e, 5);
252 R0(e, a, b, c, d, 6);
253 R0(d, e, a, b, c, 7);
254 R0(c, d, e, a, b, 8);
255 R0(b, c, d, e, a, 9);
256 R0(a, b, c, d, e, 10);
257 R0(e, a, b, c, d, 11);
258 R0(d, e, a, b, c, 12);
259 R0(c, d, e, a, b, 13);
260 R0(b, c, d, e, a, 14);
261 R0(a, b, c, d, e, 15);
262 R1(e, a, b, c, d, 16);
263 R1(d, e, a, b, c, 17);
264 R1(c, d, e, a, b, 18);
265 R1(b, c, d, e, a, 19);
266 R2(a, b, c, d, e, 20);
267 R2(e, a, b, c, d, 21);
268 R2(d, e, a, b, c, 22);
269 R2(c, d, e, a, b, 23);
270 R2(b, c, d, e, a, 24);
271 R2(a, b, c, d, e, 25);
272 R2(e, a, b, c, d, 26);
273 R2(d, e, a, b, c, 27);
274 R2(c, d, e, a, b, 28);
275 R2(b, c, d, e, a, 29);
276 R2(a, b, c, d, e, 30);
277 R2(e, a, b, c, d, 31);
278 R2(d, e, a, b, c, 32);
279 R2(c, d, e, a, b, 33);
280 R2(b, c, d, e, a, 34);
281 R2(a, b, c, d, e, 35);
282 R2(e, a, b, c, d, 36);
283 R2(d, e, a, b, c, 37);
284 R2(c, d, e, a, b, 38);
285 R2(b, c, d, e, a, 39);
286 R3(a, b, c, d, e, 40);
287 R3(e, a, b, c, d, 41);
288 R3(d, e, a, b, c, 42);
289 R3(c, d, e, a, b, 43);
290 R3(b, c, d, e, a, 44);
291 R3(a, b, c, d, e, 45);
292 R3(e, a, b, c, d, 46);
293 R3(d, e, a, b, c, 47);
294 R3(c, d, e, a, b, 48);
295 R3(b, c, d, e, a, 49);
296 R3(a, b, c, d, e, 50);
297 R3(e, a, b, c, d, 51);
298 R3(d, e, a, b, c, 52);
299 R3(c, d, e, a, b, 53);
300 R3(b, c, d, e, a, 54);
301 R3(a, b, c, d, e, 55);
302 R3(e, a, b, c, d, 56);
303 R3(d, e, a, b, c, 57);
304 R3(c, d, e, a, b, 58);
305 R3(b, c, d, e, a, 59);
306 R4(a, b, c, d, e, 60);
307 R4(e, a, b, c, d, 61);
308 R4(d, e, a, b, c, 62);
309 R4(c, d, e, a, b, 63);
310 R4(b, c, d, e, a, 64);
311 R4(a, b, c, d, e, 65);
312 R4(e, a, b, c, d, 66);
313 R4(d, e, a, b, c, 67);
314 R4(c, d, e, a, b, 68);
315 R4(b, c, d, e, a, 69);
316 R4(a, b, c, d, e, 70);
317 R4(e, a, b, c, d, 71);
318 R4(d, e, a, b, c, 72);
319 R4(c, d, e, a, b, 73);
320 R4(b, c, d, e, a, 74);
321 R4(a, b, c, d, e, 75);
322 R4(e, a, b, c, d, 76);
323 R4(d, e, a, b, c, 77);
324 R4(c, d, e, a, b, 78);
325 R4(b, c, d, e, a, 79);
336 a = b = c = d = e = 0;
349 context->
state[0] = 0x67452301;
350 context->
state[1] = 0xEFCDAB89;
351 context->
state[2] = 0x98BADCFE;
352 context->
state[3] = 0x10325476;
353 context->
state[4] = 0xC3D2E1F0;
354 context->
count[0] = 0;
355 context->
count[1] = 0;
361 memset(context, 0,
sizeof (
ZESHA1_T));
376 j = context->
count[0];
377 if ((context->
count[0] += len << 3) < j)
378 context->
count[1] += (len >> 29) + 1;
384 for (; i + 63 < len; i += 64)
385 transform(context->
state, &data[i]);
400 static const unsigned char final_200 = 128;
401 static const unsigned char final_0 = 0;
407 unsigned char finalcount[8];
412 for (i = 0; i < 8; i++)
415 finalcount[i] = (
unsigned char)
416 ((context->
count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255);
420 while ((context->
count[0] & 504) != 448)
427 for (i = 0; i < 20; i++)
428 digest[i] = (
unsigned char)
429 ((context->
state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
432 memset(context, 0,
sizeof (
ZESHA1_T));
#define R4(v, w, x, y, z, i)
void zeSHA1_Init(ZESHA1_T *context)
void zeSHA1_Invalidate(ZESHA1_T *context)
#define R3(v, w, x, y, z, i)
#define R0(v, w, x, y, z, i)
void zeSHA1_Final(ZESHA1_T *context, unsigned char *digest)
#define R2(v, w, x, y, z, i)
#define R1(v, w, x, y, z, i)
void zeSHA1_Update(ZESHA1_T *context, const unsigned char *data, unsigned int len)