Index: head/sbin/md5/md5.1 =================================================================== --- head/sbin/md5/md5.1 (revision 37420) +++ head/sbin/md5/md5.1 (revision 37421) @@ -1,54 +1,54 @@ .Dd February 14, 1994 .Dt MD5 1 .Os .Sh NAME .Nm md5 .Nd calculate a message-digest fingerprint (checksum) for a file .Sh SYNOPSIS -.Nm +.Nm md5 .Op Fl ptx .Op Fl s Ar string .Op Ar file ... .Sh DESCRIPTION -.Nm +.Nm Md5 takes as input a message of arbitrary length and produces as output a 128-bit .Dq fingerprint or .Dq message digest of the input. It is conjectured that it is computationally infeasible to produce two messages having the same message digest, or to produce any message having a given prespecified target message digest. The MD5 algorithm is intended for digital signature applications, where a large file must be .Dq compressed in a secure manner before being encrypted with a private .Pq secret key under a public-key cryptosystem such as .Em RSA . .Pp The following four options may be used in any combination and must precede any files named on the command line. The MD5 sum of each file listed on the command line is printed after the options are processed. -.Bl -tag -width Fl +.Bl -tag -width indent .It Fl s Ar string -prints a checksum of the given +Print a checksum of the given .Ar string . .It Fl p -echos stdin to stdout and appends the MD5 sum to stdout. +Echo stdin to stdout and appends the MD5 sum to stdout. .It Fl t -runs a built-in time trial. +Run a built-in time trial. .It Fl x -runs a built-in test script. +Run a built-in test script. .El .Sh SEE ALSO .Xr cksum 1 .Rs .%A R. Rivest .%T The MD5 Message-Digest Algorithm .%O RFC1321 .Re -.Sh ACKNOWLEDGEMENTS +.Sh ACKNOWLEDGMENTS This program is placed in the public domain for free general use by RSA Data Security. Index: head/sbin/md5/md5.c =================================================================== --- head/sbin/md5/md5.c (revision 37420) +++ head/sbin/md5/md5.c (revision 37421) @@ -1,199 +1,197 @@ /* - * $Id: md5.c,v 1.11 1997/12/29 03:40:37 steve Exp $ - * * Derived from: - */ - -/* + * * MDDRIVER.C - test driver for MD2, MD4 and MD5 */ /* * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All * rights reserved. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software for any particular purpose. It is provided "as is" * without express or implied warranty of any kind. * * These notices must be retained in any copies of any part of this * documentation and/or software. */ +#ifndef lint +static const char rcsid[] = + "$Id$"; +#endif /* not lint */ + #include +#include #include - #include -#include #include #include #include "global.h" /* * Length of test block, number of test blocks. */ #define TEST_BLOCK_LEN 1000 #define TEST_BLOCK_COUNT 1000 static void MDString PROTO_LIST((char *)); static void MDTimeTrial PROTO_LIST((void)); static void MDTestSuite PROTO_LIST((void)); static void MDFilter PROTO_LIST((int)); static void usage PROTO_LIST((void)); /* Main driver. Arguments (may be any combination): -sstring - digests string -t - runs time trial -x - runs test script filename - digests file (none) - digests standard input */ int main(argc, argv) int argc; char *argv[]; { int ch; char *p; char buf[33]; if (argc > 1) { while ((ch = getopt(argc, argv, "ps:tx")) != -1) { switch (ch) { case 'p': MDFilter(1); break; case 's': MDString(optarg); break; case 't': MDTimeTrial(); break; case 'x': MDTestSuite(); break; default: usage(); } } while (optind < argc) { p = MD5File(argv[optind], buf); if (!p) - perror(argv[optind]); + warn("%s", argv[optind]); else printf("MD5 (%s) = %s\n", argv[optind], p); optind++; } } else MDFilter(0); return (0); } /* * Digests a string and prints the result. */ static void MDString(string) char *string; { unsigned int len = strlen(string); char buf[33]; printf("MD5 (\"%s\") = %s\n", string, MD5Data(string, len, buf)); } /* * Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks. */ static void MDTimeTrial() { MD5_CTX context; time_t endTime, startTime; unsigned char block[TEST_BLOCK_LEN]; unsigned int i; char *p, buf[33]; printf ("MD5 time trial. Digesting %d %d-byte blocks ...", TEST_BLOCK_COUNT, TEST_BLOCK_LEN); /* Initialize block */ for (i = 0; i < TEST_BLOCK_LEN; i++) block[i] = (unsigned char) (i & 0xff); /* Start timer */ time(&startTime); /* Digest blocks */ MD5Init(&context); for (i = 0; i < TEST_BLOCK_COUNT; i++) MD5Update(&context, block, TEST_BLOCK_LEN); p = MD5End(&context,buf); /* Stop timer */ time(&endTime); printf(" done\n"); printf("Digest = %s", p); printf("\nTime = %ld seconds\n", (long) (endTime - startTime)); /* Be careful that endTime-startTime is not zero. (Bug fix from Ric * Anderson, ric@Artisoft.COM.) */ printf ("Speed = %ld bytes/second\n", (long) TEST_BLOCK_LEN * (long) TEST_BLOCK_COUNT / ((endTime - startTime) != 0 ? (endTime - startTime) : 1)); } /* * Digests a reference suite of strings and prints the results. */ static void MDTestSuite() { printf("MD5 test suite:\n"); MDString(""); MDString("a"); MDString("abc"); MDString("message digest"); MDString("abcdefghijklmnopqrstuvwxyz"); MDString ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); MDString ("1234567890123456789012345678901234567890\ 1234567890123456789012345678901234567890"); } /* * Digests the standard input and prints the result. */ static void MDFilter(pipe) int pipe; { MD5_CTX context; int len; unsigned char buffer[BUFSIZ]; char buf[33]; MD5Init(&context); while ((len = fread(buffer, 1, BUFSIZ, stdin))) { - if(pipe && (len != fwrite(buffer, 1, len, stdout))) { - perror("stdout"); - exit(1); - } + if(pipe && (len != fwrite(buffer, 1, len, stdout))) + err(1, "stdout"); MD5Update(&context, buffer, len); } printf("%s\n", MD5End(&context,buf)); } static void usage() { fprintf(stderr, "usage: md5 [-ptx] [-s string] [files ...]\n"); exit(1); }