From 71a090f1871f165ebf3c31f733b36aafca71a6b4 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 29 Aug 2016 14:05:25 +0200 Subject: sha3: fix to conform to final SHA3 padding standard, add -a BITS option function old new delta hash_file 331 396 +65 md5_sha1_sum_main 485 538 +53 packed_usage 30423 30464 +41 sha3_begin 17 31 +14 sha3_hash 101 110 +9 sha3_end 41 49 +8 Signed-off-by: Denys Vlasenko --- coreutils/md5_sha1_sum.c | 122 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 16 deletions(-) (limited to 'coreutils/md5_sha1_sum.c') diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c index c0e816ba6..5e017b191 100644 --- a/coreutils/md5_sha1_sum.c +++ b/coreutils/md5_sha1_sum.c @@ -5,6 +5,60 @@ * * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config MD5SUM +//config: bool "md5sum" +//config: default y +//config: help +//config: md5sum is used to print or check MD5 checksums. +//config: +//config:config SHA1SUM +//config: bool "sha1sum" +//config: default y +//config: help +//config: Compute and check SHA1 message digest +//config: +//config:config SHA256SUM +//config: bool "sha256sum" +//config: default y +//config: help +//config: Compute and check SHA256 message digest +//config: +//config:config SHA512SUM +//config: bool "sha512sum" +//config: default y +//config: help +//config: Compute and check SHA512 message digest +//config: +//config:config SHA3SUM +//config: bool "sha3sum" +//config: default y +//config: help +//config: Compute and check SHA3 (512-bit) message digest +//config: +//config:comment "Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum" +//config: depends on MD5SUM || SHA1SUM || SHA256SUM || SHA512SUM || SHA3SUM +//config: +//config:config FEATURE_MD5_SHA1_SUM_CHECK +//config: bool "Enable -c, -s and -w options" +//config: default y +//config: depends on MD5SUM || SHA1SUM || SHA256SUM || SHA512SUM || SHA3SUM +//config: help +//config: Enabling the -c options allows files to be checked +//config: against pre-calculated hash values. +//config: +//config: -s and -w are useful options when verifying checksums. + +//applet:IF_MD5SUM(APPLET_NOEXEC(md5sum, md5_sha1_sum, BB_DIR_USR_BIN, BB_SUID_DROP, md5sum)) +//applet:IF_SHA1SUM(APPLET_NOEXEC(sha1sum, md5_sha1_sum, BB_DIR_USR_BIN, BB_SUID_DROP, sha1sum)) +//applet:IF_SHA3SUM(APPLET_NOEXEC(sha3sum, md5_sha1_sum, BB_DIR_USR_BIN, BB_SUID_DROP, sha3sum)) +//applet:IF_SHA256SUM(APPLET_NOEXEC(sha256sum, md5_sha1_sum, BB_DIR_USR_BIN, BB_SUID_DROP, sha256sum)) +//applet:IF_SHA512SUM(APPLET_NOEXEC(sha512sum, md5_sha1_sum, BB_DIR_USR_BIN, BB_SUID_DROP, sha512sum)) + +//kbuild:lib-$(CONFIG_MD5SUM) += md5_sha1_sum.o +//kbuild:lib-$(CONFIG_SHA1SUM) += md5_sha1_sum.o +//kbuild:lib-$(CONFIG_SHA256SUM) += md5_sha1_sum.o +//kbuild:lib-$(CONFIG_SHA512SUM) += md5_sha1_sum.o +//kbuild:lib-$(CONFIG_SHA3SUM) += md5_sha1_sum.o //usage:#define md5sum_trivial_usage //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." @@ -57,13 +111,14 @@ //usage: ) //usage: //usage:#define sha3sum_trivial_usage -//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." +//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[-a BITS] [FILE]..." //usage:#define sha3sum_full_usage "\n\n" -//usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA3-512 checksums" +//usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA3 checksums" //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" //usage: "\n -c Check sums against list in FILEs" //usage: "\n -s Don't output anything, status code shows success" //usage: "\n -w Warn about improperly formatted checksum lines" +//usage: "\n -a BITS 224 (default), 256, 384, 512" //usage: ) //FIXME: GNU coreutils 8.25 has no -s option, it has only these two long opts: @@ -97,7 +152,10 @@ static unsigned char *hash_bin_to_hex(unsigned char *hash_value, return (unsigned char *)hex_value; } -static uint8_t *hash_file(const char *filename) +#if !ENABLE_SHA3SUM +# define hash_file(f,w) hash_file(f) +#endif +static uint8_t *hash_file(const char *filename, unsigned sha3_width) { int src_fd, hash_len, count; union _ctx_ { @@ -125,27 +183,47 @@ static uint8_t *hash_file(const char *filename) update = (void*)md5_hash; final = (void*)md5_end; hash_len = 16; - } else if (ENABLE_SHA1SUM && hash_algo == HASH_SHA1) { + } + else if (ENABLE_SHA1SUM && hash_algo == HASH_SHA1) { sha1_begin(&context.sha1); update = (void*)sha1_hash; final = (void*)sha1_end; hash_len = 20; - } else if (ENABLE_SHA256SUM && hash_algo == HASH_SHA256) { + } + else if (ENABLE_SHA256SUM && hash_algo == HASH_SHA256) { sha256_begin(&context.sha256); update = (void*)sha256_hash; final = (void*)sha256_end; hash_len = 32; - } else if (ENABLE_SHA512SUM && hash_algo == HASH_SHA512) { + } + else if (ENABLE_SHA512SUM && hash_algo == HASH_SHA512) { sha512_begin(&context.sha512); update = (void*)sha512_hash; final = (void*)sha512_end; hash_len = 64; - } else if (ENABLE_SHA3SUM && hash_algo == HASH_SHA3) { + } +#if ENABLE_SHA3SUM + else if (ENABLE_SHA3SUM && hash_algo == HASH_SHA3) { sha3_begin(&context.sha3); update = (void*)sha3_hash; final = (void*)sha3_end; - hash_len = 64; - } else { + /* + * Should support 224, 256, 384, 512. + * We allow any value which does not blow the algorithm up. + */ + if (sha3_width >= 1600/2 /* input block can't be <= 0 */ + || sha3_width == 0 /* hash len can't be 0 */ + || (sha3_width & 0x1f) /* should be multiple of 32 */ + /* (because input uses up to 8 byte wide word XORs. 32/4=8) */ + ) { + bb_error_msg_and_die("bad -a%u", sha3_width); + } + sha3_width /= 4; + context.sha3.input_block_bytes = 1600/8 - sha3_width; + hash_len = sha3_width/2; + } +#endif + else { xfunc_die(); /* can't reach this */ } @@ -176,18 +254,30 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) { int return_value = EXIT_SUCCESS; unsigned flags; +#if ENABLE_SHA3SUM + unsigned sha3_width = 224; +#endif if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK) { /* -s and -w require -c */ opt_complementary = "s?c:w?c"; /* -b "binary", -t "text" are ignored (shaNNNsum compat) */ - flags = getopt32(argv, "scwbt"); - argv += optind; - //argc -= optind; +#if ENABLE_SHA3SUM + if (applet_name[3] == HASH_SHA3) + flags = getopt32(argv, "scwbta:+", &sha3_width); + else +#endif + flags = getopt32(argv, "scwbt"); } else { - argv += 1; - //argc -= 1; +#if ENABLE_SHA3SUM + if (applet_name[3] == HASH_SHA3) + getopt32(argv, "a:+", &sha3_width); + else +#endif + getopt32(argv, ""); } + argv += optind; + //argc -= optind; if (!*argv) *--argv = (char*)"-"; @@ -222,7 +312,7 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) *filename_ptr = '\0'; filename_ptr += 2; - hash_value = hash_file(filename_ptr); + hash_value = hash_file(filename_ptr, sha3_width); if (hash_value && (strcmp((char*)hash_value, line) == 0)) { if (!(flags & FLAG_SILENT)) @@ -251,7 +341,7 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) } fclose_if_not_stdin(pre_computed_stream); } else { - uint8_t *hash_value = hash_file(*argv); + uint8_t *hash_value = hash_file(*argv, sha3_width); if (hash_value == NULL) { return_value = EXIT_FAILURE; } else { -- cgit v1.2.3