md4s.cpp revision 68651
1272343Sngie//
2272343Sngie// gettsc.inl
3272343Sngie//
4272343Sngie// gives access to the Pentium's (secret) cycle counter
5272343Sngie//
6272343Sngie// This software was written by Leonard Janke (janke@unixg.ubc.ca)
7272343Sngie// in 1996-7 and is entered, by him, into the public domain.
8272343Sngie
9272343Sngie#if defined(__WATCOMC__)
10272343Sngievoid GetTSC(unsigned long&);
11272343Sngie#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
12272343Sngie#elif defined(__GNUC__)
13272343Sngieinline
14272343Sngievoid GetTSC(unsigned long& tsc)
15272343Sngie{
16272343Sngie  asm volatile(".byte 15, 49\n\t"
17272343Sngie	       : "=eax" (tsc)
18272343Sngie	       :
19272343Sngie	       : "%edx", "%eax");
20272343Sngie}
21272343Sngie#elif defined(_MSC_VER)
22272343Sngieinline
23272343Sngievoid GetTSC(unsigned long& tsc)
24272343Sngie{
25272343Sngie  unsigned long a;
26272343Sngie  __asm _emit 0fh
27272343Sngie  __asm _emit 31h
28272343Sngie  __asm mov a, eax;
29272343Sngie  tsc=a;
30272343Sngie}
31272343Sngie#endif
32272343Sngie
33272343Sngie#include <stdio.h>
34272343Sngie#include <stdlib.h>
35272343Sngie#include <openssl/md4.h>
36272343Sngie
37272343Sngieextern "C" {
38272343Sngievoid md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num);
39272343Sngie}
40272343Sngie
41272343Sngievoid main(int argc,char *argv[])
42272343Sngie	{
43272343Sngie	unsigned char buffer[64*256];
44272343Sngie	MD4_CTX ctx;
45272343Sngie	unsigned long s1,s2,e1,e2;
46272343Sngie	unsigned char k[16];
47272343Sngie	unsigned long data[2];
48272343Sngie	unsigned char iv[8];
49272343Sngie	int i,num=0,numm;
50272343Sngie	int j=0;
51272343Sngie
52272343Sngie	if (argc >= 2)
53272343Sngie		num=atoi(argv[1]);
54272343Sngie
55272343Sngie	if (num == 0) num=16;
56272343Sngie	if (num > 250) num=16;
57272343Sngie	numm=num+2;
58272343Sngie	num*=64;
59272343Sngie	numm*=64;
60272343Sngie
61272343Sngie	for (j=0; j<6; j++)
62272343Sngie		{
63272343Sngie		for (i=0; i<10; i++) /**/
64272343Sngie			{
65272343Sngie			md4_block_x86(&ctx,buffer,numm);
66272343Sngie			GetTSC(s1);
67272343Sngie			md4_block_x86(&ctx,buffer,numm);
68272343Sngie			GetTSC(e1);
69272343Sngie			GetTSC(s2);
70272343Sngie			md4_block_x86(&ctx,buffer,num);
71272343Sngie			GetTSC(e2);
72272343Sngie			md4_block_x86(&ctx,buffer,num);
73272343Sngie			}
74272343Sngie		printf("md4 (%d bytes) %d %d (%.2f)\n",num,
75272343Sngie			e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
76272343Sngie		}
77272343Sngie	}
78272343Sngie
79272343Sngie