Import of old SSLeay release: SSLeay 0.9.0b
[openssl.git] / crypto / md5 / md5s.cpp
diff --git a/crypto/md5/md5s.cpp b/crypto/md5/md5s.cpp
new file mode 100644 (file)
index 0000000..ef8e175
--- /dev/null
@@ -0,0 +1,78 @@
+//
+// gettsc.inl
+//
+// gives access to the Pentium's (secret) cycle counter
+//
+// This software was written by Leonard Janke (janke@unixg.ubc.ca)
+// in 1996-7 and is entered, by him, into the public domain.
+
+#if defined(__WATCOMC__)
+void GetTSC(unsigned long&);
+#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
+#elif defined(__GNUC__)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  asm volatile(".byte 15, 49\n\t"
+              : "=eax" (tsc)
+              :
+              : "%edx", "%eax");
+}
+#elif defined(_MSC_VER)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  unsigned long a;
+  __asm _emit 0fh
+  __asm _emit 31h
+  __asm mov a, eax;
+  tsc=a;
+}
+#endif      
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "md5.h"
+
+extern "C" {
+void md5_block_x86(MD5_CTX *ctx, unsigned char *buffer,int num);
+}
+
+void main(int argc,char *argv[])
+       {
+       unsigned char buffer[64*256];
+       MD5_CTX ctx;
+       unsigned long s1,s2,e1,e2;
+       unsigned char k[16];
+       unsigned long data[2];
+       unsigned char iv[8];
+       int i,num=0,numm;
+       int j=0;
+
+       if (argc >= 2)
+               num=atoi(argv[1]);
+
+       if (num == 0) num=16;
+       if (num > 250) num=16;
+       numm=num+2;
+       num*=64;
+       numm*=64;
+
+       for (j=0; j<6; j++)
+               {
+               for (i=0; i<10; i++) /**/
+                       {
+                       md5_block_x86(&ctx,buffer,numm);
+                       GetTSC(s1);
+                       md5_block_x86(&ctx,buffer,numm);
+                       GetTSC(e1);
+                       GetTSC(s2);
+                       md5_block_x86(&ctx,buffer,num);
+                       GetTSC(e2);
+                       md5_block_x86(&ctx,buffer,num);
+                       }
+               printf("md5 (%d bytes) %d %d (%.2f)\n",num,
+                       e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
+               }
+       }
+