diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-03 22:08:28 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-03 22:08:28 +0000 |
commit | 922fa08b4ed7e47e63768a64bf4432302b3ffd83 (patch) | |
tree | 354593ba4925de4693d189dacfac06b944dc06e4 /sbin | |
parent | 7e9ee52ffdf9ba38ba2d4af80afabcaff33b817a (diff) |
Added md5 utility needed by the "ports" system. From FreeBSD
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/Makefile | 9 | ||||
-rw-r--r-- | sbin/md5/Makefile | 6 | ||||
-rw-r--r-- | sbin/md5/global.h | 32 | ||||
-rw-r--r-- | sbin/md5/md5.1 | 48 | ||||
-rw-r--r-- | sbin/md5/md5.c | 174 |
5 files changed, 264 insertions, 5 deletions
diff --git a/sbin/Makefile b/sbin/Makefile index 312cadd00da..78f737c30c0 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -1,14 +1,13 @@ -# $OpenBSD: Makefile,v 1.10 1996/05/22 11:23:51 deraadt Exp $ +# $OpenBSD: Makefile,v 1.11 1996/06/03 22:08:24 niklas Exp $ # $NetBSD: Makefile,v 1.29 1996/05/14 17:39:21 ws Exp $ -# @(#)Makefile 8.5 (Berkeley) 3/31/94 # Not ported: XNSrouted enpload scsiformat startslip # Missing: icheck ncheck SUBDIR= badsect disklabel ccdconfig dmesg fastboot ifconfig init ipf ipfstat \ - ipnat kbd mknod modload modunload mount mountd nfsd nfsiod nologin \ - ping quotacheck reboot route routed savecore shutdown slattach \ - swapon ttyflags umount + ipnat kbd md5 mknod modload modunload mount mountd nfsd nfsiod \ + nologin ping quotacheck reboot route routed savecore shutdown \ + slattach swapon ttyflags umount # support for various file systems SUBDIR+= mount_ados diff --git a/sbin/md5/Makefile b/sbin/md5/Makefile new file mode 100644 index 00000000000..de260b3dfa2 --- /dev/null +++ b/sbin/md5/Makefile @@ -0,0 +1,6 @@ +# $OpenBSD: Makefile,v 1.1 1996/06/03 22:08:26 niklas Exp $ + +PROG= md5 +SRCS= md5.c + +.include <bsd.prog.mk> diff --git a/sbin/md5/global.h b/sbin/md5/global.h new file mode 100644 index 00000000000..df7a3603f6d --- /dev/null +++ b/sbin/md5/global.h @@ -0,0 +1,32 @@ +/* $OpenBSD: global.h,v 1.1 1996/06/03 22:08:26 niklas Exp $ */ + +/* GLOBAL.H - RSAREF types and constants + */ + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. +The following makes PROTOTYPES default to 0 if it has not already + been defined with C compiler flags. + */ +#ifndef PROTOTYPES +#define PROTOTYPES 0 +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. +If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. + */ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif diff --git a/sbin/md5/md5.1 b/sbin/md5/md5.1 new file mode 100644 index 00000000000..a43a0bea40a --- /dev/null +++ b/sbin/md5/md5.1 @@ -0,0 +1,48 @@ +.\" $OpenBSD: md5.1,v 1.1 1996/06/03 22:08:26 niklas Exp $ +.\" +.TH MD5 1 "Feb 14, 1994" +.SH NAME +md5 \- calculate a message-digest fingerprint (checksum) for a file +.SH SYNOPSIS +.B md5 +[ -p | -t | -x | -sstring | filename(s) ] +.SH DESCRIPTION +.B md5 +takes as input a message of arbitrary length and produces +as output a 128-bit "fingerprint" or "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 "compressed" in a secure manner before being +encrypted with a private (secret) key under a public-key cryptosystem +such as +.I RSA. +.SH OPTIONS +The following four options may be used in any combination, except +that +.B "filename(s)" +must be the last objects on the command line. +.in +5 +.PP +.B -sstring +prints a checksum of the given "string". +.PP +.B -p +echos stdin to stdout and appends the MD5 sum to stdout. +.PP +.B -t +runs a built-in time trial. +.PP +.B -x +runs a built-in test script. +.PP +.B filename(s) +prints a checksum(s) for each of the files. +.SH "SEE ALSO" +.BR cksum (1) +.PP +RFC 1321 describes in detail the MD2, MD4, and MD5 message-digest algorithms. +.SH ACKNOWLEDGEMENTS +This program is placed in the public domain for free general use by +RSA Data Security. diff --git a/sbin/md5/md5.c b/sbin/md5/md5.c new file mode 100644 index 00000000000..fe03270ac48 --- /dev/null +++ b/sbin/md5/md5.c @@ -0,0 +1,174 @@ +/* + * $OpenBSD: md5.c,v 1.1 1996/06/03 22:08:27 niklas 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. + */ + +#include <stdio.h> +#include <time.h> +#include <string.h> +#include "global.h" +#include <md5.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)); + +/* 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 i; + char *p; + char buf[33]; + + if (argc > 1) + for (i = 1; i < argc; i++) + if (argv[i][0] == '-' && argv[i][1] == 's') + MDString(argv[i] + 2); + else if (strcmp(argv[i], "-t") == 0) + MDTimeTrial(); + else if (strcmp(argv[i], "-p") == 0) + MDFilter(1); + else if (strcmp(argv[i], "-x") == 0) + MDTestSuite(); + else { + p = MD5File(argv[i],buf); + if (!p) + perror(argv[i]); + else + printf("MD5 (%s) = %s\n", argv[i], p); + } + 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_LEN, TEST_BLOCK_COUNT); + + /* 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(int pipe) +{ + MD5_CTX context; + int len; + unsigned char buffer[BUFSIZ], digest[16]; + char buf[33]; + + MD5Init(&context); + while (len = fread(buffer, 1, BUFSIZ, stdin)) { + if(pipe && (len != fwrite(buffer, 1, len, stdout))) { + perror("stdout"); + exit(1); + } + MD5Update(&context, buffer, len); + } + printf("%s\n", MD5End(&context,buf)); +} |