This source file includes following definitions.
- SHA256_Init
- SHA256_Transform
- SHA256_Transform
- SHA256_Update
- SHA256_Final
- SHA512_Init
- SHA512_Transform
- SHA512_Transform
- SHA512_Update
- SHA512_Last
- SHA512_Final
- SHA384_Init
- SHA384_Update
- SHA384_Final
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include <sys/param.h>
38 #include <sys/time.h>
39 #include <sys/systm.h>
40 #include <crypto/sha2.h>
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 #if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
86 #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
87 #endif
88
89
90
91
92 #define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
93 #define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
94 #define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
95
96
97
98 #if BYTE_ORDER == LITTLE_ENDIAN
99 #define REVERSE32(w,x) { \
100 u_int32_t tmp = (w); \
101 tmp = (tmp >> 16) | (tmp << 16); \
102 (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
103 }
104 #define REVERSE64(w,x) { \
105 u_int64_t tmp = (w); \
106 tmp = (tmp >> 32) | (tmp << 32); \
107 tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
108 ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
109 (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
110 ((tmp & 0x0000ffff0000ffffULL) << 16); \
111 }
112 #endif
113
114
115
116
117
118
119 #define ADDINC128(w,n) { \
120 (w)[0] += (u_int64_t)(n); \
121 if ((w)[0] < (n)) { \
122 (w)[1]++; \
123 } \
124 }
125
126
127
128
129
130
131
132
133
134
135
136 #define R(b,x) ((x) >> (b))
137
138 #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
139
140 #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
141
142
143 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
144 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
145
146
147 #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
148 #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
149 #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
150 #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
151
152
153 #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
154 #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
155 #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
156 #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
157
158
159
160
161
162
163 void SHA512_Last(SHA512_CTX *);
164 void SHA256_Transform(SHA256_CTX *, const u_int8_t *);
165 void SHA512_Transform(SHA512_CTX *, const u_int8_t *);
166
167
168
169
170 const static u_int32_t K256[64] = {
171 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
172 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
173 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
174 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
175 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
176 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
177 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
178 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
179 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
180 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
181 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
182 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
183 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
184 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
185 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
186 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
187 };
188
189
190 const static u_int32_t sha256_initial_hash_value[8] = {
191 0x6a09e667UL,
192 0xbb67ae85UL,
193 0x3c6ef372UL,
194 0xa54ff53aUL,
195 0x510e527fUL,
196 0x9b05688cUL,
197 0x1f83d9abUL,
198 0x5be0cd19UL
199 };
200
201
202 const static u_int64_t K512[80] = {
203 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
204 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
205 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
206 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
207 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
208 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
209 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
210 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
211 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
212 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
213 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
214 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
215 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
216 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
217 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
218 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
219 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
220 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
221 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
222 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
223 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
224 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
225 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
226 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
227 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
228 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
229 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
230 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
231 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
232 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
233 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
234 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
235 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
236 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
237 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
238 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
239 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
240 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
241 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
242 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
243 };
244
245
246 const static u_int64_t sha384_initial_hash_value[8] = {
247 0xcbbb9d5dc1059ed8ULL,
248 0x629a292a367cd507ULL,
249 0x9159015a3070dd17ULL,
250 0x152fecd8f70e5939ULL,
251 0x67332667ffc00b31ULL,
252 0x8eb44a8768581511ULL,
253 0xdb0c2e0d64f98fa7ULL,
254 0x47b5481dbefa4fa4ULL
255 };
256
257
258 const static u_int64_t sha512_initial_hash_value[8] = {
259 0x6a09e667f3bcc908ULL,
260 0xbb67ae8584caa73bULL,
261 0x3c6ef372fe94f82bULL,
262 0xa54ff53a5f1d36f1ULL,
263 0x510e527fade682d1ULL,
264 0x9b05688c2b3e6c1fULL,
265 0x1f83d9abfb41bd6bULL,
266 0x5be0cd19137e2179ULL
267 };
268
269
270
271 void
272 SHA256_Init(SHA256_CTX *context)
273 {
274 if (context == NULL)
275 return;
276 bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
277 bzero(context->buffer, SHA256_BLOCK_LENGTH);
278 context->bitcount = 0;
279 }
280
281 #ifdef SHA2_UNROLL_TRANSFORM
282
283
284
285 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do { \
286 W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) | \
287 ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24); \
288 data += 4; \
289 T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
290 (d) += T1; \
291 (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
292 j++; \
293 } while(0)
294
295 #define ROUND256(a,b,c,d,e,f,g,h) do { \
296 s0 = W256[(j+1)&0x0f]; \
297 s0 = sigma0_256(s0); \
298 s1 = W256[(j+14)&0x0f]; \
299 s1 = sigma1_256(s1); \
300 T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + \
301 (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
302 (d) += T1; \
303 (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
304 j++; \
305 } while(0)
306
307 void
308 SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
309 {
310 u_int32_t a, b, c, d, e, f, g, h, s0, s1;
311 u_int32_t T1, *W256;
312 int j;
313
314 W256 = (u_int32_t *)context->buffer;
315
316
317 a = context->state[0];
318 b = context->state[1];
319 c = context->state[2];
320 d = context->state[3];
321 e = context->state[4];
322 f = context->state[5];
323 g = context->state[6];
324 h = context->state[7];
325
326 j = 0;
327 do {
328
329 ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
330 ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
331 ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
332 ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
333 ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
334 ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
335 ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
336 ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
337 } while (j < 16);
338
339
340 do {
341 ROUND256(a,b,c,d,e,f,g,h);
342 ROUND256(h,a,b,c,d,e,f,g);
343 ROUND256(g,h,a,b,c,d,e,f);
344 ROUND256(f,g,h,a,b,c,d,e);
345 ROUND256(e,f,g,h,a,b,c,d);
346 ROUND256(d,e,f,g,h,a,b,c);
347 ROUND256(c,d,e,f,g,h,a,b);
348 ROUND256(b,c,d,e,f,g,h,a);
349 } while (j < 64);
350
351
352 context->state[0] += a;
353 context->state[1] += b;
354 context->state[2] += c;
355 context->state[3] += d;
356 context->state[4] += e;
357 context->state[5] += f;
358 context->state[6] += g;
359 context->state[7] += h;
360
361
362 a = b = c = d = e = f = g = h = T1 = 0;
363 }
364
365 #else
366
367 void
368 SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
369 {
370 u_int32_t a, b, c, d, e, f, g, h, s0, s1;
371 u_int32_t T1, T2, *W256;
372 int j;
373
374 W256 = (u_int32_t *)context->buffer;
375
376
377 a = context->state[0];
378 b = context->state[1];
379 c = context->state[2];
380 d = context->state[3];
381 e = context->state[4];
382 f = context->state[5];
383 g = context->state[6];
384 h = context->state[7];
385
386 j = 0;
387 do {
388 W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) |
389 ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24);
390 data += 4;
391
392 T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
393 T2 = Sigma0_256(a) + Maj(a, b, c);
394 h = g;
395 g = f;
396 f = e;
397 e = d + T1;
398 d = c;
399 c = b;
400 b = a;
401 a = T1 + T2;
402
403 j++;
404 } while (j < 16);
405
406 do {
407
408 s0 = W256[(j+1)&0x0f];
409 s0 = sigma0_256(s0);
410 s1 = W256[(j+14)&0x0f];
411 s1 = sigma1_256(s1);
412
413
414 T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
415 (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
416 T2 = Sigma0_256(a) + Maj(a, b, c);
417 h = g;
418 g = f;
419 f = e;
420 e = d + T1;
421 d = c;
422 c = b;
423 b = a;
424 a = T1 + T2;
425
426 j++;
427 } while (j < 64);
428
429
430 context->state[0] += a;
431 context->state[1] += b;
432 context->state[2] += c;
433 context->state[3] += d;
434 context->state[4] += e;
435 context->state[5] += f;
436 context->state[6] += g;
437 context->state[7] += h;
438
439
440 a = b = c = d = e = f = g = h = T1 = T2 = 0;
441 }
442
443 #endif
444
445 void
446 SHA256_Update(SHA256_CTX *context, const u_int8_t *data, size_t len)
447 {
448 size_t freespace, usedspace;
449
450
451 if (len == 0)
452 return;
453
454 usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
455 if (usedspace > 0) {
456
457 freespace = SHA256_BLOCK_LENGTH - usedspace;
458
459 if (len >= freespace) {
460
461 bcopy(data, &context->buffer[usedspace], freespace);
462 context->bitcount += freespace << 3;
463 len -= freespace;
464 data += freespace;
465 SHA256_Transform(context, context->buffer);
466 } else {
467
468 bcopy(data, &context->buffer[usedspace], len);
469 context->bitcount += len << 3;
470
471 usedspace = freespace = 0;
472 return;
473 }
474 }
475 while (len >= SHA256_BLOCK_LENGTH) {
476
477 SHA256_Transform(context, data);
478 context->bitcount += SHA256_BLOCK_LENGTH << 3;
479 len -= SHA256_BLOCK_LENGTH;
480 data += SHA256_BLOCK_LENGTH;
481 }
482 if (len > 0) {
483
484 bcopy(data, context->buffer, len);
485 context->bitcount += len << 3;
486 }
487
488 usedspace = freespace = 0;
489 }
490
491 void
492 SHA256_Final(u_int8_t digest[], SHA256_CTX *context)
493 {
494 u_int32_t *d = (u_int32_t *)digest;
495 unsigned int usedspace;
496
497
498 if (digest != NULL) {
499 usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
500 #if BYTE_ORDER == LITTLE_ENDIAN
501
502 REVERSE64(context->bitcount,context->bitcount);
503 #endif
504 if (usedspace > 0) {
505
506 context->buffer[usedspace++] = 0x80;
507
508 if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
509
510 bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
511 } else {
512 if (usedspace < SHA256_BLOCK_LENGTH) {
513 bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
514 }
515
516 SHA256_Transform(context, context->buffer);
517
518
519 bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
520 }
521 } else {
522
523 bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
524
525
526 *context->buffer = 0x80;
527 }
528
529 *(u_int64_t *)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
530
531
532 SHA256_Transform(context, context->buffer);
533
534 #if BYTE_ORDER == LITTLE_ENDIAN
535 {
536
537 int j;
538 for (j = 0; j < 8; j++) {
539 REVERSE32(context->state[j],context->state[j]);
540 *d++ = context->state[j];
541 }
542 }
543 #else
544 bcopy(context->state, d, SHA256_DIGEST_LENGTH);
545 #endif
546 }
547
548
549 bzero(context, sizeof(*context));
550 usedspace = 0;
551 }
552
553
554
555 void
556 SHA512_Init(SHA512_CTX *context)
557 {
558 if (context == NULL)
559 return;
560 bcopy(sha512_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
561 bzero(context->buffer, SHA512_BLOCK_LENGTH);
562 context->bitcount[0] = context->bitcount[1] = 0;
563 }
564
565 #ifdef SHA2_UNROLL_TRANSFORM
566
567
568
569 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) do { \
570 W512[j] = (u_int64_t)data[7] | ((u_int64_t)data[6] << 8) | \
571 ((u_int64_t)data[5] << 16) | ((u_int64_t)data[4] << 24) | \
572 ((u_int64_t)data[3] << 32) | ((u_int64_t)data[2] << 40) | \
573 ((u_int64_t)data[1] << 48) | ((u_int64_t)data[0] << 56); \
574 data += 8; \
575 T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + W512[j]; \
576 (d) += T1; \
577 (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
578 j++; \
579 } while(0)
580
581
582 #define ROUND512(a,b,c,d,e,f,g,h) do { \
583 s0 = W512[(j+1)&0x0f]; \
584 s0 = sigma0_512(s0); \
585 s1 = W512[(j+14)&0x0f]; \
586 s1 = sigma1_512(s1); \
587 T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + \
588 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
589 (d) += T1; \
590 (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
591 j++; \
592 } while(0)
593
594 void
595 SHA512_Transform(SHA512_CTX *context, const u_int8_t *data)
596 {
597 u_int64_t a, b, c, d, e, f, g, h, s0, s1;
598 u_int64_t T1, *W512 = (u_int64_t *)context->buffer;
599 int j;
600
601
602 a = context->state[0];
603 b = context->state[1];
604 c = context->state[2];
605 d = context->state[3];
606 e = context->state[4];
607 f = context->state[5];
608 g = context->state[6];
609 h = context->state[7];
610
611 j = 0;
612 do {
613 ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
614 ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
615 ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
616 ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
617 ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
618 ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
619 ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
620 ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
621 } while (j < 16);
622
623
624 do {
625 ROUND512(a,b,c,d,e,f,g,h);
626 ROUND512(h,a,b,c,d,e,f,g);
627 ROUND512(g,h,a,b,c,d,e,f);
628 ROUND512(f,g,h,a,b,c,d,e);
629 ROUND512(e,f,g,h,a,b,c,d);
630 ROUND512(d,e,f,g,h,a,b,c);
631 ROUND512(c,d,e,f,g,h,a,b);
632 ROUND512(b,c,d,e,f,g,h,a);
633 } while (j < 80);
634
635
636 context->state[0] += a;
637 context->state[1] += b;
638 context->state[2] += c;
639 context->state[3] += d;
640 context->state[4] += e;
641 context->state[5] += f;
642 context->state[6] += g;
643 context->state[7] += h;
644
645
646 a = b = c = d = e = f = g = h = T1 = 0;
647 }
648
649 #else
650
651 void
652 SHA512_Transform(SHA512_CTX *context, const u_int8_t *data)
653 {
654 u_int64_t a, b, c, d, e, f, g, h, s0, s1;
655 u_int64_t T1, T2, *W512 = (u_int64_t *)context->buffer;
656 int j;
657
658
659 a = context->state[0];
660 b = context->state[1];
661 c = context->state[2];
662 d = context->state[3];
663 e = context->state[4];
664 f = context->state[5];
665 g = context->state[6];
666 h = context->state[7];
667
668 j = 0;
669 do {
670 W512[j] = (u_int64_t)data[7] | ((u_int64_t)data[6] << 8) |
671 ((u_int64_t)data[5] << 16) | ((u_int64_t)data[4] << 24) |
672 ((u_int64_t)data[3] << 32) | ((u_int64_t)data[2] << 40) |
673 ((u_int64_t)data[1] << 48) | ((u_int64_t)data[0] << 56);
674 data += 8;
675
676 T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
677 T2 = Sigma0_512(a) + Maj(a, b, c);
678 h = g;
679 g = f;
680 f = e;
681 e = d + T1;
682 d = c;
683 c = b;
684 b = a;
685 a = T1 + T2;
686
687 j++;
688 } while (j < 16);
689
690 do {
691
692 s0 = W512[(j+1)&0x0f];
693 s0 = sigma0_512(s0);
694 s1 = W512[(j+14)&0x0f];
695 s1 = sigma1_512(s1);
696
697
698 T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
699 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
700 T2 = Sigma0_512(a) + Maj(a, b, c);
701 h = g;
702 g = f;
703 f = e;
704 e = d + T1;
705 d = c;
706 c = b;
707 b = a;
708 a = T1 + T2;
709
710 j++;
711 } while (j < 80);
712
713
714 context->state[0] += a;
715 context->state[1] += b;
716 context->state[2] += c;
717 context->state[3] += d;
718 context->state[4] += e;
719 context->state[5] += f;
720 context->state[6] += g;
721 context->state[7] += h;
722
723
724 a = b = c = d = e = f = g = h = T1 = T2 = 0;
725 }
726
727 #endif
728
729 void
730 SHA512_Update(SHA512_CTX *context, const u_int8_t *data, size_t len)
731 {
732 size_t freespace, usedspace;
733
734
735 if (len == 0)
736 return;
737
738 usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
739 if (usedspace > 0) {
740
741 freespace = SHA512_BLOCK_LENGTH - usedspace;
742
743 if (len >= freespace) {
744
745 bcopy(data, &context->buffer[usedspace], freespace);
746 ADDINC128(context->bitcount, freespace << 3);
747 len -= freespace;
748 data += freespace;
749 SHA512_Transform(context, context->buffer);
750 } else {
751
752 bcopy(data, &context->buffer[usedspace], len);
753 ADDINC128(context->bitcount, len << 3);
754
755 usedspace = freespace = 0;
756 return;
757 }
758 }
759 while (len >= SHA512_BLOCK_LENGTH) {
760
761 SHA512_Transform(context, data);
762 ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
763 len -= SHA512_BLOCK_LENGTH;
764 data += SHA512_BLOCK_LENGTH;
765 }
766 if (len > 0) {
767
768 bcopy(data, context->buffer, len);
769 ADDINC128(context->bitcount, len << 3);
770 }
771
772 usedspace = freespace = 0;
773 }
774
775 void
776 SHA512_Last(SHA512_CTX *context)
777 {
778 unsigned int usedspace;
779
780 usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
781 #if BYTE_ORDER == LITTLE_ENDIAN
782
783 REVERSE64(context->bitcount[0],context->bitcount[0]);
784 REVERSE64(context->bitcount[1],context->bitcount[1]);
785 #endif
786 if (usedspace > 0) {
787
788 context->buffer[usedspace++] = 0x80;
789
790 if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
791
792 bzero(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
793 } else {
794 if (usedspace < SHA512_BLOCK_LENGTH) {
795 bzero(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
796 }
797
798 SHA512_Transform(context, context->buffer);
799
800
801 bzero(context->buffer, SHA512_BLOCK_LENGTH - 2);
802 }
803 } else {
804
805 bzero(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
806
807
808 *context->buffer = 0x80;
809 }
810
811 *(u_int64_t *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
812 *(u_int64_t *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
813
814
815 SHA512_Transform(context, context->buffer);
816 }
817
818 void
819 SHA512_Final(u_int8_t digest[], SHA512_CTX *context)
820 {
821 u_int64_t *d = (u_int64_t *)digest;
822
823
824 if (digest != NULL) {
825 SHA512_Last(context);
826
827
828 #if BYTE_ORDER == LITTLE_ENDIAN
829 {
830
831 int j;
832 for (j = 0; j < 8; j++) {
833 REVERSE64(context->state[j],context->state[j]);
834 *d++ = context->state[j];
835 }
836 }
837 #else
838 bcopy(context->state, d, SHA512_DIGEST_LENGTH);
839 #endif
840 }
841
842
843 bzero(context, sizeof(*context));
844 }
845
846
847
848 void
849 SHA384_Init(SHA384_CTX *context)
850 {
851 if (context == NULL)
852 return;
853 bcopy(sha384_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
854 bzero(context->buffer, SHA384_BLOCK_LENGTH);
855 context->bitcount[0] = context->bitcount[1] = 0;
856 }
857
858 void
859 SHA384_Update(SHA384_CTX *context, const u_int8_t *data, size_t len)
860 {
861 SHA512_Update((SHA512_CTX *)context, data, len);
862 }
863
864 void
865 SHA384_Final(u_int8_t digest[], SHA384_CTX *context)
866 {
867 u_int64_t *d = (u_int64_t *)digest;
868
869
870 if (digest != NULL) {
871 SHA512_Last((SHA512_CTX *)context);
872
873
874 #if BYTE_ORDER == LITTLE_ENDIAN
875 {
876
877 int j;
878 for (j = 0; j < 6; j++) {
879 REVERSE64(context->state[j],context->state[j]);
880 *d++ = context->state[j];
881 }
882 }
883 #else
884 bcopy(context->state, d, SHA384_DIGEST_LENGTH);
885 #endif
886 }
887
888
889 bzero(context, sizeof(*context));
890 }