97 #if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
98 #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
111 #define ldns_sha256_SHORT_BLOCK_LENGTH (LDNS_SHA256_BLOCK_LENGTH - 8)
112 #define ldns_sha384_SHORT_BLOCK_LENGTH (LDNS_SHA384_BLOCK_LENGTH - 16)
113 #define ldns_sha512_SHORT_BLOCK_LENGTH (LDNS_SHA512_BLOCK_LENGTH - 16)
117 #if BYTE_ORDER == LITTLE_ENDIAN
118 #define REVERSE32(w,x) { \
119 sha2_word32 tmp = (w); \
120 tmp = (tmp >> 16) | (tmp << 16); \
121 (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
124 #define REVERSE64(w,x) { \
125 sha2_word64 tmp = (w); \
126 tmp = (tmp >> 32) | (tmp << 32); \
127 tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
128 ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
129 (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
130 ((tmp & 0x0000ffff0000ffffULL) << 16); \
133 #define REVERSE64(w,x)
142 #define ADDINC128(w,n) { \
143 (w)[0] += (sha2_word64)(n); \
144 if ((w)[0] < (n)) { \
150 #define ADDINC128(w,n)
162 #if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY)
164 #define SHA2_USE_MEMSET_MEMCPY 1
166 #if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY)
168 #error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both!
171 #ifdef SHA2_USE_MEMSET_MEMCPY
172 #define MEMSET_BZERO(p,l) memset((p), 0, (l))
173 #define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l))
175 #ifdef SHA2_USE_BZERO_BCOPY
176 #define MEMSET_BZERO(p,l) bzero((p), (l))
177 #define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l))
191 #define R(b,x) ((x) >> (b))
193 #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
195 #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
198 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
199 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
202 #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
203 #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
204 #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
205 #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
208 #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
209 #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
210 #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
211 #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
216 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
217 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
218 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
219 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
220 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
221 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
222 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
223 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
224 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
225 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
226 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
227 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
228 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
229 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
230 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
231 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
235 static const sha2_word32 ldns_sha256_initial_hash_value[8] = {
248 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
249 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
250 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
251 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
252 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
253 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
254 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
255 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
256 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
257 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
258 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
259 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
260 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
261 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
262 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
263 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
264 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
265 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
266 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
267 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
268 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
269 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
270 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
271 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
272 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
273 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
274 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
275 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
276 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
277 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
278 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
279 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
280 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
281 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
282 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
283 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
284 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
285 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
286 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
287 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
291 static const sha2_word64 sha384_initial_hash_value[8] = {
292 0xcbbb9d5dc1059ed8ULL,
293 0x629a292a367cd507ULL,
294 0x9159015a3070dd17ULL,
295 0x152fecd8f70e5939ULL,
296 0x67332667ffc00b31ULL,
297 0x8eb44a8768581511ULL,
298 0xdb0c2e0d64f98fa7ULL,
299 0x47b5481dbefa4fa4ULL
303 static const sha2_word64 sha512_initial_hash_value[8] = {
304 0x6a09e667f3bcc908ULL,
305 0xbb67ae8584caa73bULL,
306 0x3c6ef372fe94f82bULL,
307 0xa54ff53a5f1d36f1ULL,
308 0x510e527fade682d1ULL,
309 0x9b05688c2b3e6c1fULL,
310 0x1f83d9abfb41bd6bULL,
311 0x5be0cd19137e2179ULL
324 #ifdef SHA2_UNROLL_TRANSFORM
328 #if BYTE_ORDER == LITTLE_ENDIAN
330 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
331 REVERSE32(*data++, W256[j]); \
332 T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
335 (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
341 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
342 T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
343 K256[j] + (W256[j] = *data++); \
345 (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
350 #define ROUND256(a,b,c,d,e,f,g,h) \
351 s0 = W256[(j+1)&0x0f]; \
352 s0 = sigma0_256(s0); \
353 s1 = W256[(j+14)&0x0f]; \
354 s1 = sigma1_256(s1); \
355 T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
356 (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
358 (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
370 a = context->
state[0];
371 b = context->
state[1];
372 c = context->
state[2];
373 d = context->
state[3];
374 e = context->
state[4];
375 f = context->
state[5];
376 g = context->
state[6];
377 h = context->
state[7];
382 ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
383 ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
384 ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
385 ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
386 ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
387 ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
388 ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
389 ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
394 ROUND256(a,b,c,d,e,f,g,h);
395 ROUND256(h,a,b,c,d,e,f,g);
396 ROUND256(g,h,a,b,c,d,e,f);
397 ROUND256(f,g,h,a,b,c,d,e);
398 ROUND256(e,f,g,h,a,b,c,d);
399 ROUND256(d,e,f,g,h,a,b,c);
400 ROUND256(c,d,e,f,g,h,a,b);
401 ROUND256(b,c,d,e,f,g,h,a);
405 context->
state[0] += a;
406 context->
state[1] += b;
407 context->
state[2] += c;
408 context->
state[3] += d;
409 context->
state[4] += e;
410 context->
state[5] += f;
411 context->
state[6] += g;
412 context->
state[7] += h;
415 a = b = c = d = e = f = g = h = T1 = 0;
429 a = context->
state[0];
430 b = context->
state[1];
431 c = context->
state[2];
432 d = context->
state[3];
433 e = context->
state[4];
434 f = context->
state[5];
435 g = context->
state[6];
436 h = context->
state[7];
442 REVERSE32(*data++,W256[j]);
444 T1 = h +
Sigma1_256(e) +
Ch(e, f, g) + K256[j] + W256[j];
447 T1 = h +
Sigma1_256(e) +
Ch(e, f, g) + K256[j] + (W256[j] = *data++);
464 s0 = W256[(j+1)&0x0f];
466 s1 = W256[(j+14)&0x0f];
471 (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
486 context->
state[0] += a;
487 context->
state[1] += b;
488 context->
state[2] += c;
489 context->
state[3] += d;
490 context->
state[4] += e;
491 context->
state[5] += f;
492 context->
state[6] += g;
493 context->
state[7] += h;
496 a = b = c = d = e = f = g = h = T1 = T2 = 0;
502 size_t freespace, usedspace;
517 if (len >= freespace) {
520 context->
bitcount += freespace << 3;
529 usedspace = freespace = 0;
535 ldns_sha256_Transform(context, (
sha2_word32*)data);
546 usedspace = freespace = 0;
559 #if BYTE_ORDER == LITTLE_ENDIAN
565 context->
buffer[usedspace++] = 0x80;
593 #if BYTE_ORDER == LITTLE_ENDIAN
597 for (j = 0; j < 8; j++) {
598 REVERSE32(context->
state[j],context->
state[j]);
599 *d++ = context->
state[j];
613 ldns_sha256(
unsigned char *data,
unsigned int data_len,
unsigned char *digest)
632 #ifdef SHA2_UNROLL_TRANSFORM
635 #if BYTE_ORDER == LITTLE_ENDIAN
637 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
638 REVERSE64(*data++, W512[j]); \
639 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
642 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
648 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
649 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
650 K512[j] + (W512[j] = *data++); \
652 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
657 #define ROUND512(a,b,c,d,e,f,g,h) \
658 s0 = W512[(j+1)&0x0f]; \
659 s0 = sigma0_512(s0); \
660 s1 = W512[(j+14)&0x0f]; \
661 s1 = sigma1_512(s1); \
662 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
663 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
665 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
675 a = context->
state[0];
676 b = context->
state[1];
677 c = context->
state[2];
678 d = context->
state[3];
679 e = context->
state[4];
680 f = context->
state[5];
681 g = context->
state[6];
682 h = context->
state[7];
686 ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
687 ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
688 ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
689 ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
690 ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
691 ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
692 ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
693 ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
698 ROUND512(a,b,c,d,e,f,g,h);
699 ROUND512(h,a,b,c,d,e,f,g);
700 ROUND512(g,h,a,b,c,d,e,f);
701 ROUND512(f,g,h,a,b,c,d,e);
702 ROUND512(e,f,g,h,a,b,c,d);
703 ROUND512(d,e,f,g,h,a,b,c);
704 ROUND512(c,d,e,f,g,h,a,b);
705 ROUND512(b,c,d,e,f,g,h,a);
709 context->
state[0] += a;
710 context->
state[1] += b;
711 context->
state[2] += c;
712 context->
state[3] += d;
713 context->
state[4] += e;
714 context->
state[5] += f;
715 context->
state[6] += g;
716 context->
state[7] += h;
719 a = b = c = d = e = f = g = h = T1 = 0;
731 a = context->
state[0];
732 b = context->
state[1];
733 c = context->
state[2];
734 d = context->
state[3];
735 e = context->
state[4];
736 f = context->
state[5];
737 g = context->
state[6];
738 h = context->
state[7];
744 REVERSE64(*data++, W512[j]);
746 T1 = h +
Sigma1_512(e) +
Ch(e, f, g) + K512[j] + W512[j];
749 T1 = h +
Sigma1_512(e) +
Ch(e, f, g) + K512[j] + (W512[j] = *data++);
766 s0 = W512[(j+1)&0x0f];
768 s1 = W512[(j+14)&0x0f];
773 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
788 context->
state[0] += a;
789 context->
state[1] += b;
790 context->
state[2] += c;
791 context->
state[3] += d;
792 context->
state[4] += e;
793 context->
state[5] += f;
794 context->
state[6] += g;
795 context->
state[7] += h;
798 a = b = c = d = e = f = g = h = T1 = T2 = 0;
804 size_t freespace, usedspace;
819 if (len >= freespace) {
831 usedspace = freespace = 0;
837 ldns_sha512_Transform(context, (
sha2_word64*)data);
848 usedspace = freespace = 0;
855 #if BYTE_ORDER == LITTLE_ENDIAN
862 context->
buffer[usedspace++] = 0x80;
900 ldns_sha512_Last(context);
903 #if BYTE_ORDER == LITTLE_ENDIAN
907 for (j = 0; j < 8; j++) {
908 REVERSE64(context->
state[j],context->
state[j]);
909 *d++ = context->
state[j];
922 ldns_sha512(
unsigned char *data,
unsigned int data_len,
unsigned char *digest)
956 #if BYTE_ORDER == LITTLE_ENDIAN
960 for (j = 0; j < 6; j++) {
961 REVERSE64(context->
state[j],context->
state[j]);
962 *d++ = context->
state[j];
975 ldns_sha384(
unsigned char *data,
unsigned int data_len,
unsigned char *digest)