summaryrefslogtreecommitdiff
path: root/pkgtools
diff options
context:
space:
mode:
authoratatat <atatat@pkgsrc.org>2003-06-15 00:42:29 +0000
committeratatat <atatat@pkgsrc.org>2003-06-15 00:42:29 +0000
commit99b76b3894e893343e33a1ddf03be9f23355f553 (patch)
tree92f70f81c0370a7cc5cc42de20dc3194f81aa2f9 /pkgtools
parent1d0b613b94790f53c8a2bd6626790b327eb8d7d4 (diff)
downloadpkgsrc-99b76b3894e893343e33a1ddf03be9f23355f553.tar.gz
Reword the guts of digest so that the entry points into the various
hashes (fooInit(), fooUpdate(), fooFinal(), and fooFile()) are in the array of structs that list the digests we support. This makes the code somewhat simpler, easier to patch, and makes it much easier to add new algorithms. Note that since this *only* changes the inner workings of the digest program, we don't need to touch the version number. Approved (finally) by agc. :)
Diffstat (limited to 'pkgtools')
-rw-r--r--pkgtools/digest/files/digest.c242
1 files changed, 80 insertions, 162 deletions
diff --git a/pkgtools/digest/files/digest.c b/pkgtools/digest/files/digest.c
index 3946f12cab7..f9798f4593a 100644
--- a/pkgtools/digest/files/digest.c
+++ b/pkgtools/digest/files/digest.c
@@ -1,4 +1,4 @@
-/* $NetBSD: digest.c,v 1.5 2002/12/21 04:06:14 schmonz Exp $ */
+/* $NetBSD: digest.c,v 1.6 2003/06/15 00:42:29 atatat Exp $ */
/*
* Copyright (c) 2001 Alistair G. Crooks. All rights reserved.
@@ -39,7 +39,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 2001 \
The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: digest.c,v 1.5 2002/12/21 04:06:14 schmonz Exp $");
+__RCSID("$NetBSD: digest.c,v 1.6 2003/06/15 00:42:29 atatat Exp $");
#endif
@@ -60,165 +60,50 @@ __RCSID("$NetBSD: digest.c,v 1.5 2002/12/21 04:06:14 schmonz Exp $");
#include <unistd.h>
#endif
-/* perform an md5 digest, and print the results if successful */
-static int
-md5_digest_file(char *fn)
-{
- MD5_CTX m;
- char in[BUFSIZ * 20];
- char digest[33];
- int cc;
-
- if (fn == NULL) {
- MD5Init(&m);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- MD5Update(&m, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", MD5End(&m, digest));
- } else {
- if (MD5File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("MD5 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
-/* perform an sha1 digest, and print the results if successful */
-static int
-sha1_digest_file(char *fn)
-{
- SHA1_CTX sha;
- char in[BUFSIZ * 20];
- char digest[41];
- int cc;
-
- if (fn == NULL) {
- SHA1Init(&sha);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- SHA1Update(&sha, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", SHA1End(&sha, digest));
- } else {
- if (SHA1File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("SHA1 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
-/* perform an ripemd160 digest, and print the results if successful */
-static int
-rmd160_digest_file(char *fn)
-{
- RMD160_CTX rmd;
- char in[BUFSIZ * 20];
- char digest[41];
- int cc;
-
- if (fn == NULL) {
- RMD160Init(&rmd);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- RMD160Update(&rmd, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", RMD160End(&rmd, digest));
- } else {
- if (RMD160File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("RMD160 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
-/* perform a sha256 digest, and print the results if successful */
-static int
-sha256_digest_file(char *fn)
-{
- SHA256_CTX sha256;
- char in[BUFSIZ * 20];
- char digest[65];
- int cc;
-
- if (fn == NULL) {
- SHA256_Init(&sha256);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- SHA256_Update(&sha256, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", SHA256_End(&sha256, digest));
- } else {
- if (SHA256_File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("SHA256 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
-/* perform a sha384 digest, and print the results if successful */
-static int
-sha384_digest_file(char *fn)
-{
- SHA384_CTX sha384;
- char in[BUFSIZ * 20];
- char digest[97];
- int cc;
-
- if (fn == NULL) {
- SHA384_Init(&sha384);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- SHA384_Update(&sha384, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", SHA384_End(&sha384, digest));
- } else {
- if (SHA384_File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("SHA384 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
-/* perform a sha512 digest, and print the results if successful */
-static int
-sha512_digest_file(char *fn)
-{
- SHA512_CTX sha512;
- char in[BUFSIZ * 20];
- char digest[129];
- int cc;
-
- if (fn == NULL) {
- SHA512_Init(&sha512);
- while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
- SHA512_Update(&sha512, (u_char *)in, (unsigned) cc);
- }
- (void) printf("%s\n", SHA512_End(&sha512, digest));
- } else {
- if (SHA512_File(fn, digest) == NULL) {
- return 0;
- }
- (void) printf("SHA512 (%s) = %s\n", fn, digest);
- }
- return 1;
-}
-
+typedef void (*HASH_init)(void *);
+typedef void (*HASH_update)(void *, const unsigned char *, unsigned int);
+typedef char *(*HASH_end)(void *, char *);
+typedef char *(*HASH_file)(char *, char *);
+
/* this struct defines a message digest algorithm */
typedef struct alg_t {
- const char *name; /* algorithm name */
- int (*func)(char *); /* function to call */
+ const char *name;
+ int hash_len;
+ HASH_init hash_init;
+ HASH_update hash_update;
+ HASH_end hash_end;
+ HASH_file hash_file;
+ union {
+ MD5_CTX m;
+ SHA1_CTX sha;
+ RMD160_CTX rmd;
+ SHA256_CTX sha256;
+ SHA384_CTX sha384;
+ SHA512_CTX sha512;
+ } hash_ctx, hash_ctx2;
} alg_t;
/* list of supported message digest algorithms */
static alg_t algorithms[] = {
- { "md5", md5_digest_file },
- { "rmd160", rmd160_digest_file },
- { "sha1", sha1_digest_file },
- { "sha256", sha256_digest_file },
- { "sha384", sha384_digest_file },
- { "sha512", sha512_digest_file },
- { NULL }
+ { "MD5", 16,
+ (HASH_init) MD5Init, (HASH_update) MD5Update,
+ (HASH_end) MD5End, (HASH_file) MD5File },
+ { "RMD160", 20,
+ (HASH_init) RMD160Init, (HASH_update) RMD160Update,
+ (HASH_end) RMD160End, (HASH_file) RMD160File },
+ { "SHA1", 20,
+ (HASH_init) SHA1Init, (HASH_update) SHA1Update,
+ (HASH_end) SHA1End, (HASH_file) SHA1File },
+ { "SHA256", SHA256_DIGEST_LENGTH,
+ (HASH_init) SHA256_Init, (HASH_update) SHA256_Update,
+ (HASH_end) SHA256_End, (HASH_file) SHA256_File },
+ { "SHA384", SHA384_DIGEST_LENGTH,
+ (HASH_init) SHA384_Init, (HASH_update) SHA384_Update,
+ (HASH_end) SHA384_End, (HASH_file) SHA384_File },
+ { "SHA512", SHA512_DIGEST_LENGTH,
+ (HASH_init) SHA512_Init, (HASH_update) SHA512_Update,
+ (HASH_end) SHA512_End, (HASH_file) SHA512_File },
+ { NULL }
};
/* find an algorithm, given a name */
@@ -232,6 +117,34 @@ find_algorithm(const char *a)
return (alg->name) ? alg : NULL;
}
+/* compute a digest, and print the results if successful */
+static int
+digest_file(char *fn, alg_t *alg)
+{
+ char in[BUFSIZ * 20];
+ char *digest;
+ int cc, rc;
+
+ digest = malloc(alg->hash_len * 2 + 1);
+
+ if (fn == NULL) {
+ (*alg->hash_init)(&alg->hash_ctx);
+ while ((cc = read(STDIN_FILENO, in, sizeof(in))) > 0) {
+ (*alg->hash_update)(&alg->hash_ctx, (u_char *)in,
+ (unsigned) cc);
+ }
+ (void) printf("%s\n", (*alg->hash_end)(&alg->hash_ctx, digest));
+ rc = 1;
+ } else {
+ if ((*alg->hash_file)(fn, digest) == NULL) {
+ rc = 0;
+ } else {
+ (void) printf("%s (%s) = %s\n", alg->name, fn, digest);
+ rc = 1;
+ }
+ }
+}
+
int
main(int argc, char **argv)
{
@@ -249,23 +162,28 @@ main(int argc, char **argv)
return EXIT_SUCCESS;
}
}
- if (argc == optind) {
+ argc -= optind;
+ argv += optind;
+
+ if (argc == 0) {
(void) fprintf(stderr, "Usage: %s algorithm [file...]\n", *argv);
return EXIT_FAILURE;
}
- if ((alg = find_algorithm(argv[optind])) == NULL) {
- (void) fprintf(stderr, "No such algorithm `%s'\n", argv[optind]);
+ if ((alg = find_algorithm(argv[0])) == NULL) {
+ (void) fprintf(stderr, "No such algorithm `%s'\n", argv[0]);
exit(EXIT_FAILURE);
}
+ argc--;
+ argv++;
rval = EXIT_SUCCESS;
- if (argc == optind + 1) {
- if (!(*alg->func)(NULL)) {
+ if (argc == 0) {
+ if (!digest_file(NULL, alg)) {
(void) fprintf(stderr, "stdin\n");
rval = EXIT_FAILURE;
}
} else {
- for (i = optind + 1 ; i < argc ; i++) {
- if (!(*alg->func)(argv[i])) {
+ for (i = 0 ; i < argc ; i++) {
+ if (!digest_file(argv[i], alg)) {
(void) fprintf(stderr, "%s\n", argv[i]);
rval = EXIT_FAILURE;
}