From e1fcd3ab04868f60685e97f09ee329ce7e3bed1c Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Wed, 5 Jul 2017 14:26:53 +0200 Subject: [PATCH] add hashsum multi-hash option --- demos/hashsum.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/demos/hashsum.c b/demos/hashsum.c index 880a725..f9d53ae 100644 --- a/demos/hashsum.c +++ b/demos/hashsum.c @@ -159,7 +159,7 @@ ERR: int main(int argc, char **argv) { - int idx, check, z, err, argn; + int idxs[TAB_SIZE], idx, check, y, z, err, argn; unsigned long w, x; unsigned char hash_buffer[MAXBLOCKSIZE]; @@ -175,16 +175,19 @@ int main(int argc, char **argv) die(EXIT_FAILURE); } + for (x = 0; x < sizeof(idxs)/sizeof(idxs[0]); ++x) { + idxs[x] = -2; + } argn = 1; check = 0; - idx = -2; + idx = 0; while(argn < argc){ if(strcmp("-a", argv[argn]) == 0) { argn++; if(argn < argc) { - idx = find_hash(argv[argn]); - if (idx == -1) { + idxs[idx] = find_hash(argv[argn]); + if (idxs[idx] == -1) { struct { const char* is; const char* should; @@ -215,15 +218,20 @@ int main(int argc, char **argv) }; for (x = 0; shasum_compat[x].is != NULL; ++x) { if(XSTRCMP(shasum_compat[x].is, argv[argn]) == 0) { - idx = find_hash(shasum_compat[x].should); + idxs[idx] = find_hash(shasum_compat[x].should); break; } } } - if (idx == -1) { + if (idxs[idx] == -1) { fprintf(stderr, "%s: Unrecognized algorithm\n", hashsum); die(EXIT_FAILURE); } + idx++; + if ((size_t)idx >= sizeof(idxs)/sizeof(idxs[0])) { + fprintf(stderr, "%s: Too many '-a' options chosen\n", hashsum); + die(EXIT_FAILURE); + } argn++; continue; } @@ -245,7 +253,7 @@ int main(int argc, char **argv) if (argc == argn) { w = sizeof(hash_buffer); - if ((err = hash_filehandle(idx, stdin, hash_buffer, &w)) != CRYPT_OK) { + if ((err = hash_filehandle(idxs[0], stdin, hash_buffer, &w)) != CRYPT_OK) { fprintf(stderr, "%s: File hash error: %s\n", hashsum, error_to_string(err)); return EXIT_FAILURE; } else { @@ -255,14 +263,16 @@ int main(int argc, char **argv) printf(" *-\n"); } } else { - for (z = 3; z < argc; z++) { - w = sizeof(hash_buffer); - if ((err = hash_file(idx,argv[z],hash_buffer,&w)) != CRYPT_OK) { - fprintf(stderr, "%s: File hash error: %s\n", hashsum, error_to_string(err)); - return EXIT_FAILURE; - } else { - printf_hex(hash_buffer, w); - printf(" *%s\n", argv[z]); + for (z = argn; z < argc; z++) { + for (y = 0; y < idx; ++y) { + w = sizeof(hash_buffer); + if ((err = hash_file(idxs[y],argv[z],hash_buffer,&w)) != CRYPT_OK) { + fprintf(stderr, "%s: File hash error: %s\n", hashsum, error_to_string(err)); + return EXIT_FAILURE; + } else { + printf_hex(hash_buffer, w); + printf(" *%s\n", argv[z]); + } } } }