md5.c revision 8871
138032Speter/*
238032Speter * $Id: md5.c,v 1.4 1995/02/26 02:00:35 phk Exp $
338032Speter *
438032Speter * Derived from:
538032Speter */
638032Speter
738032Speter/*
838032Speter * MDDRIVER.C - test driver for MD2, MD4 and MD5
938032Speter */
1038032Speter
1138032Speter/*
1238032Speter *  Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
1338032Speter *  rights reserved.
1438032Speter *
1538032Speter *  RSA Data Security, Inc. makes no representations concerning either
1638032Speter *  the merchantability of this software or the suitability of this
1738032Speter *  software for any particular purpose. It is provided "as is"
1838032Speter *  without express or implied warranty of any kind.
1938032Speter *
2038032Speter *  These notices must be retained in any copies of any part of this
2138032Speter *  documentation and/or software.
2238032Speter */
2338032Speter
2438032Speter#include <stdio.h>
2538032Speter#include <time.h>
2638032Speter#include <string.h>
2738032Speter#include "global.h"
2838032Speter#include <md5.h>
2938032Speter
3038032Speter/*
3138032Speter * Length of test block, number of test blocks.
3238032Speter */
3338032Speter#define TEST_BLOCK_LEN 1000
3438032Speter#define TEST_BLOCK_COUNT 1000
3538032Speter
3638032Speterstatic void MDString PROTO_LIST((char *));
3738032Speterstatic void MDTimeTrial PROTO_LIST((void));
3838032Speterstatic void MDTestSuite PROTO_LIST((void));
3938032Speterstatic void MDFilter PROTO_LIST((int));
4038032Speter
4138032Speter/* Main driver.
4238032Speter
4338032SpeterArguments (may be any combination):
4438032Speter  -sstring - digests string
4538032Speter  -t       - runs time trial
4638032Speter  -x       - runs test script
4738032Speter  filename - digests file
4838032Speter  (none)   - digests standard input
4938032Speter */
5038032Speterint
5138032Spetermain(argc, argv)
5238032Speter	int     argc;
5338032Speter	char   *argv[];
5438032Speter{
5538032Speter	int     i;
5638032Speter	char   *p;
5738032Speter
5838032Speter	if (argc > 1)
5938032Speter		for (i = 1; i < argc; i++)
6038032Speter			if (argv[i][0] == '-' && argv[i][1] == 's')
6138032Speter				MDString(argv[i] + 2);
6238032Speter			else if (strcmp(argv[i], "-t") == 0)
6338032Speter				MDTimeTrial();
6438032Speter			else if (strcmp(argv[i], "-p") == 0)
6538032Speter				MDFilter(1);
6638032Speter			else if (strcmp(argv[i], "-x") == 0)
6738032Speter				MDTestSuite();
6838032Speter			else {
6938032Speter				p = MD5File(argv[i]);
7038032Speter				if (!p)
7138032Speter					perror(argv[i]);
7238032Speter				else
7338032Speter					printf("MD5 (%s) = %s\n", argv[i], p);
7438032Speter			}
7538032Speter	else
7638032Speter		MDFilter(0);
7738032Speter
7838032Speter	return (0);
7938032Speter}
8038032Speter/*
8138032Speter * Digests a string and prints the result.
8238032Speter */
8338032Speterstatic void
8438032SpeterMDString(string)
8538032Speter	char   *string;
8638032Speter{
8764562Sgshapiro	unsigned int len = strlen(string);
8864562Sgshapiro
8964562Sgshapiro	printf("MD5 (\"%s\") = %s\n", string, MD5Data(string, len));
9064562Sgshapiro}
9164562Sgshapiro/*
9264562Sgshapiro * Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
9364562Sgshapiro */
9464562Sgshapirostatic void
9564562SgshapiroMDTimeTrial()
9664562Sgshapiro{
9764562Sgshapiro	MD5_CTX context;
9864562Sgshapiro	time_t  endTime, startTime;
9964562Sgshapiro	unsigned char block[TEST_BLOCK_LEN];
10064562Sgshapiro	unsigned int i;
10164562Sgshapiro	char   *p;
10264562Sgshapiro
10364562Sgshapiro	printf
10464562Sgshapiro	    ("MD5 time trial. Digesting %d %d-byte blocks ...",
10564562Sgshapiro	    TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
10664562Sgshapiro
10738032Speter	/* Initialize block */
10864562Sgshapiro	for (i = 0; i < TEST_BLOCK_LEN; i++)
10938032Speter		block[i] = (unsigned char) (i & 0xff);
11038032Speter
11138032Speter	/* Start timer */
11238032Speter	time(&startTime);
11338032Speter
11438032Speter	/* Digest blocks */
11538032Speter	MD5Init(&context);
11638032Speter	for (i = 0; i < TEST_BLOCK_COUNT; i++)
11738032Speter		MD5Update(&context, block, TEST_BLOCK_LEN);
11838032Speter	p = MD5End(&context);
11938032Speter
12038032Speter	/* Stop timer */
12138032Speter	time(&endTime);
12238032Speter
12338032Speter	printf(" done\n");
12438032Speter	printf("Digest = %s", p);
12538032Speter	printf("\nTime = %ld seconds\n", (long) (endTime - startTime));
12638032Speter	/* Be careful that endTime-startTime is not zero. (Bug fix from Ric
12738032Speter	 * Anderson, ric@Artisoft.COM.) */
12838032Speter	printf
12938032Speter	    ("Speed = %ld bytes/second\n",
13038032Speter	    (long) TEST_BLOCK_LEN * (long) TEST_BLOCK_COUNT / ((endTime - startTime) != 0 ? (endTime - startTime) : 1));
13138032Speter}
13238032Speter/*
13338032Speter * Digests a reference suite of strings and prints the results.
13438032Speter */
13538032Speterstatic void
13638032SpeterMDTestSuite()
13738032Speter{
13838032Speter	printf("MD5 test suite:\n");
13938032Speter
14038032Speter	MDString("");
14138032Speter	MDString("a");
14238032Speter	MDString("abc");
14338032Speter	MDString("message digest");
14438032Speter	MDString("abcdefghijklmnopqrstuvwxyz");
14538032Speter	MDString
14638032Speter	    ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
14738032Speter	MDString
14864562Sgshapiro	    ("1234567890123456789012345678901234567890\
14938032Speter1234567890123456789012345678901234567890");
15038032Speter}
15138032Speter
15238032Speter/*
15338032Speter * Digests the standard input and prints the result.
15438032Speter */
15538032Speterstatic void
15638032SpeterMDFilter(int pipe)
15764562Sgshapiro{
15864562Sgshapiro	MD5_CTX context;
15964562Sgshapiro	int     len;
16064562Sgshapiro	unsigned char buffer[BUFSIZ], digest[16];
16138032Speter
16238032Speter	MD5Init(&context);
16338032Speter	while (len = fread(buffer, 1, BUFSIZ, stdin)) {
16438032Speter		if(pipe && (len != fwrite(buffer, 1, len, stdout))) {
16538032Speter			perror("stdout");
16638032Speter			exit(1);
16738032Speter		}
16838032Speter		MD5Update(&context, buffer, len);
16938032Speter	}
17038032Speter	printf("%s\n", MD5End(&context));
17138032Speter}
17238032Speter