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];
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;
503 size_t freespace, usedspace;
518 if (len >= freespace) {
521 context->
bitcount += freespace << 3;
530 usedspace = freespace = 0;
537 ldns_sha256_Transform(context, (
sha2_word32*)data);
548 usedspace = freespace = 0;
568 #if BYTE_ORDER == LITTLE_ENDIAN
574 context->
buffer[usedspace++] = 0x80;
603 #if BYTE_ORDER == LITTLE_ENDIAN
607 for (j = 0; j < 8; j++) {
609 *d++ = context->
state[j];
624 ldns_sha256(
const unsigned char *data,
unsigned int data_len,
unsigned char *digest)
643 #ifdef SHA2_UNROLL_TRANSFORM
646 #if BYTE_ORDER == LITTLE_ENDIAN
648 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
649 REVERSE64(*data++, W512[j]); \
650 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
653 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
659 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
660 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
661 K512[j] + (W512[j] = *data++); \
663 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
668 #define ROUND512(a,b,c,d,e,f,g,h) \
669 s0 = W512[(j+1)&0x0f]; \
670 s0 = sigma0_512(s0); \
671 s1 = W512[(j+14)&0x0f]; \
672 s1 = sigma1_512(s1); \
673 T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
674 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
676 (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
686 a = context->
state[0];
687 b = context->
state[1];
688 c = context->
state[2];
689 d = context->
state[3];
690 e = context->
state[4];
691 f = context->
state[5];
692 g = context->
state[6];
693 h = context->
state[7];
697 ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
698 ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
699 ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
700 ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
701 ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
702 ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
703 ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
704 ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
709 ROUND512(a,b,c,d,e,f,g,h);
710 ROUND512(h,a,b,c,d,e,f,g);
711 ROUND512(g,h,a,b,c,d,e,f);
712 ROUND512(f,g,h,a,b,c,d,e);
713 ROUND512(e,f,g,h,a,b,c,d);
714 ROUND512(d,e,f,g,h,a,b,c);
715 ROUND512(c,d,e,f,g,h,a,b);
716 ROUND512(b,c,d,e,f,g,h,a);
720 context->
state[0] += a;
721 context->
state[1] += b;
722 context->
state[2] += c;
723 context->
state[3] += d;
724 context->
state[4] += e;
725 context->
state[5] += f;
726 context->
state[6] += g;
727 context->
state[7] += h;
730 a = b = c = d = e = f = g = h = T1 = 0;
742 a = context->
state[0];
743 b = context->
state[1];
744 c = context->
state[2];
745 d = context->
state[3];
746 e = context->
state[4];
747 f = context->
state[5];
748 g = context->
state[6];
749 h = context->
state[7];
757 T1 = h +
Sigma1_512(e) +
Ch(e, f, g) + K512[j] + W512[j];
760 T1 = h +
Sigma1_512(e) +
Ch(e, f, g) + K512[j] + (W512[j] = *data++);
777 s0 = W512[(j+1)&0x0f];
779 s1 = W512[(j+14)&0x0f];
784 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
799 context->
state[0] += a;
800 context->
state[1] += b;
801 context->
state[2] += c;
802 context->
state[3] += d;
803 context->
state[4] += e;
804 context->
state[5] += f;
805 context->
state[6] += g;
806 context->
state[7] += h;
809 a = b = c = d = e = f = g = h = T1 = T2 = 0;
816 size_t freespace, usedspace;
831 if (len >= freespace) {
843 usedspace = freespace = 0;
850 ldns_sha512_Transform(context, (
sha2_word64*)data);
861 usedspace = freespace = 0;
870 #if BYTE_ORDER == LITTLE_ENDIAN
877 context->
buffer[usedspace++] = 0x80;
916 ldns_sha512_Last(context);
919 #if BYTE_ORDER == LITTLE_ENDIAN
923 for (j = 0; j < 8; j++) {
925 *d++ = context->
state[j];
938 ldns_sha512(
const unsigned char *data,
unsigned int data_len,
unsigned char *digest)
972 #if BYTE_ORDER == LITTLE_ENDIAN
976 for (j = 0; j < 6; j++) {
978 *d++ = context->
state[j];
991 ldns_sha384(
const unsigned char *data,
unsigned int data_len,
unsigned char *digest)
unsigned char * ldns_sha384(const unsigned char *data, unsigned int data_len, unsigned char *digest)
Convenience function to digest a fixed block of data at once.
void ldns_sha256_update(ldns_sha256_CTX *context, const sha2_byte *data, size_t len)
void ldns_sha256_final(sha2_byte digest[32], ldns_sha256_CTX *context)
#define ldns_sha256_SHORT_BLOCK_LENGTH
void ldns_sha512_init(ldns_sha512_CTX *context)
union _ldns_sha2_buffer_union ldns_sha2_buffer_union
void ldns_sha512_final(sha2_byte digest[64], ldns_sha512_CTX *context)
#define ldns_sha512_SHORT_BLOCK_LENGTH
unsigned char * ldns_sha256(const unsigned char *data, unsigned int data_len, unsigned char *digest)
Convenience function to digest a fixed block of data at once.
void ldns_sha384_update(ldns_sha384_CTX *context, const sha2_byte *data, size_t len)
void ldns_sha256_init(ldns_sha256_CTX *context)
unsigned char * ldns_sha512(const unsigned char *data, unsigned int data_len, unsigned char *digest)
Convenience function to digest a fixed block of data at once.
void ldns_sha512_update(ldns_sha512_CTX *context, const sha2_byte *data, size_t len)
#define MEMSET_BZERO(p, l)
#define MEMCPY_BCOPY(d, s, l)
void ldns_sha384_final(sha2_byte digest[48], ldns_sha384_CTX *context)
void ldns_sha384_init(ldns_sha384_CTX *context)
#define LDNS_SHA512_BLOCK_LENGTH
#define LDNS_SHA512_DIGEST_LENGTH
#define LDNS_SHA256_BLOCK_LENGTH
#define LDNS_SHA384_DIGEST_LENGTH
#define LDNS_SHA384_BLOCK_LENGTH
#define LDNS_SHA256_DIGEST_LENGTH