67 #define ALLOC(size) palloc(size)
68 #define FREE(ptr) pfree(ptr)
70 #define ALLOC(size) malloc(size)
71 #define FREE(ptr) free(ptr)
89 #define PG_SHA256_SHORT_BLOCK_LENGTH (PG_SHA256_BLOCK_LENGTH - 8)
90 #define PG_SHA384_SHORT_BLOCK_LENGTH (PG_SHA384_BLOCK_LENGTH - 16)
91 #define PG_SHA512_SHORT_BLOCK_LENGTH (PG_SHA512_BLOCK_LENGTH - 16)
94 #ifndef WORDS_BIGENDIAN
95 #define REVERSE32(w,x) { \
97 tmp = (tmp >> 16) | (tmp << 16); \
98 (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
100 #define REVERSE64(w,x) { \
102 tmp = (tmp >> 32) | (tmp << 32); \
103 tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
104 ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
105 (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
106 ((tmp & 0x0000ffff0000ffffULL) << 16); \
115 #define ADDINC128(w,n) { \
116 (w)[0] += (uint64)(n); \
117 if ((w)[0] < (n)) { \
132 #define R(b,x) ((x) >> (b))
134 #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
136 #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
139 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
140 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
143 #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
144 #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
145 #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
146 #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
149 #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
150 #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
151 #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
152 #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
166 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
167 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
168 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
169 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
170 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
171 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
172 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
173 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
174 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
175 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
176 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
177 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
178 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
179 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
180 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
181 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
209 static const uint64
K512[80] = {
210 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
211 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
212 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
213 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
214 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
215 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
216 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
217 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
218 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
219 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
220 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
221 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
222 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
223 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
224 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
225 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
226 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
227 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
228 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
229 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
230 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
231 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
232 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
233 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
234 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
235 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
236 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
237 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
238 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
239 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
240 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
241 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
242 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
243 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
244 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
245 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
246 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
247 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
248 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
249 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
254 0xcbbb9d5dc1059ed8ULL,
255 0x629a292a367cd507ULL,
256 0x9159015a3070dd17ULL,
257 0x152fecd8f70e5939ULL,
258 0x67332667ffc00b31ULL,
259 0x8eb44a8768581511ULL,
260 0xdb0c2e0d64f98fa7ULL,
261 0x47b5481dbefa4fa4ULL
266 0x6a09e667f3bcc908ULL,
267 0xbb67ae8584caa73bULL,
268 0x3c6ef372fe94f82bULL,
269 0xa54ff53a5f1d36f1ULL,
270 0x510e527fade682d1ULL,
271 0x9b05688c2b3e6c1fULL,
272 0x1f83d9abfb41bd6bULL,
273 0x5be0cd19137e2179ULL
288 #ifdef SHA2_UNROLL_TRANSFORM
292 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do { \
293 W256[j] = (uint32)data[3] | ((uint32)data[2] << 8) | \
294 ((uint32)data[1] << 16) | ((uint32)data[0] << 24); \
296 T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
298 (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
302 #define ROUND256(a,b,c,d,e,f,g,h) do { \
303 s0 = W256[(j+1)&0x0f]; \
304 s0 = sigma0_256(s0); \
305 s1 = W256[(j+14)&0x0f]; \
306 s1 = sigma1_256(s1); \
307 T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + \
308 (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
310 (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
347 ROUND256_0_TO_15(
a,
b,
c, d,
e, f, g, h);
348 ROUND256_0_TO_15(h,
a,
b,
c, d,
e, f, g);
349 ROUND256_0_TO_15(g, h,
a,
b,
c, d,
e, f);
350 ROUND256_0_TO_15(f, g, h,
a,
b,
c, d,
e);
351 ROUND256_0_TO_15(
e, f, g, h,
a,
b,
c, d);
352 ROUND256_0_TO_15(d,
e, f, g, h,
a,
b,
c);
353 ROUND256_0_TO_15(
c, d,
e, f, g, h,
a,
b);
354 ROUND256_0_TO_15(
b,
c, d,
e, f, g, h,
a);
360 ROUND256(
a,
b,
c, d,
e, f, g, h);
361 ROUND256(h,
a,
b,
c, d,
e, f, g);
362 ROUND256(g, h,
a,
b,
c, d,
e, f);
363 ROUND256(f, g, h,
a,
b,
c, d,
e);
364 ROUND256(
e, f, g, h,
a,
b,
c, d);
365 ROUND256(d,
e, f, g, h,
a,
b,
c);
366 ROUND256(
c, d,
e, f, g, h,
a,
b);
367 ROUND256(
b,
c, d,
e, f, g, h,
a);
381 a =
b =
c = d =
e = f = g = h = T1 = 0;
439 s0 = W256[(
j + 1) & 0x0f];
441 s1 = W256[(
j + 14) & 0x0f];
446 (W256[
j & 0x0f] +=
s1 + W256[(
j + 9) & 0x0f] + s0);
471 a =
b =
c = d =
e = f = g = h = T1 = T2 = 0;
491 if (
len >= freespace)
494 memcpy(&
context->buffer[usedspace],
data, freespace);
495 context->bitcount += freespace << 3;
506 usedspace = freespace = 0;
525 usedspace = freespace = 0;
531 unsigned int usedspace;
534 #ifndef WORDS_BIGENDIAN
541 context->buffer[usedspace++] = 0x80;
584 #ifndef WORDS_BIGENDIAN
589 for (
j = 0;
j < 8;
j++)
614 #ifdef SHA2_UNROLL_TRANSFORM
618 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) do { \
619 W512[j] = (uint64)data[7] | ((uint64)data[6] << 8) | \
620 ((uint64)data[5] << 16) | ((uint64)data[4] << 24) | \
621 ((uint64)data[3] << 32) | ((uint64)data[2] << 40) | \
622 ((uint64)data[1] << 48) | ((uint64)data[0] << 56); \
624 T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + W512[j]; \
626 (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
631 #define ROUND512(a,b,c,d,e,f,g,h) do { \
632 s0 = W512[(j+1)&0x0f]; \
633 s0 = sigma0_512(s0); \
634 s1 = W512[(j+14)&0x0f]; \
635 s1 = sigma1_512(s1); \
636 T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + \
637 (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
639 (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
657 *W512 = (uint64 *)
context->buffer;
673 ROUND512_0_TO_15(
a,
b,
c, d,
e, f, g, h);
674 ROUND512_0_TO_15(h,
a,
b,
c, d,
e, f, g);
675 ROUND512_0_TO_15(g, h,
a,
b,
c, d,
e, f);
676 ROUND512_0_TO_15(f, g, h,
a,
b,
c, d,
e);
677 ROUND512_0_TO_15(
e, f, g, h,
a,
b,
c, d);
678 ROUND512_0_TO_15(d,
e, f, g, h,
a,
b,
c);
679 ROUND512_0_TO_15(
c, d,
e, f, g, h,
a,
b);
680 ROUND512_0_TO_15(
b,
c, d,
e, f, g, h,
a);
686 ROUND512(
a,
b,
c, d,
e, f, g, h);
687 ROUND512(h,
a,
b,
c, d,
e, f, g);
688 ROUND512(g, h,
a,
b,
c, d,
e, f);
689 ROUND512(f, g, h,
a,
b,
c, d,
e);
690 ROUND512(
e, f, g, h,
a,
b,
c, d);
691 ROUND512(d,
e, f, g, h,
a,
b,
c);
692 ROUND512(
c, d,
e, f, g, h,
a,
b);
693 ROUND512(
b,
c, d,
e, f, g, h,
a);
707 a =
b =
c = d =
e = f = g = h = T1 = 0;
726 *W512 = (uint64 *)
context->buffer;
742 W512[
j] = (uint64)
data[7] | ((uint64)
data[6] << 8) |
743 ((uint64)
data[5] << 16) | ((uint64)
data[4] << 24) |
744 ((uint64)
data[3] << 32) | ((uint64)
data[2] << 40) |
745 ((uint64)
data[1] << 48) | ((uint64)
data[0] << 56);
765 s0 = W512[(
j + 1) & 0x0f];
767 s1 = W512[(
j + 14) & 0x0f];
772 (W512[
j & 0x0f] +=
s1 + W512[(
j + 9) & 0x0f] + s0);
797 a =
b =
c = d =
e = f = g = h = T1 = T2 = 0;
817 if (
len >= freespace)
820 memcpy(&
context->buffer[usedspace],
data, freespace);
832 usedspace = freespace = 0;
851 usedspace = freespace = 0;
857 unsigned int usedspace;
860 #ifndef WORDS_BIGENDIAN
868 context->buffer[usedspace++] = 0x80;
913 #ifndef WORDS_BIGENDIAN
918 for (
j = 0;
j < 8;
j++)
958 #ifndef WORDS_BIGENDIAN
963 for (
j = 0;
j < 6;
j++)
1001 #ifndef WORDS_BIGENDIAN
1006 for (
j = 0;
j < 8;
j++)
void pg_sha512_final(pg_sha512_ctx *context, uint8 *digest)
static const uint32 sha224_initial_hash_value[8]
static const uint32 sha256_initial_hash_value[8]
static const uint64 sha384_initial_hash_value[8]
void pg_sha384_init(pg_sha384_ctx *context)
#define PG_SHA512_SHORT_BLOCK_LENGTH
void pg_sha256_init(pg_sha256_ctx *context)
static const uint64 K512[80]
static const uint32 K256[64]
void pg_sha512_update(pg_sha512_ctx *context, const uint8 *data, size_t len)
void pg_sha224_update(pg_sha224_ctx *context, const uint8 *data, size_t len)
void pg_sha512_init(pg_sha512_ctx *context)
static void SHA512_Last(pg_sha512_ctx *context)
void pg_sha224_init(pg_sha224_ctx *context)
void pg_sha256_final(pg_sha256_ctx *context, uint8 *digest)
static void SHA256_Last(pg_sha256_ctx *context)
void pg_sha224_final(pg_sha224_ctx *context, uint8 *digest)
void pg_sha384_final(pg_sha384_ctx *context, uint8 *digest)
void pg_sha384_update(pg_sha384_ctx *context, const uint8 *data, size_t len)
static const uint64 sha512_initial_hash_value[8]
void pg_sha256_update(pg_sha256_ctx *context, const uint8 *data, size_t len)
static void SHA512_Transform(pg_sha512_ctx *context, const uint8 *data)
static void SHA256_Transform(pg_sha256_ctx *context, const uint8 *data)
#define PG_SHA256_SHORT_BLOCK_LENGTH
#define PG_SHA256_DIGEST_LENGTH
#define PG_SHA384_BLOCK_LENGTH
#define PG_SHA384_DIGEST_LENGTH
#define PG_SHA512_DIGEST_LENGTH
#define PG_SHA256_BLOCK_LENGTH
#define PG_SHA512_BLOCK_LENGTH
#define PG_SHA224_DIGEST_LENGTH