aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-01-15 20:16:27 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2017-01-15 20:16:27 +0100
commitb8935d00b0a60be24ee9073349c2a185cebbacd4 (patch)
treea4101faf1c82244d88f76b14bbb5875506b20c10
parent3f8ecd933a610c6f3b5d02e184c7faf205ad95d3 (diff)
downloadbusybox-w32-b8935d00b0a60be24ee9073349c2a185cebbacd4.tar.gz
busybox-w32-b8935d00b0a60be24ee9073349c2a185cebbacd4.tar.bz2
busybox-w32-b8935d00b0a60be24ee9073349c2a185cebbacd4.zip
sha512: use larger constant table only if sha512 is in fact selected
function old new delta sha_K 640 256 -384 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/hash_md5_sha.c112
-rwxr-xr-xmake_single_applets.sh5
2 files changed, 70 insertions, 47 deletions
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c
index 7e7d8da2f..d325584d7 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
@@ -564,48 +566,59 @@ static void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx)
564 * are the most significant half of first 64 elements 566 * are the most significant half of first 64 elements
565 * of the same array. 567 * of the same array.
566 */ 568 */
567static const uint64_t sha_K[80] = { 569#undef K
568 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 570#if NEED_SHA512
569 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 571typedef uint64_t sha_K_int;
570 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 572# define K(v) v
571 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 573#else
572 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 574typedef uint32_t sha_K_int;
573 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 575# define K(v) (uint32_t)(v >> 32)
574 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 576#endif
575 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 577static const sha_K_int sha_K[] = {
576 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 578 K(0x428a2f98d728ae22ULL), K(0x7137449123ef65cdULL),
577 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 579 K(0xb5c0fbcfec4d3b2fULL), K(0xe9b5dba58189dbbcULL),
578 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 580 K(0x3956c25bf348b538ULL), K(0x59f111f1b605d019ULL),
579 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 581 K(0x923f82a4af194f9bULL), K(0xab1c5ed5da6d8118ULL),
580 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 582 K(0xd807aa98a3030242ULL), K(0x12835b0145706fbeULL),
581 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 583 K(0x243185be4ee4b28cULL), K(0x550c7dc3d5ffb4e2ULL),
582 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 584 K(0x72be5d74f27b896fULL), K(0x80deb1fe3b1696b1ULL),
583 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 585 K(0x9bdc06a725c71235ULL), K(0xc19bf174cf692694ULL),
584 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 586 K(0xe49b69c19ef14ad2ULL), K(0xefbe4786384f25e3ULL),
585 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 587 K(0x0fc19dc68b8cd5b5ULL), K(0x240ca1cc77ac9c65ULL),
586 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 588 K(0x2de92c6f592b0275ULL), K(0x4a7484aa6ea6e483ULL),
587 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 589 K(0x5cb0a9dcbd41fbd4ULL), K(0x76f988da831153b5ULL),
588 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 590 K(0x983e5152ee66dfabULL), K(0xa831c66d2db43210ULL),
589 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 591 K(0xb00327c898fb213fULL), K(0xbf597fc7beef0ee4ULL),
590 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 592 K(0xc6e00bf33da88fc2ULL), K(0xd5a79147930aa725ULL),
591 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 593 K(0x06ca6351e003826fULL), K(0x142929670a0e6e70ULL),
592 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 594 K(0x27b70a8546d22ffcULL), K(0x2e1b21385c26c926ULL),
593 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 595 K(0x4d2c6dfc5ac42aedULL), K(0x53380d139d95b3dfULL),
594 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 596 K(0x650a73548baf63deULL), K(0x766a0abb3c77b2a8ULL),
595 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 597 K(0x81c2c92e47edaee6ULL), K(0x92722c851482353bULL),
596 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 598 K(0xa2bfe8a14cf10364ULL), K(0xa81a664bbc423001ULL),
597 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 599 K(0xc24b8b70d0f89791ULL), K(0xc76c51a30654be30ULL),
598 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 600 K(0xd192e819d6ef5218ULL), K(0xd69906245565a910ULL),
599 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 601 K(0xf40e35855771202aULL), K(0x106aa07032bbd1b8ULL),
600 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, /* [64]+ are used for sha512 only */ 602 K(0x19a4c116b8d2d0c8ULL), K(0x1e376c085141ab53ULL),
601 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 603 K(0x2748774cdf8eeb99ULL), K(0x34b0bcb5e19b48a8ULL),
602 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 604 K(0x391c0cb3c5c95a63ULL), K(0x4ed8aa4ae3418acbULL),
603 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 605 K(0x5b9cca4f7763e373ULL), K(0x682e6ff3d6b2b8a3ULL),
604 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 606 K(0x748f82ee5defb2fcULL), K(0x78a5636f43172f60ULL),
605 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 607 K(0x84c87814a1f0ab72ULL), K(0x8cc702081a6439ecULL),
606 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 608 K(0x90befffa23631e28ULL), K(0xa4506cebde82bde9ULL),
607 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL 609 K(0xbef9a3f7b2c67915ULL), K(0xc67178f2e372532bULL),
610#if NEED_SHA512 /* [64]+ are used for sha512 only */
611 K(0xca273eceea26619cULL), K(0xd186b8c721c0c207ULL),
612 K(0xeada7dd6cde0eb1eULL), K(0xf57d4f7fee6ed178ULL),
613 K(0x06f067aa72176fbaULL), K(0x0a637dc5a2c898a6ULL),
614 K(0x113f9804bef90daeULL), K(0x1b710b35131c471bULL),
615 K(0x28db77f523047d84ULL), K(0x32caab7b40c72493ULL),
616 K(0x3c9ebe0a15c9bebcULL), K(0x431d67c49c100d4cULL),
617 K(0x4cc5d4becb3e42b6ULL), K(0x597f299cfc657e2aULL),
618 K(0x5fcb6fab3ad6faecULL), K(0x6c44198c4a475817ULL),
619#endif
608}; 620};
621#undef K
609 622
610#undef Ch 623#undef Ch
611#undef Maj 624#undef Maj
@@ -649,7 +662,7 @@ static void FAST_FUNC sha256_process_block64(sha256_ctx_t *ctx)
649 * (I hope compiler is clever enough to just fetch 662 * (I hope compiler is clever enough to just fetch
650 * upper half) 663 * upper half)
651 */ 664 */
652 uint32_t K_t = sha_K[t] >> 32; 665 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]; 666 uint32_t T1 = h + S1(e) + Ch(e, f, g) + K_t + W[t];
654 uint32_t T2 = S0(a) + Maj(a, b, c); 667 uint32_t T2 = S0(a) + Maj(a, b, c);
655 h = g; 668 h = g;
@@ -679,6 +692,7 @@ static void FAST_FUNC sha256_process_block64(sha256_ctx_t *ctx)
679 ctx->hash[7] += h; 692 ctx->hash[7] += h;
680} 693}
681 694
695#if NEED_SHA512
682static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx) 696static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx)
683{ 697{
684 unsigned t; 698 unsigned t;
@@ -740,7 +754,7 @@ static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx)
740 ctx->hash[6] += g; 754 ctx->hash[6] += g;
741 ctx->hash[7] += h; 755 ctx->hash[7] += h;
742} 756}
743 757#endif /* NEED_SHA512 */
744 758
745void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) 759void FAST_FUNC sha1_begin(sha1_ctx_t *ctx)
746{ 760{
@@ -765,6 +779,7 @@ static const uint32_t init256[] = {
765 0x1f83d9ab, 779 0x1f83d9ab,
766 0x5be0cd19, 780 0x5be0cd19,
767}; 781};
782#if NEED_SHA512
768static const uint32_t init512_lo[] = { 783static const uint32_t init512_lo[] = {
769 0, 784 0,
770 0, 785 0,
@@ -777,6 +792,7 @@ static const uint32_t init512_lo[] = {
777 0xfb41bd6b, 792 0xfb41bd6b,
778 0x137e2179, 793 0x137e2179,
779}; 794};
795#endif /* NEED_SHA512 */
780 796
781/* Initialize structure containing state of computation. 797/* Initialize structure containing state of computation.
782 (FIPS 180-2:5.3.2) */ 798 (FIPS 180-2:5.3.2) */
@@ -787,6 +803,7 @@ void FAST_FUNC sha256_begin(sha256_ctx_t *ctx)
787 ctx->process_block = sha256_process_block64; 803 ctx->process_block = sha256_process_block64;
788} 804}
789 805
806#if NEED_SHA512
790/* Initialize structure containing state of computation. 807/* Initialize structure containing state of computation.
791 (FIPS 180-2:5.3.3) */ 808 (FIPS 180-2:5.3.3) */
792void FAST_FUNC sha512_begin(sha512_ctx_t *ctx) 809void FAST_FUNC sha512_begin(sha512_ctx_t *ctx)
@@ -810,7 +827,7 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
810 ctx->total64[0] += len; 827 ctx->total64[0] += len;
811 if (ctx->total64[0] < len) 828 if (ctx->total64[0] < len)
812 ctx->total64[1]++; 829 ctx->total64[1]++;
813#if 0 830# if 0
814 remaining = 128 - bufpos; 831 remaining = 128 - bufpos;
815 832
816 /* Hash whole blocks */ 833 /* Hash whole blocks */
@@ -825,7 +842,7 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
825 842
826 /* Save last, partial blosk */ 843 /* Save last, partial blosk */
827 memcpy(ctx->wbuffer + bufpos, buffer, len); 844 memcpy(ctx->wbuffer + bufpos, buffer, len);
828#else 845# else
829 while (1) { 846 while (1) {
830 remaining = 128 - bufpos; 847 remaining = 128 - bufpos;
831 if (remaining > len) 848 if (remaining > len)
@@ -843,8 +860,9 @@ void FAST_FUNC sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len)
843 sha512_process_block128(ctx); 860 sha512_process_block128(ctx);
844 /*bufpos = 0; - already is */ 861 /*bufpos = 0; - already is */
845 } 862 }
846#endif 863# endif
847} 864}
865#endif /* NEED_SHA512 */
848 866
849/* Used also for sha256 */ 867/* Used also for sha256 */
850void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf) 868void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
@@ -864,6 +882,7 @@ void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
864 memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * hash_size); 882 memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * hash_size);
865} 883}
866 884
885#if NEED_SHA512
867void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf) 886void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
868{ 887{
869 unsigned bufpos = ctx->total64[0] & 127; 888 unsigned bufpos = ctx->total64[0] & 127;
@@ -897,6 +916,7 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
897 } 916 }
898 memcpy(resbuf, ctx->hash, sizeof(ctx->hash)); 917 memcpy(resbuf, ctx->hash, sizeof(ctx->hash));
899} 918}
919#endif /* NEED_SHA512 */
900 920
901 921
902/* 922/*
diff --git a/make_single_applets.sh b/make_single_applets.sh
index 03a5c324f..8ad7a7406 100755
--- a/make_single_applets.sh
+++ b/make_single_applets.sh
@@ -30,9 +30,12 @@ done
30 30
31trap 'test -f .config.SV && mv .config.SV .config && touch .config' EXIT 31trap 'test -f .config.SV && mv .config.SV .config && touch .config' EXIT
32 32
33
33# Turn on each applet individually and build single-applet executable 34# Turn on each applet individually and build single-applet executable
35# (give config names on command line to build only those)
36test $# = 0 && set -- $apps
34fail=0 37fail=0
35for app in $apps; do 38for app; do
36 # Only if it was indeed originally enabled... 39 # Only if it was indeed originally enabled...
37 { echo "$cfg" | grep -q "^CONFIG_${app}=y\$"; } || continue 40 { echo "$cfg" | grep -q "^CONFIG_${app}=y\$"; } || continue
38 41