aboutsummaryrefslogtreecommitdiff
path: root/libbb/hash_md5_sha.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/hash_md5_sha.c')
-rw-r--r--libbb/hash_md5_sha.c127
1 files changed, 76 insertions, 51 deletions
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c
index 7e7d8da2f..2a7247430 100644
--- a/libbb/hash_md5_sha.c
+++ b/libbb/hash_md5_sha.c
@@ -9,6 +9,8 @@
9 9
10#include "libbb.h" 10#include "libbb.h"
11 11
12#define NEED_SHA512 (ENABLE_SHA512SUM || ENABLE_USE_BB_CRYPT_SHA)
13
12/* gcc 4.2.1 optimizes rotr64 better with inline than with macro 14/* gcc 4.2.1 optimizes rotr64 better with inline than with macro
13 * (for rotX32, there is no difference). Why? My guess is that 15 * (for rotX32, there is no difference). Why? My guess is that
14 * macro requires clever common subexpression elimination heuristics 16 * macro requires clever common subexpression elimination heuristics
@@ -456,7 +458,7 @@ void FAST_FUNC md5_hash(md5_ctx_t *ctx, const void *buffer, size_t len)
456 * endian byte order, so that a byte-wise output yields to the wanted 458 * endian byte order, so that a byte-wise output yields to the wanted
457 * ASCII representation of the message digest. 459 * ASCII representation of the message digest.
458 */ 460 */
459void FAST_FUNC md5_end(md5_ctx_t *ctx, void *resbuf) 461unsigned FAST_FUNC md5_end(md5_ctx_t *ctx, void *resbuf)
460{ 462{
461 /* MD5 stores total in LE, need to swap on BE arches: */ 463 /* MD5 stores total in LE, need to swap on BE arches: */
462 common64_end(ctx, /*swap_needed:*/ BB_BIG_ENDIAN); 464 common64_end(ctx, /*swap_needed:*/ BB_BIG_ENDIAN);
@@ -470,6 +472,7 @@ void FAST_FUNC md5_end(md5_ctx_t *ctx, void *resbuf)
470 } 472 }
471 473
472 memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * 4); 474 memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * 4);
475 return sizeof(ctx->hash[0]) * 4;
473} 476}
474 477
475 478
@@ -564,48 +567,59 @@ static void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx)
564 * are the most significant half of first 64 elements 567 * are the most significant half of first 64 elements
565 * of the same array. 568 * of the same array.
566 */ 569 */
567static const uint64_t sha_K[80] = { 570#undef K
568 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 571#if NEED_SHA512
569 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 572typedef uint64_t sha_K_int;
570 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 573# define K(v) v
571 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 574#else
572 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 575typedef uint32_t sha_K_int;
573 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 576# define K(v) (uint32_t)(v >> 32)
574 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 577#endif
575 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 578static const sha_K_int sha_K[] = {
576 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 579 K(0x428a2f98d728ae22ULL), K(0x7137449123ef65cdULL),
577 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 580 K(0xb5c0fbcfec4d3b2fULL), K(0xe9b5dba58189dbbcULL),
578 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 581 K(0x3956c25bf348b538ULL), K(0x59f111f1b605d019ULL),
579 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 582 K(0x923f82a4af194f9bULL), K(0xab1c5ed5da6d8118ULL),
580 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 583 K(0xd807aa98a3030242ULL), K(0x12835b0145706fbeULL),
581 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 584 K(0x243185be4ee4b28cULL), K(0x550c7dc3d5ffb4e2ULL),
582 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 585 K(0x72be5d74f27b896fULL), K(0x80deb1fe3b1696b1ULL),
583 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 586 K(0x9bdc06a725c71235ULL), K(0xc19bf174cf692694ULL),
584 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 587 K(0xe49b69c19ef14ad2ULL), K(0xefbe4786384f25e3ULL),
585 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 588 K(0x0fc19dc68b8cd5b5ULL), K(0x240ca1cc77ac9c65ULL),
586 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 589 K(0x2de92c6f592b0275ULL), K(0x4a7484aa6ea6e483ULL),
587 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 590 K(0x5cb0a9dcbd41fbd4ULL), K(0x76f988da831153b5ULL),
588 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 591 K(0x983e5152ee66dfabULL), K(0xa831c66d2db43210ULL),
589 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 592 K(0xb00327c898fb213fULL), K(0xbf597fc7beef0ee4ULL),
590 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 593 K(0xc6e00bf33da88fc2ULL), K(0xd5a79147930aa725ULL),
591 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 594 K(0x06ca6351e003826fULL), K(0x142929670a0e6e70ULL),
592 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 595 K(0x27b70a8546d22ffcULL), K(0x2e1b21385c26c926ULL),
593 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 596 K(0x4d2c6dfc5ac42aedULL), K(0x53380d139d95b3dfULL),
594 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 597 K(0x650a73548baf63deULL), K(0x766a0abb3c77b2a8ULL),
595 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 598 K(0x81c2c92e47edaee6ULL), K(0x92722c851482353bULL),
596 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 599 K(0xa2bfe8a14cf10364ULL), K(0xa81a664bbc423001ULL),
597 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 600 K(0xc24b8b70d0f89791ULL), K(0xc76c51a30654be30ULL),
598 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 601 K(0xd192e819d6ef5218ULL), K(0xd69906245565a910ULL),
599 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 602 K(0xf40e35855771202aULL), K(0x106aa07032bbd1b8ULL),
600 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, /* [64]+ are used for sha512 only */ 603 K(0x19a4c116b8d2d0c8ULL), K(0x1e376c085141ab53ULL),
601 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 604 K(0x2748774cdf8eeb99ULL), K(0x34b0bcb5e19b48a8ULL),
602 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 605 K(0x391c0cb3c5c95a63ULL), K(0x4ed8aa4ae3418acbULL),
603 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 606 K(0x5b9cca4f7763e373ULL), K(0x682e6ff3d6b2b8a3ULL),
604 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 607 K(0x748f82ee5defb2fcULL), K(0x78a5636f43172f60ULL),
605 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 608 K(0x84c87814a1f0ab72ULL), K(0x8cc702081a6439ecULL),
606 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 609 K(0x90befffa23631e28ULL), K(0xa4506cebde82bde9ULL),
607 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL 610 K(0xbef9a3f7b2c67915ULL), K(0xc67178f2e372532bULL),
611#if NEED_SHA512 /* [64]+ are used for sha512 only */
612 K(0xca273eceea26619cULL), K(0xd186b8c721c0c207ULL),
613 K(0xeada7dd6cde0eb1eULL), K(0xf57d4f7fee6ed178ULL),
614 K(0x06f067aa72176fbaULL), K(0x0a637dc5a2c898a6ULL),
615 K(0x113f9804bef90daeULL), K(0x1b710b35131c471bULL),
616 K(0x28db77f523047d84ULL), K(0x32caab7b40c72493ULL),
617 K(0x3c9ebe0a15c9bebcULL), K(0x431d67c49c100d4cULL),
618 K(0x4cc5d4becb3e42b6ULL), K(0x597f299cfc657e2aULL),
619 K(0x5fcb6fab3ad6faecULL), K(0x6c44198c4a475817ULL),
620#endif
608}; 621};
622#undef K
609 623
610#undef Ch 624#undef Ch
611#undef Maj 625#undef Maj
@@ -649,7 +663,7 @@ static void FAST_FUNC sha256_process_block64(sha256_ctx_t *ctx)
649 * (I hope compiler is clever enough to just fetch 663 * (I hope compiler is clever enough to just fetch
650 * upper half) 664 * upper half)
651 */ 665 */
652 uint32_t K_t = sha_K[t] >> 32; 666 uint32_t K_t = NEED_SHA512 ? (sha_K[t] >> 32) : sha_K[t];
653 uint32_t T1 = h + S1(e) + Ch(e, f, g) + K_t + W[t]; 667 uint32_t T1 = h + S1(e) + Ch(e, f, g) + K_t + W[t];
654 uint32_t T2 = S0(a) + Maj(a, b, c); 668 uint32_t T2 = S0(a) + Maj(a, b, c);
655 h = g; 669 h = g;
@@ -679,6 +693,7 @@ static void FAST_FUNC sha256_process_block64(sha256_ctx_t *ctx)
679 ctx->hash[7] += h; 693 ctx->hash[7] += h;
680} 694}
681 695
696#if NEED_SHA512
682static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx) 697static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx)
683{ 698{
684 unsigned t; 699 unsigned t;
@@ -740,7 +755,7 @@ static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx)
740 ctx->hash[6] += g; 755 ctx->hash[6] += g;
741 ctx->hash[7] += h; 756 ctx->hash[7] += h;
742} 757}
743 758#endif /* NEED_SHA512 */
744 759
745void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) 760void FAST_FUNC sha1_begin(sha1_ctx_t *ctx)
746{ 761{
@@ -765,6 +780,7 @@ static const uint32_t init256[] = {
765 0x1f83d9ab, 780 0x1f83d9ab,
766 0x5be0cd19, 781 0x5be0cd19,
767}; 782};
783#if NEED_SHA512
768static const uint32_t init512_lo[] = { 784static const uint32_t init512_lo[] = {
769 0, 785 0,
770 0, 786 0,
@@ -777,6 +793,7 @@ static const uint32_t init512_lo[] = {
777 0xfb41bd6b, 793 0xfb41bd6b,
778 0x137e2179, 794 0x137e2179,
779}; 795};
796#endif /* NEED_SHA512 */
780 797
781/* Initialize structure containing state of computation. 798/* Initialize structure containing state of computation.
782 (FIPS 180-2:5.3.2) */ 799 (FIPS 180-2:5.3.2) */
@@ -787,6 +804,7 @@ void FAST_FUNC sha256_begin(sha256_ctx_t *ctx)
787 ctx->process_block = sha256_process_block64; 804 ctx->process_block = sha256_process_block64;
788} 805}
789 806
807#if NEED_SHA512
790/* Initialize structure containing state of computation. 808/* Initialize structure containing state of computation.
791 (FIPS 180-2:5.3.3) */ 809 (FIPS 180-2:5.3.3) */
792void FAST_FUNC sha512_begin(sha512_ctx_t *ctx) 810void FAST_FUNC sha512_begin(sha512_ctx_t *ctx)
@@ -810,7 +828,7 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
810 ctx->total64[0] += len; 828 ctx->total64[0] += len;
811 if (ctx->total64[0] < len) 829 if (ctx->total64[0] < len)
812 ctx->total64[1]++; 830 ctx->total64[1]++;
813#if 0 831# if 0
814 remaining = 128 - bufpos; 832 remaining = 128 - bufpos;
815 833
816 /* Hash whole blocks */ 834 /* Hash whole blocks */
@@ -825,7 +843,7 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
825 843
826 /* Save last, partial blosk */ 844 /* Save last, partial blosk */
827 memcpy(ctx->wbuffer + bufpos, buffer, len); 845 memcpy(ctx->wbuffer + bufpos, buffer, len);
828#else 846# else
829 while (1) { 847 while (1) {
830 remaining = 128 - bufpos; 848 remaining = 128 - bufpos;
831 if (remaining > len) 849 if (remaining > len)
@@ -843,11 +861,12 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
843 sha512_process_block128(ctx); 861 sha512_process_block128(ctx);
844 /*bufpos = 0; - already is */ 862 /*bufpos = 0; - already is */
845 } 863 }
846#endif 864# endif
847} 865}
866#endif /* NEED_SHA512 */
848 867
849/* Used also for sha256 */ 868/* Used also for sha256 */
850void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf) 869unsigned FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
851{ 870{
852 unsigned hash_size; 871 unsigned hash_size;
853 872
@@ -861,10 +880,13 @@ void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
861 for (i = 0; i < hash_size; ++i) 880 for (i = 0; i < hash_size; ++i)
862 ctx->hash[i] = SWAP_BE32(ctx->hash[i]); 881 ctx->hash[i] = SWAP_BE32(ctx->hash[i]);
863 } 882 }
864 memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * hash_size); 883 hash_size *= sizeof(ctx->hash[0]);
884 memcpy(resbuf, ctx->hash, hash_size);
885 return hash_size;
865} 886}
866 887
867void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf) 888#if NEED_SHA512
889unsigned FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
868{ 890{
869 unsigned bufpos = ctx->total64[0] & 127; 891 unsigned bufpos = ctx->total64[0] & 127;
870 892
@@ -896,7 +918,9 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
896 ctx->hash[i] = SWAP_BE64(ctx->hash[i]); 918 ctx->hash[i] = SWAP_BE64(ctx->hash[i]);
897 } 919 }
898 memcpy(resbuf, ctx->hash, sizeof(ctx->hash)); 920 memcpy(resbuf, ctx->hash, sizeof(ctx->hash));
921 return sizeof(ctx->hash);
899} 922}
923#endif /* NEED_SHA512 */
900 924
901 925
902/* 926/*
@@ -1430,7 +1454,7 @@ void FAST_FUNC sha3_hash(sha3_ctx_t *ctx, const void *buffer, size_t len)
1430#endif 1454#endif
1431} 1455}
1432 1456
1433void FAST_FUNC sha3_end(sha3_ctx_t *ctx, void *resbuf) 1457unsigned FAST_FUNC sha3_end(sha3_ctx_t *ctx, void *resbuf)
1434{ 1458{
1435 /* Padding */ 1459 /* Padding */
1436 uint8_t *buf = (uint8_t*)ctx->state; 1460 uint8_t *buf = (uint8_t*)ctx->state;
@@ -1455,4 +1479,5 @@ void FAST_FUNC sha3_end(sha3_ctx_t *ctx, void *resbuf)
1455 1479
1456 /* Output */ 1480 /* Output */
1457 memcpy(resbuf, ctx->state, 64); 1481 memcpy(resbuf, ctx->state, 64);
1482 return 64;
1458} 1483}