📄 mddriver.c.bak
字号:
/* MDDRIVER.C - test driver for MD2, MD4 and MD5
*/
/* The following makes MD default to MD5 if it has not already been
defined with C compiler flags.
*/
#ifndef MD
#define MD 5
#endif
#include <stdio.h>
#include <string.h>
#include "global.h"
#include "md5.h"
#include <sys/time.h>
/*定义测试块的长度,定义测试块数
*/
#define TEST_BLOCK_LEN 64
#define TEST_BLOCK_COUNT 2097152
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 MDPrint PROTO_LIST ((unsigned char [16]));
#define MD5_CTX MD5_CTX
#define MDInit MD5Init
#define MDUpdate MD5Update
#define MDFinal MD5Final
/* Main driver.
Arguments (可任意组合):
-sstring - 摘要字符串
-t - 运行测试块
-x - 运行测试标准
filename - 摘要文件
*/
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')/*若为-s则执行摘要字符串功能*/
MDString (argv[i] + 2);
else if (strcmp (argv[i], "-t") == 0) /*若为-t则执行测试速度功能*/
MDTimeTrial ();
else if (strcmp (argv[i], "-x") == 0) /*若为-x则执行测试集功能*/
MDTestSuite ();
else
MDFile (argv[i]);/*若为文件名则执行摘要文件功能*/
return (0);
}
/* 摘要字符串,求时间,并输出结果.
*/
static void MDString (string)
char *string;
{
MD5_CTX context;
unsigned char digest[16];
unsigned int len = strlen (string);
struct timeval tstart ,tstop ;
double telapsed ;
gettimeofday(&tstart ,NULL) ;/*计时开始*/
MDInit (&context);
MDUpdate (&context, string, len);
MDFinal (digest, &context);
gettimeofday(&tstop ,NULL);/*计时结束*/
telapsed = 1000000 * (tstop.tv_sec - tstart.tv_sec) +
(tstop.tv_usec - tstart.tv_usec) ;
telapsed /= 1000000 ;
printf ("MD%d (\"%s\") = ", MD, string);
MDPrint (digest);
printf ("\nTime elapsed :%.10f (s)\n",telapsed);
printf ("\n");
}
/* 测试摘要TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte数据块所用时间.
*/
static void MDTimeTrial ()
{
MD5_CTX context;
unsigned char block[TEST_BLOCK_LEN], digest[16];
unsigned int i;
struct timeval tstart ,tstop ;
double telapsed ;
printf("Start now...\n") ;
printf
("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
TEST_BLOCK_COUNT, TEST_BLOCK_LEN);
/* 初始化数据块 */
for (i = 0; i < TEST_BLOCK_LEN; i++)
block[i] = (unsigned char)(i & 0xff);
/* 开始计时 */
gettimeofday(&tstart ,NULL) ;
/* 循环加密数据块 */
for (i = 0; i < TEST_BLOCK_COUNT; i++)
{
MDInit (&context);
MDUpdate (&context, block, TEST_BLOCK_LEN);
MDFinal (digest, &context);
}
/* 停止计时 */
gettimeofday(&tstop ,NULL);
telapsed = 1000000 * (tstop.tv_sec - tstart.tv_sec) +
(tstop.tv_usec - tstart.tv_usec) ;
telapsed /= 1000000 ;
printf (" done\n");
printf ("Digest = ");
MDPrint (digest);
printf("\nTime = %.10f seconds\n",telapsed);
printf
("Speed = %.10f mb/second\n",
(double)TEST_BLOCK_LEN * (double)TEST_BLOCK_COUNT/telapsed/128/1024);
}
/* 摘要参考字符串集,输出结果.
*/
static void MDTestSuite ()
{
double elapsed = 0 ;
printf ("MD%d test suite:\n", MD);
MDString ("");
MDString ("a");
MDString ("abc");
MDString ("message digest");
MDString ("abcdefghijklmnopqrstuvwxyz");
MDString
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
MDString
("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}
/* 摘要文件,输出结果.
*/
static void MDFile (filename)
char *filename;
{
FILE *file;
MD5_CTX context;
int len;
unsigned char buffer[4096], digest[16];
struct timeval tstart ,tstop ;
double telapsed ;
if ((file = fopen (filename, "rb")) == NULL)
printf ("%s can't be opened\n", filename);
else {
gettimeofday(&tstart ,NULL) ;
MDInit (&context);
while (len = fread (buffer, 1, 4096 , file))
MDUpdate (&context, buffer, len);
MDFinal (digest, &context);
gettimeofday(&tstop ,NULL);
fclose (file);
telapsed = 1000000 * (tstop.tv_sec - tstart.tv_sec) +
(tstop.tv_usec - tstart.tv_usec) ;
printf ("MD%d (%s) = ", MD, filename);
telapsed /= 1000000 ;
MDPrint (digest);
printf ("\nTime elapsed :%.10f (s)\n",telapsed);
}
}
/* Prints a message digest in hexadecimal.
*/
static void MDPrint (digest)
unsigned char digest[16];
{
unsigned int i;
for (i = 0; i < 16; i++)
printf ("%02x", digest[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -