unsigned int len; {
unsigned int i;
for (i = 0; i < len; i++)
((char *)output)[i] = (char)value; }
A.4 mddriver.c
/* MDDRIVER.C - MD2, MD4 and MD5²âÊÔ³ÌÐò */
/* RSAÊý¾Ý°²È«¹«Ë¾£¨RSA Data Security, Inc.£©´ÓÀ´Ã»ÓгöÓÚÈκÎÌØ¶¨Ä¿µÄ³ÂÊö¹ý¹ØÓÚ´ËÈí¼þµÄ¿ÉÂòÐÔºÍʵÓÃÐÔ£¬ËüÌṩÁË¡°as is¡±,ûÓбí´ï»ò°µÊ¾¹ýÈκÎÀíÓÉ¡£´ËÉùÃ÷±ØÐëÔÚÈκδËÎļþºÍÈí¼þµÄÈκο½±´Öб£Áô¡£*/ /* Èç¹ûûÓж¨ÒåC±àÒë±êÖ¾µÄÖµ£¬ÔòMD5ȱʡ״̬ÏÂΪMD5 */ #ifndef MD
#define MD MD5 #endif
#include
#include \#endif
#if MD == 4
#include \#endif
#if MD == 5
#include \#endif
/* ²âÊÔ·Ö×鳤¶ÈºÍÊýÁ¿ */ #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 MDFile PROTO_LIST ((char *)); static void MDFilter PROTO_LIST ((void));
static void MDPrint PROTO_LIST ((unsigned char [16]));
#if MD == 2
#define MD_CTX MD2_CTX #define MDInit MD2Init #define MDUpdate MD2Update #define MDFinal MD2Final #endif
#if MD == 4
#define MD_CTX MD4_CTX #define MDInit MD4Init #define MDUpdate MD4Update #define MDFinal MD4Final #endif
#if MD == 5
#define MD_CTX MD5_CTX #define MDInit MD5Init #define MDUpdate MD5Update #define MDFinal MD5Final #endif
/* Ö÷³ÌÐò. ±äÁ¿:
-sstring ¨C ÕªÒª×Ö·û´® -t - ÔËÐÐʱ¼ä²âÊÔ -x - ÔËÐвâÊԽű¾ filename ¨C ÕªÒªÎļþ (none) - ÕªÒª±ê×¼ÊäÈë */
int main (argc, argv) int argc;
char *argv[]; {
int i;
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], \ MDTimeTrial ();
else if (strcmp (argv[i], \ MDTestSuite (); else
MDFile (argv[i]);
else
MDFilter ();
return (0); }
/* ¼ÆËã×Ö·û´®µÄÕªÒª²¢´òÓ¡ÆäÖµ */ static void MDString (string) char *string; {
MD_CTX context;
unsigned char digest[16];
unsigned int len = strlen (string);
MDInit (&context);
MDUpdate (&context, string, len); MDFinal (digest, &context);
printf (\ MDPrint (digest); printf (\}
/* ²âÊÔ¼ÆËã TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte ·Ö×éÕªÒªµÄʱ¼ä */
static void MDTimeTrial () {
MD_CTX context;
time_t endTime, startTime;
unsigned char block[TEST_BLOCK_LEN], digest[16]; unsigned int i;
printf
(\ TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
/* ³õʼ»¯·Ö×é*/
for (i = 0; i < TEST_BLOCK_LEN; i++) block[i] = (unsigned char)(i & 0xff);
/* ¿ªÊ¼Ê±ÖÓ */ time (&startTime);
/* ÕªÒª·Ö×é */
MDInit (&context);
for (i = 0; i < TEST_BLOCK_COUNT; i++) MDUpdate (&context, block, TEST_BLOCK_LEN); MDFinal (digest, &context);
/* ֹͣʱÖÓ */ time (&endTime);
printf (\ printf (\ MDPrint (digest);
printf (\ printf
(\
(long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime)); }
/* ¼ÆËãÒ»¸ö²Î¿¼×é¼þ´®µÄÕªÒª²¢´òÓ¡½á¹û*/ static void MDTestSuite () {
printf (\
MDString (\ MDString (\ MDString (\
MDString (\
MDString (\ MDString
(\ MDString
(\1234567890123456789012345678901234567890\}
/*¼ÆËãÒ»¸öÎļþµÄÕªÒª²¢´òÓ¡½á¹û */ static void MDFile (filename) char *filename; {
FILE *file; MD_CTX context; int len;
unsigned char buffer[1024], digest[16];
if ((file = fopen (filename, \
Ïà¹ØÍÆ¼ö£º