1:
2:
3:
4:
5:
6:
7:
8:
9: #if defined(__WATCOMC__)
10: void GetTSC(unsigned long&);
11: #pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
12: #elif defined(__GNUC__)
13: inline
14: void GetTSC(unsigned long& tsc)
15: {
16: asm volatile(".byte 15, 49\n\t"
17: : "=eax" (tsc)
18: :
19: : "%edx", "%eax");
20: }
21: #elif defined(_MSC_VER)
22: inline
23: void GetTSC(unsigned long& tsc)
24: {
25: unsigned long a;
26: __asm _emit 0fh
27: __asm _emit 31h
28: __asm mov a, eax;
29: tsc=a;
30: }
31: #endif
32:
33: #include <stdio.h>
34: #include <stdlib.h>
35: #include <openssl/sha.h>
36:
37: extern "C" {
38: void sha1_block_x86(SHA_CTX *ctx, unsigned char *buffer,int num);
39: }
40:
41: void main(int argc,char *argv[])
42: {
43: unsigned char buffer[64*256];
44: SHA_CTX ctx;
45: unsigned long s1,s2,e1,e2;
46: unsigned char k[16];
47: unsigned long data[2];
48: unsigned char iv[8];
49: int i,num=0,numm;
50: int j=0;
51:
52: if (argc >= 2)
53: num=atoi(argv[1]);
54:
55: if (num == 0) num=16;
56: if (num > 250) num=16;
57: numm=num+2;
58: num*=64;
59: numm*=64;
60:
61: for (j=0; j<6; j++)
62: {
63: for (i=0; i<10; i++)
64: {
65: sha1_block_x86(&ctx,buffer,numm);
66: GetTSC(s1);
67: sha1_block_x86(&ctx,buffer,numm);
68: GetTSC(e1);
69: GetTSC(s2);
70: sha1_block_x86(&ctx,buffer,num);
71: GetTSC(e2);
72: sha1_block_x86(&ctx,buffer,num);
73: }
74:
75: printf("sha1 (%d bytes) %d %d (%.2f)\n",num,
76: e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
77: }
78: }
79: