home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / misc / md5 / md5.c < prev    next >
C/C++ Source or Header  |  1998-04-13  |  4KB  |  201 lines

  1. /*
  2.  * $Id: md5.c,v 1.7.2.2 1998/03/06 08:15:33 jkh Exp $
  3.  *
  4.  * Derived from:
  5.  */
  6.  
  7. /*
  8.  * MDDRIVER.C - test driver for MD2, MD4 and MD5
  9.  */
  10.  
  11. /*
  12.  *  Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
  13.  *  rights reserved.
  14.  *
  15.  *  RSA Data Security, Inc. makes no representations concerning either
  16.  *  the merchantability of this software or the suitability of this
  17.  *  software for any particular purpose. It is provided "as is"
  18.  *  without express or implied warranty of any kind.
  19.  *
  20.  *  These notices must be retained in any copies of any part of this
  21.  *  documentation and/or software.
  22.  */
  23.  
  24. #include <sys/types.h>
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <time.h>
  30. #include <unistd.h>
  31.  
  32. #include "md5.h"
  33. #include "global.h"
  34.  
  35. /*
  36.  * Length of test block, number of test blocks.
  37.  */
  38. #define TEST_BLOCK_LEN 1000
  39. #define TEST_BLOCK_COUNT 1000
  40.  
  41. static void MDString PROTO_LIST((char *));
  42. static void MDTimeTrial PROTO_LIST((void));
  43. static void MDTestSuite PROTO_LIST((void));
  44. static void MDFilter PROTO_LIST((int));
  45. static void usage PROTO_LIST((void));
  46.  
  47. /* Main driver.
  48.  
  49. Arguments (may be any combination):
  50.   -sstring - digests string
  51.   -t       - runs time trial
  52.   -x       - runs test script
  53.   filename - digests file
  54.   (none)   - digests standard input
  55.  */
  56. int
  57. main(argc, argv)
  58.     int     argc;
  59.     char   *argv[];
  60. {
  61.     int     ch;
  62.     char   *p;
  63.     char    buf[33];
  64.  
  65.     if (argc > 1) {
  66.         while ((ch = getopt(argc, argv, "ps:tx")) != -1) {
  67.             switch (ch) {
  68.             case 'p':
  69.                 MDFilter(1);
  70.                 break;
  71.             case 's':
  72.                 MDString(optarg);
  73.                 break;
  74.             case 't':
  75.                 MDTimeTrial();
  76.                 break;
  77.             case 'x':
  78.                 MDTestSuite();
  79.                 break;
  80.             default:
  81.                 usage();
  82.             }
  83.         }
  84.         while (optind < argc) {
  85.             p = MD5File(argv[optind], buf);
  86.             if (!p)
  87.                 perror(argv[optind]);
  88.             else
  89.                 printf("MD5 (%s) = %s\n", argv[optind], p);
  90.             optind++;
  91.         }
  92.     } else
  93.         MDFilter(0);
  94.  
  95.     return (0);
  96. }
  97. /*
  98.  * Digests a string and prints the result.
  99.  */
  100. static void
  101. MDString(string)
  102.     unsigned char   *string;
  103. {
  104.     unsigned int len = strlen(string);
  105.     char buf[33];
  106.  
  107.     printf("MD5 (\"%s\") = %s\n", string, MD5Data(string, len, buf));
  108. }
  109. /*
  110.  * Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
  111.  */
  112. static void
  113. MDTimeTrial()
  114. {
  115.     MD5_CTX context;
  116.     time_t  endTime, startTime;
  117.     unsigned char block[TEST_BLOCK_LEN];
  118.     unsigned int i;
  119.     char   *p, buf[33];
  120.  
  121.     printf
  122.         ("MD5 time trial. Digesting %d %d-byte blocks ...",
  123.         TEST_BLOCK_COUNT, TEST_BLOCK_LEN);
  124.  
  125.     /* Initialize block */
  126.     for (i = 0; i < TEST_BLOCK_LEN; i++)
  127.         block[i] = (unsigned char) (i & 0xff);
  128.  
  129.     /* Start timer */
  130.     time(&startTime);
  131.  
  132.     /* Digest blocks */
  133.     MD5Init(&context);
  134.     for (i = 0; i < TEST_BLOCK_COUNT; i++)
  135.         MD5Update(&context, block, TEST_BLOCK_LEN);
  136.     p = MD5End(&context,buf);
  137.  
  138.     /* Stop timer */
  139.     time(&endTime);
  140.  
  141.     printf(" done\n");
  142.     printf("Digest = %s", p);
  143.     printf("\nTime = %ld seconds\n", (long) (endTime - startTime));
  144.     /* Be careful that endTime-startTime is not zero. (Bug fix from Ric
  145.      * Anderson, ric@Artisoft.COM.) */
  146.     printf
  147.         ("Speed = %ld bytes/second\n",
  148.         (long) TEST_BLOCK_LEN * (long) TEST_BLOCK_COUNT / ((endTime - startTime) != 0 ? (endTime - startTime) : 1));
  149. }
  150. /*
  151.  * Digests a reference suite of strings and prints the results.
  152.  */
  153. static void
  154. MDTestSuite()
  155. {
  156.  
  157.     printf("MD5 test suite:\n");
  158.  
  159.     MDString("");
  160.     MDString("a");
  161.     MDString("abc");
  162.     MDString("message digest");
  163.     MDString("abcdefghijklmnopqrstuvwxyz");
  164.     MDString
  165.         ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
  166.     MDString
  167.         ("1234567890123456789012345678901234567890\
  168. 1234567890123456789012345678901234567890");
  169. }
  170.  
  171. /*
  172.  * Digests the standard input and prints the result.
  173.  */
  174. static void
  175. MDFilter(pipe)
  176.     int pipe;
  177. {
  178.     MD5_CTX context;
  179.     int     len;
  180.     unsigned char buffer[BUFSIZ];
  181.     char buf[33];
  182.  
  183.     MD5Init(&context);
  184.     while ((len = fread(buffer, 1, BUFSIZ, stdin))) {
  185.         if(pipe && (len != fwrite(buffer, 1, len, stdout))) {
  186.             perror("stdout");
  187.             exit(1);
  188.         }
  189.         MD5Update(&context, buffer, len);
  190.     }
  191.     printf("%s\n", MD5End(&context,buf));
  192. }
  193.  
  194. static void
  195. usage()
  196. {
  197.  
  198.     fprintf(stderr, "usage: md5 [-ptx] [-s string] [files ...]\n");
  199.     exit(1);
  200. }
  201.