372 char *copied_key =
NULL;
373 char *copied_salt =
NULL;
378 bool rounds_custom = 0;
382 if (
strncmp(sha512_salt_prefix, salt,
sizeof(sha512_salt_prefix) - 1) == 0) {
384 salt +=
sizeof(sha512_salt_prefix) - 1;
387 if (
strncmp(salt, sha512_rounds_prefix,
sizeof(sha512_rounds_prefix) - 1) == 0) {
388 const char *num = salt +
sizeof(sha512_rounds_prefix) - 1;
394 if (srounds < ROUNDS_MIN || srounds >
ROUNDS_MAX) {
405 char *tmp_key =
NULL;
407 char *tmp_salt =
NULL;
419 if ((uintptr_t)salt %
__alignof__ (uint64_t) != 0) {
422 copied_salt[salt_len] = 0;
426 sha512_init_ctx(&ctx);
429 sha512_process_bytes(
key, key_len, &ctx);
434 sha512_process_bytes(salt, salt_len, &ctx);
439 sha512_init_ctx(&alt_ctx);
442 sha512_process_bytes(
key, key_len, &alt_ctx);
445 sha512_process_bytes(salt, salt_len, &alt_ctx);
448 sha512_process_bytes(
key, key_len, &alt_ctx);
452 sha512_finish_ctx(&alt_ctx, alt_result);
455 for (cnt = key_len; cnt > 64; cnt -= 64) {
456 sha512_process_bytes(alt_result, 64, &ctx);
458 sha512_process_bytes(alt_result, cnt, &ctx);
462 for (cnt = key_len; cnt > 0; cnt >>= 1) {
463 if ((cnt & 1) != 0) {
464 sha512_process_bytes(alt_result, 64, &ctx);
466 sha512_process_bytes(
key, key_len, &ctx);
471 sha512_finish_ctx(&ctx, alt_result);
474 sha512_init_ctx(&alt_ctx);
477 for (cnt = 0; cnt < key_len; ++cnt) {
478 sha512_process_bytes(
key, key_len, &alt_ctx);
482 sha512_finish_ctx(&alt_ctx, temp_result);
486 cp = p_bytes =
do_alloca(key_len, use_heap_p_bytes);
487 for (cnt = key_len; cnt >= 64; cnt -= 64) {
488 cp = zend_mempcpy((
void *)
cp, (
const void *)temp_result, 64);
494 sha512_init_ctx(&alt_ctx);
497 for (cnt = 0; cnt < (size_t) (16 + alt_result[0]); ++cnt) {
498 sha512_process_bytes(salt, salt_len, &alt_ctx);
502 sha512_finish_ctx(&alt_ctx, temp_result);
506 cp = s_bytes =
do_alloca(salt_len, use_heap_s_bytes);
507 for (cnt = salt_len; cnt >= 64; cnt -= 64) {
508 cp = zend_mempcpy(
cp, temp_result, 64);
514 for (cnt = 0; cnt < rounds; ++cnt) {
516 sha512_init_ctx(&ctx);
519 if ((cnt & 1) != 0) {
520 sha512_process_bytes(p_bytes, key_len, &ctx);
522 sha512_process_bytes(alt_result, 64, &ctx);
527 sha512_process_bytes(s_bytes, salt_len, &ctx);
532 sha512_process_bytes(p_bytes, key_len, &ctx);
536 if ((cnt & 1) != 0) {
537 sha512_process_bytes(alt_result, 64, &ctx);
539 sha512_process_bytes(p_bytes, key_len, &ctx);
543 sha512_finish_ctx(&ctx, alt_result);
549 buflen -=
sizeof(sha512_salt_prefix) - 1;
569#define b64_from_24bit(B2, B1, B0, N) \
571 unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
573 while (n-- > 0 && buflen > 0) \
575 *cp++ = b64t[w & 0x3f]; \
591 b64_from_24bit(alt_result[31], alt_result[52], alt_result[10], 4);
592 b64_from_24bit(alt_result[53], alt_result[11], alt_result[32], 4);
593 b64_from_24bit(alt_result[12], alt_result[33], alt_result[54], 4);
594 b64_from_24bit(alt_result[34], alt_result[55], alt_result[13], 4);
595 b64_from_24bit(alt_result[56], alt_result[14], alt_result[35], 4);
596 b64_from_24bit(alt_result[15], alt_result[36], alt_result[57], 4);
597 b64_from_24bit(alt_result[37], alt_result[58], alt_result[16], 4);
598 b64_from_24bit(alt_result[59], alt_result[17], alt_result[38], 4);
599 b64_from_24bit(alt_result[18], alt_result[39], alt_result[60], 4);
600 b64_from_24bit(alt_result[40], alt_result[61], alt_result[19], 4);
601 b64_from_24bit(alt_result[62], alt_result[20], alt_result[41], 4);
615 sha512_init_ctx(&ctx);
616 sha512_finish_ctx(&ctx, alt_result);
622 if (copied_key !=
NULL) {
625 if (copied_salt !=
NULL) {
628 if (tmp_key !=
NULL) {
631 if (tmp_salt !=
NULL) {