diff options
Diffstat (limited to 'security/digest/files/digest.c')
-rw-r--r-- | security/digest/files/digest.c | 96 |
1 files changed, 85 insertions, 11 deletions
diff --git a/security/digest/files/digest.c b/security/digest/files/digest.c index f5538b998dc7..1ad4cd3cd7d6 100644 --- a/security/digest/files/digest.c +++ b/security/digest/files/digest.c @@ -1,5 +1,4 @@ -/* $NetBSD: digest.c,v 1.1.1.1 2001/03/06 11:21:04 agc Exp $ */ -/* $FreeBSD$ */ +/* $NetBSD: digest.c,v 1.3 2001/07/09 21:42:30 hubertf Exp $ */ /* * Copyright (c) 2001 Alistair G. Crooks. All rights reserved. @@ -31,22 +30,21 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include <sys/cdefs.h> #ifndef lint __COPYRIGHT("@(#) Copyright (c) 2001 \ The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: digest.c,v 1.1.1.1 2001/03/06 11:21:04 agc Exp $"); +__RCSID("$NetBSD: digest.c,v 1.3 2001/07/09 21:42:30 hubertf Exp $"); #endif #include <sys/types.h> -#include <err.h> #include <locale.h> -#include "md5.h" -#include "rmd160.h" -#include "sha1.h" +#include <md5.h> +#include <rmd160.h> +#include <sha1.h> +#include <sha2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -124,6 +122,78 @@ rmd160_digest_file(char *fn) 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; +} + /* this struct defines a message digest algorithm */ typedef struct alg_t { const char *name; /* algorithm name */ @@ -135,6 +205,9 @@ 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 } }; @@ -169,18 +242,19 @@ main(int argc, char **argv) return EXIT_FAILURE; } if ((alg = find_algorithm(argv[optind])) == NULL) { - errx(EXIT_FAILURE, "No such algorithm `%s'", argv[optind]); + (void) fprintf(stderr, "No such algorithm `%s'\n", argv[optind]); + exit(EXIT_FAILURE); } rval = EXIT_SUCCESS; if (argc == optind + 1) { if (!(*alg->func)(NULL)) { - warn("stdin"); + (void) fprintf(stderr, "stdin\n"); rval = EXIT_FAILURE; } } else { for (i = optind + 1 ; i < argc ; i++) { if (!(*alg->func)(argv[i])) { - warn("%s", argv[i]); + (void) fprintf(stderr, "%s\n", argv[i]); rval = EXIT_FAILURE; } } |