summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorNiklas Hallqvist <niklas@cvs.openbsd.org>1996-06-03 22:08:28 +0000
committerNiklas Hallqvist <niklas@cvs.openbsd.org>1996-06-03 22:08:28 +0000
commit922fa08b4ed7e47e63768a64bf4432302b3ffd83 (patch)
tree354593ba4925de4693d189dacfac06b944dc06e4 /sbin
parent7e9ee52ffdf9ba38ba2d4af80afabcaff33b817a (diff)
Added md5 utility needed by the "ports" system. From FreeBSD
Diffstat (limited to 'sbin')
-rw-r--r--sbin/Makefile9
-rw-r--r--sbin/md5/Makefile6
-rw-r--r--sbin/md5/global.h32
-rw-r--r--sbin/md5/md5.148
-rw-r--r--sbin/md5/md5.c174
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));
+}