1 1.10 christos /* $NetBSD: md5.c,v 1.10 2008/12/29 00:51:29 christos Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /* 4 1.1 thorpej * MDDRIVER.C - test driver for MD2, MD4 and MD5 5 1.1 thorpej */ 6 1.1 thorpej 7 1.1 thorpej /* 8 1.1 thorpej * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All 9 1.1 thorpej * rights reserved. 10 1.1 thorpej * 11 1.1 thorpej * RSA Data Security, Inc. makes no representations concerning either 12 1.1 thorpej * the merchantability of this software or the suitability of this 13 1.1 thorpej * software for any particular purpose. It is provided "as is" 14 1.1 thorpej * without express or implied warranty of any kind. 15 1.1 thorpej * 16 1.1 thorpej * These notices must be retained in any copies of any part of this 17 1.1 thorpej * documentation and/or software. 18 1.1 thorpej */ 19 1.1 thorpej 20 1.5 jmc #if HAVE_NBTOOL_CONFIG_H 21 1.5 jmc #include "nbtool_config.h" 22 1.5 jmc #endif 23 1.5 jmc 24 1.2 lukem #include <sys/cdefs.h> 25 1.4 bjh21 #if defined(__RCSID) && !defined(lint) 26 1.10 christos __RCSID("$NetBSD: md5.c,v 1.10 2008/12/29 00:51:29 christos Exp $"); 27 1.2 lukem #endif /* not lint */ 28 1.2 lukem 29 1.1 thorpej #include <sys/types.h> 30 1.1 thorpej 31 1.1 thorpej #include <err.h> 32 1.1 thorpej #include <md5.h> 33 1.1 thorpej #include <stdio.h> 34 1.1 thorpej #include <string.h> 35 1.1 thorpej #include <time.h> 36 1.1 thorpej 37 1.8 xtraeme void MD5Filter(int); 38 1.8 xtraeme void MD5String(const char *); 39 1.8 xtraeme void MD5TestSuite(void); 40 1.8 xtraeme void MD5TimeTrial(void); 41 1.3 atatat 42 1.3 atatat #ifndef HASHTYPE 43 1.3 atatat #define HASHTYPE "MD5" 44 1.3 atatat #endif 45 1.3 atatat 46 1.3 atatat #ifndef HASHLEN 47 1.3 atatat #define HASHLEN 32 48 1.3 atatat #endif 49 1.2 lukem 50 1.1 thorpej /* 51 1.1 thorpej * Length of test block, number of test blocks. 52 1.1 thorpej */ 53 1.1 thorpej #define TEST_BLOCK_LEN 1000 54 1.1 thorpej #define TEST_BLOCK_COUNT 1000 55 1.1 thorpej 56 1.1 thorpej /* 57 1.1 thorpej * Digests a string and prints the result. 58 1.1 thorpej */ 59 1.1 thorpej void 60 1.6 xtraeme MD5String(const char *string) 61 1.1 thorpej { 62 1.1 thorpej unsigned int len = strlen(string); 63 1.3 atatat char buf[HASHLEN + 1]; 64 1.1 thorpej 65 1.3 atatat printf("%s (\"%s\") = %s\n", HASHTYPE, string, 66 1.9 elad MD5Data((const unsigned char *)string, len, buf)); 67 1.1 thorpej } 68 1.1 thorpej 69 1.1 thorpej /* 70 1.1 thorpej * Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks. 71 1.1 thorpej */ 72 1.1 thorpej void 73 1.6 xtraeme MD5TimeTrial(void) 74 1.1 thorpej { 75 1.1 thorpej MD5_CTX context; 76 1.1 thorpej time_t endTime, startTime; 77 1.1 thorpej unsigned char block[TEST_BLOCK_LEN]; 78 1.1 thorpej unsigned int i; 79 1.3 atatat char *p, buf[HASHLEN + 1]; 80 1.1 thorpej 81 1.3 atatat printf("%s time trial. Digesting %d %d-byte blocks ...", HASHTYPE, 82 1.1 thorpej TEST_BLOCK_LEN, TEST_BLOCK_COUNT); 83 1.1 thorpej fflush(stdout); 84 1.1 thorpej 85 1.1 thorpej /* Initialize block */ 86 1.1 thorpej for (i = 0; i < TEST_BLOCK_LEN; i++) 87 1.1 thorpej block[i] = (unsigned char) (i & 0xff); 88 1.1 thorpej 89 1.1 thorpej /* Start timer */ 90 1.1 thorpej time(&startTime); 91 1.1 thorpej 92 1.1 thorpej /* Digest blocks */ 93 1.1 thorpej MD5Init(&context); 94 1.1 thorpej for (i = 0; i < TEST_BLOCK_COUNT; i++) 95 1.1 thorpej MD5Update(&context, block, TEST_BLOCK_LEN); 96 1.1 thorpej p = MD5End(&context,buf); 97 1.1 thorpej 98 1.1 thorpej /* Stop timer */ 99 1.1 thorpej time(&endTime); 100 1.1 thorpej 101 1.1 thorpej printf(" done\n"); 102 1.1 thorpej printf("Digest = %s\n", p); 103 1.1 thorpej printf("Time = %ld seconds\n", (long) (endTime - startTime)); 104 1.1 thorpej 105 1.1 thorpej /* 106 1.1 thorpej * Be careful that endTime-startTime is not zero. 107 1.1 thorpej * (Bug fix from Ric * Anderson, ric (at) Artisoft.COM.) 108 1.1 thorpej */ 109 1.10 christos printf("Speed = %lld bytes/second\n", 110 1.10 christos (long long) TEST_BLOCK_LEN * TEST_BLOCK_COUNT / 111 1.1 thorpej ((endTime - startTime) != 0 ? (endTime - startTime) : 1)); 112 1.1 thorpej } 113 1.1 thorpej 114 1.1 thorpej /* 115 1.1 thorpej * Digests a reference suite of strings and prints the results. 116 1.1 thorpej */ 117 1.1 thorpej void 118 1.6 xtraeme MD5TestSuite(void) 119 1.1 thorpej { 120 1.3 atatat printf("%s test suite:\n", HASHTYPE); 121 1.1 thorpej 122 1.3 atatat MD5String(""); 123 1.3 atatat MD5String("a"); 124 1.3 atatat MD5String("abc"); 125 1.3 atatat MD5String("message digest"); 126 1.3 atatat MD5String("abcdefghijklmnopqrstuvwxyz"); 127 1.3 atatat MD5String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); 128 1.3 atatat MD5String 129 1.1 thorpej ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); 130 1.3 atatat MD5String 131 1.1 thorpej ("1234567890123456789012345678901234567890\ 132 1.1 thorpej 1234567890123456789012345678901234567890"); 133 1.1 thorpej } 134 1.1 thorpej 135 1.1 thorpej /* 136 1.1 thorpej * Digests the standard input and prints the result. 137 1.1 thorpej */ 138 1.1 thorpej void 139 1.7 xtraeme MD5Filter(int pipe) 140 1.1 thorpej { 141 1.1 thorpej MD5_CTX context; 142 1.9 elad size_t len; 143 1.2 lukem unsigned char buffer[BUFSIZ]; 144 1.3 atatat char buf[HASHLEN + 1]; 145 1.1 thorpej 146 1.1 thorpej MD5Init(&context); 147 1.9 elad while ((len = fread(buffer, (size_t)1, (size_t)BUFSIZ, stdin)) > 0) { 148 1.9 elad if (pipe && (len != fwrite(buffer, (size_t)1, len, stdout))) 149 1.1 thorpej err(1, "stdout"); 150 1.9 elad MD5Update(&context, buffer, (unsigned int)len); 151 1.1 thorpej } 152 1.1 thorpej printf("%s\n", MD5End(&context,buf)); 153 1.1 thorpej } 154