md4s.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // gettsc.inl
  3. //
  4. // gives access to the Pentium's (secret) cycle counter
  5. //
  6. // This software was written by Leonard Janke (janke@unixg.ubc.ca)
  7. // in 1996-7 and is entered, by him, into the public domain.
  8. #if defined(__WATCOMC__)
  9. void GetTSC(unsigned long&);
  10. #pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
  11. #elif defined(__GNUC__)
  12. inline
  13. void GetTSC(unsigned long& tsc)
  14. {
  15. asm volatile(".byte 15, 49\n\t"
  16. : "=eax" (tsc)
  17. :
  18. : "%edx", "%eax");
  19. }
  20. #elif defined(_MSC_VER)
  21. inline
  22. void GetTSC(unsigned long& tsc)
  23. {
  24. unsigned long a;
  25. __asm _emit 0fh
  26. __asm _emit 31h
  27. __asm mov a, eax;
  28. tsc=a;
  29. }
  30. #endif
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <openssl/md4.h>
  34. extern "C" {
  35. void md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num);
  36. }
  37. void main(int argc,char *argv[])
  38. {
  39. unsigned char buffer[64*256];
  40. MD4_CTX ctx;
  41. unsigned long s1,s2,e1,e2;
  42. unsigned char k[16];
  43. unsigned long data[2];
  44. unsigned char iv[8];
  45. int i,num=0,numm;
  46. int j=0;
  47. if (argc >= 2)
  48. num=atoi(argv[1]);
  49. if (num == 0) num=16;
  50. if (num > 250) num=16;
  51. numm=num+2;
  52. num*=64;
  53. numm*=64;
  54. for (j=0; j<6; j++)
  55. {
  56. for (i=0; i<10; i++) /**/
  57. {
  58. md4_block_x86(&ctx,buffer,numm);
  59. GetTSC(s1);
  60. md4_block_x86(&ctx,buffer,numm);
  61. GetTSC(e1);
  62. GetTSC(s2);
  63. md4_block_x86(&ctx,buffer,num);
  64. GetTSC(e2);
  65. md4_block_x86(&ctx,buffer,num);
  66. }
  67. printf("md4 (%d bytes) %d %d (%.2f)\n",num,
  68. e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
  69. }
  70. }