22static const unsigned char PADDING[128] =
24 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
38static void SHAEncode32(
unsigned char *output, uint32_t *input,
unsigned int len)
42 for (i = 0,
j = 0;
j <
len; i++,
j += 4) {
43 output[
j] = (
unsigned char) ((input[i] >> 24) & 0xff);
44 output[
j + 1] = (
unsigned char) ((input[i] >> 16) & 0xff);
45 output[
j + 2] = (
unsigned char) ((input[i] >> 8) & 0xff);
46 output[
j + 3] = (
unsigned char) (input[i] & 0xff);
56static void SHADecode32(uint32_t *output,
const unsigned char *input,
unsigned int len)
60 for (i = 0,
j = 0;
j <
len; i++,
j += 4)
61 output[i] = ((uint32_t) input[
j + 3]) | (((uint32_t) input[
j + 2]) << 8) |
62 (((uint32_t) input[
j + 1]) << 16) | (((uint32_t) input[
j]) << 24);
113#define ROTR32(b,x) ((x >> b) | (x << (32 - b)))
114#define ROTR64(b,x) ((x >> b) | (x << (64 - b)))
115#define SHR(b, x) (x >> b)
118#define SHA256_F0(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
120#define SHA256_F1(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
122#define SHA256_F2(x) (ROTR32( 2,(x)) ^ ROTR32(13,(x)) ^ ROTR32(22,(x)))
124#define SHA256_F3(x) (ROTR32( 6,(x)) ^ ROTR32(11,(x)) ^ ROTR32(25,(x)))
126#define SHA256_F4(x) (ROTR32( 7,(x)) ^ ROTR32(18,(x)) ^ SHR( 3,(x)))
128#define SHA256_F5(x) (ROTR32(17,(x)) ^ ROTR32(19,(x)) ^ SHR(10,(x)))
130static const uint32_t SHA256_K[64] = {
131 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
132 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
133 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
134 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
135 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
136 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
137 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
138 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
148 context->state[0] = 0x6a09e667;
149 context->state[1] = 0xbb67ae85;
150 context->state[2] = 0x3c6ef372;
151 context->state[3] = 0xa54ff53a;
152 context->state[4] = 0x510e527f;
153 context->state[5] = 0x9b05688c;
154 context->state[6] = 0x1f83d9ab;
155 context->state[7] = 0x5be0cd19;
162static void SHA256Transform(uint32_t
state[8],
const unsigned char block[64])
164#if defined(PHP_HASH_INTRIN_SHA_NATIVE)
165 SHA256_Transform_shani(
state, block);
167#elif defined(PHP_HASH_INTRIN_SHA_RESOLVER)
169 SHA256_Transform_shani(
state, block);
177 SHA256_Transform_sse2(
state, block, &tmp32[0], &tmp32[64]);
184 uint32_t x[16],
T1, T2,
W[64];
187 SHADecode32(x, block, 64);
190 for(i = 0; i < 16; i++) {
193 for(i = 16; i < 64; i++) {
197 for (i = 0; i < 64; i++) {
200 h = g; g = f; f = e; e = d +
T1;
201 d = c; c = b; b =
a;
a =
T1 + T2;
226 context->state[0] = 0xc1059ed8;
227 context->state[1] = 0x367cd507;
228 context->state[2] = 0x3070dd17;
229 context->state[3] = 0xf70e5939;
230 context->state[4] = 0xffc00b31;
231 context->state[5] = 0x68581511;
232 context->state[6] = 0x64f98fa7;
233 context->state[7] = 0xbefa4fa4;
244 unsigned int index, partLen;
248 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
251 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
254 context->count[1] += (uint32_t) (inputLen >> 29);
256 partLen = 64 - index;
260 if (inputLen >= partLen) {
261 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
264 for (i = partLen; i + 63 < inputLen; i += 64) {
265 SHA256Transform(
context->state, &input[i]);
274 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
284 unsigned char bits[8];
285 unsigned int index, padLen;
288 bits[7] = (
unsigned char) (
context->count[0] & 0xFF);
289 bits[6] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
290 bits[5] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
291 bits[4] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
292 bits[3] = (
unsigned char) (
context->count[1] & 0xFF);
293 bits[2] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
294 bits[1] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
295 bits[0] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
299 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
300 padLen = (index < 56) ? (56 - index) : (120 - index);
307 SHAEncode32(digest,
context->state, 28);
322 unsigned int index, partLen;
326 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3F);
329 if ((
context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) {
332 context->count[1] += (uint32_t) (inputLen >> 29);
334 partLen = 64 - index;
338 if (inputLen >= partLen) {
339 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
342 for (i = partLen; i + 63 < inputLen; i += 64) {
343 SHA256Transform(
context->state, &input[i]);
352 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
362 unsigned char bits[8];
363 unsigned int index, padLen;
366 bits[7] = (
unsigned char) (
context->count[0] & 0xFF);
367 bits[6] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
368 bits[5] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
369 bits[4] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
370 bits[3] = (
unsigned char) (
context->count[1] & 0xFF);
371 bits[2] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
372 bits[1] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
373 bits[0] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
377 index = (
unsigned int) ((
context->count[0] >> 3) & 0x3f);
378 padLen = (index < 56) ? (56 - index) : (120 - index);
385 SHAEncode32(digest,
context->state, 32);
396#define SHA512_F0(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
398#define SHA512_F1(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
400#define SHA512_F2(x) (ROTR64(28, x) ^ ROTR64(34, x) ^ ROTR64(39, x))
402#define SHA512_F3(x) (ROTR64(14, x) ^ ROTR64(18, x) ^ ROTR64(41, x))
404#define SHA512_F4(x) (ROTR64( 1, x) ^ ROTR64( 8, x) ^ SHR(7, x))
406#define SHA512_F5(x) (ROTR64(19, x) ^ ROTR64(61, x) ^ SHR(6, x))
408static const uint64_t SHA512_K[128] = {
409 L64(0x428a2f98d728ae22),
L64(0x7137449123ef65cd),
L64(0xb5c0fbcfec4d3b2f),
L64(0xe9b5dba58189dbbc),
410 L64(0x3956c25bf348b538),
L64(0x59f111f1b605d019),
L64(0x923f82a4af194f9b),
L64(0xab1c5ed5da6d8118),
411 L64(0xd807aa98a3030242),
L64(0x12835b0145706fbe),
L64(0x243185be4ee4b28c),
L64(0x550c7dc3d5ffb4e2),
412 L64(0x72be5d74f27b896f),
L64(0x80deb1fe3b1696b1),
L64(0x9bdc06a725c71235),
L64(0xc19bf174cf692694),
413 L64(0xe49b69c19ef14ad2),
L64(0xefbe4786384f25e3),
L64(0x0fc19dc68b8cd5b5),
L64(0x240ca1cc77ac9c65),
414 L64(0x2de92c6f592b0275),
L64(0x4a7484aa6ea6e483),
L64(0x5cb0a9dcbd41fbd4),
L64(0x76f988da831153b5),
415 L64(0x983e5152ee66dfab),
L64(0xa831c66d2db43210),
L64(0xb00327c898fb213f),
L64(0xbf597fc7beef0ee4),
416 L64(0xc6e00bf33da88fc2),
L64(0xd5a79147930aa725),
L64(0x06ca6351e003826f),
L64(0x142929670a0e6e70),
417 L64(0x27b70a8546d22ffc),
L64(0x2e1b21385c26c926),
L64(0x4d2c6dfc5ac42aed),
L64(0x53380d139d95b3df),
418 L64(0x650a73548baf63de),
L64(0x766a0abb3c77b2a8),
L64(0x81c2c92e47edaee6),
L64(0x92722c851482353b),
419 L64(0xa2bfe8a14cf10364),
L64(0xa81a664bbc423001),
L64(0xc24b8b70d0f89791),
L64(0xc76c51a30654be30),
420 L64(0xd192e819d6ef5218),
L64(0xd69906245565a910),
L64(0xf40e35855771202a),
L64(0x106aa07032bbd1b8),
421 L64(0x19a4c116b8d2d0c8),
L64(0x1e376c085141ab53),
L64(0x2748774cdf8eeb99),
L64(0x34b0bcb5e19b48a8),
422 L64(0x391c0cb3c5c95a63),
L64(0x4ed8aa4ae3418acb),
L64(0x5b9cca4f7763e373),
L64(0x682e6ff3d6b2b8a3),
423 L64(0x748f82ee5defb2fc),
L64(0x78a5636f43172f60),
L64(0x84c87814a1f0ab72),
L64(0x8cc702081a6439ec),
424 L64(0x90befffa23631e28),
L64(0xa4506cebde82bde9),
L64(0xbef9a3f7b2c67915),
L64(0xc67178f2e372532b),
425 L64(0xca273eceea26619c),
L64(0xd186b8c721c0c207),
L64(0xeada7dd6cde0eb1e),
L64(0xf57d4f7fee6ed178),
426 L64(0x06f067aa72176fba),
L64(0x0a637dc5a2c898a6),
L64(0x113f9804bef90dae),
L64(0x1b710b35131c471b),
427 L64(0x28db77f523047d84),
L64(0x32caab7b40c72493),
L64(0x3c9ebe0a15c9bebc),
L64(0x431d67c49c100d4c),
428 L64(0x4cc5d4becb3e42b6),
L64(0x597f299cfc657e2a),
L64(0x5fcb6fab3ad6faec),
L64(0x6c44198c4a475817) };
434static void SHAEncode64(
unsigned char *output, uint64_t *input,
unsigned int len)
438 for (i = 0,
j = 0;
j <
len; i++,
j += 8) {
439 output[
j] = (
unsigned char) ((input[i] >> 56) & 0xff);
440 output[
j + 1] = (
unsigned char) ((input[i] >> 48) & 0xff);
441 output[
j + 2] = (
unsigned char) ((input[i] >> 40) & 0xff);
442 output[
j + 3] = (
unsigned char) ((input[i] >> 32) & 0xff);
443 output[
j + 4] = (
unsigned char) ((input[i] >> 24) & 0xff);
444 output[
j + 5] = (
unsigned char) ((input[i] >> 16) & 0xff);
445 output[
j + 6] = (
unsigned char) ((input[i] >> 8) & 0xff);
446 output[
j + 7] = (
unsigned char) (input[i] & 0xff);
456static void SHADecode64(uint64_t *output,
const unsigned char *input,
unsigned int len)
460 for (i = 0,
j = 0;
j <
len; i++,
j += 8)
462 ((uint64_t) input[
j + 7]) | (((uint64_t) input[
j + 6]) << 8) |
463 (((uint64_t) input[
j + 5]) << 16) | (((uint64_t) input[
j + 4]) << 24) |
464 (((uint64_t) input[
j + 3]) << 32) | (((uint64_t) input[
j + 2]) << 40) |
465 (((uint64_t) input[
j + 1]) << 48) | (((uint64_t) input[
j]) << 56);
492static void SHA512Transform(uint64_t
state[8],
const unsigned char block[128])
496 uint64_t x[16],
T1, T2,
W[80];
499 SHADecode64(x, block, 128);
502 for(i = 0; i < 16; i++) {
505 for(i = 16; i < 80; i++) {
509 for (i = 0; i < 80; i++) {
512 h = g; g = f; f = e; e = d +
T1;
513 d = c; c = b; b =
a;
a =
T1 + T2;
537 unsigned int index, partLen;
541 index = (
unsigned int) ((
context->count[0] >> 3) & 0x7F);
544 if ((
context->count[0] += ((uint64_t) inputLen << 3)) < ((uint64_t) inputLen << 3)) {
548 context->count[1] += (uint64_t) inputLen >> 61;
550 partLen = 128 - index;
554 if (inputLen >= partLen) {
555 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
558 for (i = partLen; i + 127 < inputLen; i += 128) {
559 SHA512Transform(
context->state, &input[i]);
566 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
576 unsigned char bits[16];
577 unsigned int index, padLen;
580 bits[15] = (
unsigned char) (
context->count[0] & 0xFF);
581 bits[14] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
582 bits[13] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
583 bits[12] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
584 bits[11] = (
unsigned char) ((
context->count[0] >> 32) & 0xFF);
585 bits[10] = (
unsigned char) ((
context->count[0] >> 40) & 0xFF);
586 bits[9] = (
unsigned char) ((
context->count[0] >> 48) & 0xFF);
587 bits[8] = (
unsigned char) ((
context->count[0] >> 56) & 0xFF);
588 bits[7] = (
unsigned char) (
context->count[1] & 0xFF);
589 bits[6] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
590 bits[5] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
591 bits[4] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
592 bits[3] = (
unsigned char) ((
context->count[1] >> 32) & 0xFF);
593 bits[2] = (
unsigned char) ((
context->count[1] >> 40) & 0xFF);
594 bits[1] = (
unsigned char) ((
context->count[1] >> 48) & 0xFF);
595 bits[0] = (
unsigned char) ((
context->count[1] >> 56) & 0xFF);
599 index = (
unsigned int) ((
context->count[0] >> 3) & 0x7f);
600 padLen = (index < 112) ? (112 - index) : (240 - index);
607 SHAEncode64(digest,
context->state, 48);
692 unsigned int index, partLen;
696 index = (
unsigned int) ((
context->count[0] >> 3) & 0x7F);
699 if ((
context->count[0] += ((uint64_t) inputLen << 3)) < ((uint64_t) inputLen << 3)) {
703 context->count[1] += (uint64_t) inputLen >> 61;
705 partLen = 128 - index;
709 if (inputLen >= partLen) {
710 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) input, partLen);
713 for (i = partLen; i + 127 < inputLen; i += 128) {
714 SHA512Transform(
context->state, &input[i]);
723 memcpy((
unsigned char*) &
context->buffer[index], (
unsigned char*) & input[i], inputLen - i);
733 unsigned char bits[16];
734 unsigned int index, padLen;
737 bits[15] = (
unsigned char) (
context->count[0] & 0xFF);
738 bits[14] = (
unsigned char) ((
context->count[0] >> 8) & 0xFF);
739 bits[13] = (
unsigned char) ((
context->count[0] >> 16) & 0xFF);
740 bits[12] = (
unsigned char) ((
context->count[0] >> 24) & 0xFF);
741 bits[11] = (
unsigned char) ((
context->count[0] >> 32) & 0xFF);
742 bits[10] = (
unsigned char) ((
context->count[0] >> 40) & 0xFF);
743 bits[9] = (
unsigned char) ((
context->count[0] >> 48) & 0xFF);
744 bits[8] = (
unsigned char) ((
context->count[0] >> 56) & 0xFF);
745 bits[7] = (
unsigned char) (
context->count[1] & 0xFF);
746 bits[6] = (
unsigned char) ((
context->count[1] >> 8) & 0xFF);
747 bits[5] = (
unsigned char) ((
context->count[1] >> 16) & 0xFF);
748 bits[4] = (
unsigned char) ((
context->count[1] >> 24) & 0xFF);
749 bits[3] = (
unsigned char) ((
context->count[1] >> 32) & 0xFF);
750 bits[2] = (
unsigned char) ((
context->count[1] >> 40) & 0xFF);
751 bits[1] = (
unsigned char) ((
context->count[1] >> 48) & 0xFF);
752 bits[0] = (
unsigned char) ((
context->count[1] >> 56) & 0xFF);
756 index = (
unsigned int) ((
context->count[0] >> 3) & 0x7f);
757 padLen = (index < 112) ? (112 - index) : (240 - index);
764 SHAEncode64(digest,
context->state, 64);
777 unsigned char full_digest[64];
779 memcpy(digest, full_digest, 32);
788 unsigned char full_digest[64];
790 memcpy(digest, full_digest, 28);
PHP_HASH_API zend_result php_hash_serialize(const php_hashcontext_object *hash, zend_long *magic, zval *zv)
PHP_HASH_API zend_result php_hash_copy(const void *ops, const void *orig_context, void *dest_context)
PHP_HASH_API int php_hash_unserialize(php_hashcontext_object *hash, zend_long magic, const zval *zv)
#define SHA256_F0(x, y, z)
PHP_HASH_API void PHP_SHA512_224InitArgs(PHP_SHA512_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_SHA256Final(unsigned char digest[32], PHP_SHA256_CTX *context)
PHP_HASH_API void PHP_SHA384Final(unsigned char digest[48], PHP_SHA384_CTX *context)
const php_hash_ops php_hash_sha256_ops
PHP_HASH_API void PHP_SHA512_224Final(unsigned char digest[28], PHP_SHA512_CTX *context)
const php_hash_ops php_hash_sha384_ops
PHP_HASH_API void PHP_SHA512_256InitArgs(PHP_SHA512_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_SHA512_256Final(unsigned char digest[32], PHP_SHA512_CTX *context)
PHP_HASH_API void PHP_SHA256Update(PHP_SHA256_CTX *context, const unsigned char *input, size_t inputLen)
PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX *context, const unsigned char *input, size_t inputLen)
PHP_HASH_API void PHP_SHA512InitArgs(PHP_SHA512_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
const php_hash_ops php_hash_sha1_ops
#define SHA256_F1(x, y, z)
const php_hash_ops php_hash_sha512_224_ops
PHP_HASH_API void PHP_SHA256InitArgs(PHP_SHA256_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_SHA384Update(PHP_SHA384_CTX *context, const unsigned char *input, size_t inputLen)
#define SHA512_F0(x, y, z)
const php_hash_ops php_hash_sha224_ops
PHP_HASH_API void PHP_SHA224InitArgs(PHP_SHA224_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_SHA384InitArgs(PHP_SHA384_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
PHP_HASH_API void PHP_SHA224Final(unsigned char digest[28], PHP_SHA224_CTX *context)
const php_hash_ops php_hash_sha512_256_ops
#define SHA512_F1(x, y, z)
PHP_HASH_API void PHP_SHA512Update(PHP_SHA512_CTX *context, const unsigned char *input, size_t inputLen)
const php_hash_ops php_hash_sha512_ops
PHP_HASH_API void PHP_SHA512Final(unsigned char digest[64], PHP_SHA512_CTX *context)
void(* php_hash_final_func_t)(unsigned char *digest, void *context)
void(* php_hash_init_func_t)(void *context, HashTable *args)
void(* php_hash_update_func_t)(void *context, const unsigned char *buf, size_t count)
struct _php_hash_ops php_hash_ops
#define PHP_SHA512_224Update
#define PHP_SHA512_256Update
PHPAPI void PHP_SHA1Final(unsigned char digest[20], PHP_SHA1_CTX *context)
PHPAPI void PHP_SHA1Update(PHP_SHA1_CTX *context, const unsigned char *input, size_t inputLen)
PHPAPI void PHP_SHA1InitArgs(PHP_SHA1_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
ZEND_API int zend_cpu_supports(zend_cpu_feature feature)
#define ZEND_ATTRIBUTE_UNUSED
#define ZEND_SECURE_ZERO(var, size)
struct _zend_array HashTable