Date: Thu, 19 Jul 2001 08:40:28 -0700 (PDT) From: Mark Peek <mark@whistle.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/28988: We need more simple message digesting tools Message-ID: <200107191540.f6JFeSS36041@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/28988; it has been noted by GNATS.
From: Mark Peek <mark@whistle.com>
To: freebsd-gnats-submit@freebsd.org
Cc:
Subject: Re: bin/28988: We need more simple message digesting tools
Date: Thu, 19 Jul 2001 08:32:25 -0700
At 11:00 AM -0700 7/16/01, Anders Nordby wrote:
>The following reply was made to PR bin/28988; it has been noted by GNATS.
>
>From: Anders Nordby <anders@fix.no>
>To: Dima Dorfman <dima@unixfreak.org>
>Cc: FreeBSD-gnats-submit@freebsd.org
>Subject: Re: bin/28988: We need more simple message digesting tools
>Date: Mon, 16 Jul 2001 19:57:13 +0200
>
> On Sun, Jul 15, 2001 at 05:26:22AM -0700, Dima Dorfman wrote:
> >> Yes, I know openssl dgst -whatnot can do this. But the md5
>program is heavily
> >> used, and thereby I think we should have sha1 and rmd160 too.
> > Used by whom, and why aren't they using openssl(1)?
>
> MD5 checksums are quite heavily used in FreeBSD, and AFAIK most people
> use the md5 program for generating MD5 fingerprints of files. At least,
> I do, and I haven't heard about anyone using openssl(1) for it in
> FreeBSD until recently. :-)
>
> > The latter is more portable and more up-to-date.
>
> More portable? md5(1) is just a frontend for libmd. If I make md5(1) use
> libcrypto instead, would that be better? And speaking of up-to-date,
> libmd must be the real issue here. It's the library that provides the
> actual message-digest fingerprinting code, and is based on SSLeay. We
> shouldn't be dragging old SSLeay code around when we have OpenSSL in the
> base system.
Over the weekend, I had worked up these patches to md(1) to use
openssl instead of libmd. I was concerned about maintaining
compatibility with the existing md in terms of features/options and
size/location. As has been stated, openssl(1) doesn't have the same
options and is way too big (dynamically linked!) to put into /sbin.
# ls -l /sbin/md5 /usr/bin/openssl
-r-xr-xr-x 1 root wheel 56460 Jul 8 11:36 /sbin/md5
-r-xr-xr-x 1 root wheel 256892 Jul 8 11:38 /usr/bin/openssl
# file /sbin/md5 /usr/bin/openssl
/sbin/md5: ELF 32-bit LSB executable, Intel 80386, version 1
(FreeBSD), statically linked, stripped
/usr/bin/openssl: ELF 32-bit LSB executable, Intel 80386, version 1
(FreeBSD), dynamically linked (uses shared libs), stripped
The patch below is a quick rewrite of md5.c to use libcrypto instead
of libmd. The size is comparable and libcrypto provides a nice speed
increase.
Mark
-----------------------
[/sbin/md5 is the old version and ./md5 is the new version]
# ls -l ./md5 /sbin/md5
-rwxr-xr-x 1 root wheel 57204 Jul 15 13:57 ./md5
-r-xr-xr-x 1 root wheel 56460 Jul 8 11:36 /sbin/md5
# file ./md5 /sbin/md5
./md5: ELF 32-bit LSB executable, Intel 80386, version 1
(FreeBSD), statically linked, stripped
/sbin/md5: ELF 32-bit LSB executable, Intel 80386, version 1
(FreeBSD), statically linked, stripped
# /sbin/md5 -t ; /sbin/md5 -x ; /sbin/md5 -r md5.c Makefile
MD5 time trial. Digesting 100000 10000-byte blocks ... done
Digest = 766a2bb5d24bddae466c572bcabca3ee
Time = 16 seconds
Speed = 62500000 bytes/second
MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5
("12345678901234567890123456789012345678901234567890123456789012345678901234567890")
= 57edf4a22be3c955ac49da2e2107b67a
2a741f9d5f4134df912f3a60a69d471f md5.c
1fc6656efb78f623fdacab2f871c8a82 Makefile
# ./md5 -t ; ./md5 -x ; ./md5 -r md5.c Makefile
MD5 time trial. Digesting 100000 10000-byte blocks ... done
Digest = 766a2bb5d24bddae466c572bcabca3ee
Time = 10 seconds
Speed = 100000000 bytes/second
MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5
("12345678901234567890123456789012345678901234567890123456789012345678901234567890")
= 57edf4a22be3c955ac49da2e2107b67a
2a741f9d5f4134df912f3a60a69d471f md5.c
1fc6656efb78f623fdacab2f871c8a82 Makefile
Index: sbin/md5/Makefile
===================================================================
RCS file: /cvs/freebsd/src/sbin/md5/Makefile,v
retrieving revision 1.6
diff -u -r1.6 Makefile
--- sbin/md5/Makefile 2001/06/22 21:38:28 1.6
+++ sbin/md5/Makefile 2001/07/15 21:03:23
@@ -3,7 +3,7 @@
PROG= md5
-LDADD+= -lmd
+LDADD+= -lcrypto
DPADD+= ${LIBMD}
WARNS?= 2
Index: sbin/md5/md5.c
===================================================================
RCS file: /cvs/freebsd/src/sbin/md5/md5.c,v
retrieving revision 1.25
diff -u -r1.25 md5.c
--- sbin/md5/md5.c 2001/06/29 06:21:57 1.25
+++ sbin/md5/md5.c 2001/07/15 21:03:23
@@ -24,13 +24,15 @@
#include <sys/types.h>
#include <err.h>
-#include <md5.h>
+#include <openssl/md5.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
+#define DIGESTSIZE 16
+#define HEXSIZE (DIGESTSIZE * 2 + 1)
/*
* Length of test block, number of test blocks.
*/
@@ -44,6 +46,8 @@
static void MDTimeTrial(void);
static void MDTestSuite(void);
static void MDFilter(int);
+static char *MDFile(char *, char *);
+static char *Convert2Hex(unsigned char *, char *);
static void usage(void);
/* Main driver.
@@ -60,7 +64,7 @@
{
int ch;
char *p;
- char buf[33];
+ char buf[HEXSIZE];
while ((ch = getopt(argc, argv, "pqrs:tx")) != -1)
switch (ch) {
@@ -90,7 +94,7 @@
if (*argv) {
do {
- p = MD5File(*argv, buf);
+ p = MDFile(*argv, buf);
if (!p)
warn("%s", *argv);
else
@@ -113,15 +117,19 @@
MDString(const char *string)
{
size_t len = strlen(string);
- char buf[33];
+ char digest[DIGESTSIZE];
+ char buf[HEXSIZE];
+ Convert2Hex(MD5(string, len, digest), buf);
+
if (qflag)
- printf("%s\n", MD5Data(string, len, buf));
+ printf("%s\n", buf);
else if (rflag)
- printf("%s \"%s\"\n", MD5Data(string, len, buf), string);
+ printf("%s \"%s\"\n", buf, string);
else
- printf("MD5 (\"%s\") = %s\n", string, MD5Data(string,
len, buf));
+ printf("MD5 (\"%s\") = %s\n", string, buf);
}
+
/*
* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
*/
@@ -132,7 +140,8 @@
time_t endTime, startTime;
unsigned char block[TEST_BLOCK_LEN];
unsigned int i;
- char *p, buf[33];
+ unsigned char digest[DIGESTSIZE];
+ char buf[HEXSIZE];
printf
("MD5 time trial. Digesting %d %d-byte blocks ...",
@@ -147,16 +156,17 @@
time(&startTime);
/* Digest blocks */
- MD5Init(&context);
+ MD5_Init(&context);
for (i = 0; i < TEST_BLOCK_COUNT; i++)
- MD5Update(&context, block, TEST_BLOCK_LEN);
- p = MD5End(&context,buf);
+ MD5_Update(&context, block, TEST_BLOCK_LEN);
+ MD5_Final(digest, &context);
+ Convert2Hex(digest, buf);
/* Stop timer */
time(&endTime);
printf(" done\n");
- printf("Digest = %s", p);
+ printf("Digest = %s", buf);
printf("\nTime = %ld seconds\n", (long) (endTime - startTime));
/* Be careful that endTime-startTime is not zero. (Bug fix from Ric
* Anderson, ric@Artisoft.COM.) */
@@ -194,15 +204,63 @@
MD5_CTX context;
unsigned int len;
unsigned char buffer[BUFSIZ];
- char buf[33];
+ unsigned char digest[DIGESTSIZE];
+ char buf[HEXSIZE];
- MD5Init(&context);
+ MD5_Init(&context);
while ((len = fread(buffer, 1, BUFSIZ, stdin))) {
if (tee && len != fwrite(buffer, 1, len, stdout))
err(1, "stdout");
- MD5Update(&context, buffer, len);
+ MD5_Update(&context, buffer, len);
+ }
+ MD5_Final(digest, &context);
+ Convert2Hex(digest, buf);
+
+ printf("%s\n", buf);
+}
+
+/*
+ * Digests the file and returns the hex string result.
+ */
+static char *
+MDFile(char *filename, char *buf)
+{
+ MD5_CTX context;
+ unsigned int len;
+ unsigned char buffer[BUFSIZ];
+ unsigned char digest[DIGESTSIZE];
+ FILE *fp;
+
+ if ((fp = fopen(filename, "r")) == NULL) {
+ return NULL;
+ }
+ MD5_Init(&context);
+ while ((len = fread(buffer, 1, BUFSIZ, fp))) {
+ MD5_Update(&context, buffer, len);
+ }
+
+ MD5_Final(digest, &context);
+ Convert2Hex(digest, buf);
+
+ return buf;
+}
+
+/*
+ * Convert a digest string into an ascii hex string.
+ */
+static char *
+Convert2Hex(unsigned char *digest, char *buf)
+{
+ static const char hex[]="0123456789abcdef";
+ int i;
+
+ for (i = 0; i < DIGESTSIZE; i++) {
+ buf[i+i] = hex[digest[i] >> 4];
+ buf[i+i+1] = hex[digest[i] & 0x0f];
}
- printf("%s\n", MD5End(&context,buf));
+ buf[i+i] = '\0';
+
+ return buf;
}
static void
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107191540.f6JFeSS36041>
