rc4s.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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/rc4.h>
  34. void main(int argc,char *argv[])
  35. {
  36. unsigned char buffer[1024];
  37. RC4_KEY ctx;
  38. unsigned long s1,s2,e1,e2;
  39. unsigned char k[16];
  40. unsigned long data[2];
  41. unsigned char iv[8];
  42. int i,num=64,numm;
  43. int j=0;
  44. if (argc >= 2)
  45. num=atoi(argv[1]);
  46. if (num == 0) num=256;
  47. if (num > 1024-16) num=1024-16;
  48. numm=num+8;
  49. for (j=0; j<6; j++)
  50. {
  51. for (i=0; i<10; i++) /**/
  52. {
  53. RC4(&ctx,numm,buffer,buffer);
  54. GetTSC(s1);
  55. RC4(&ctx,numm,buffer,buffer);
  56. GetTSC(e1);
  57. GetTSC(s2);
  58. RC4(&ctx,num,buffer,buffer);
  59. GetTSC(e2);
  60. RC4(&ctx,num,buffer,buffer);
  61. }
  62. printf("RC4 (%d bytes) %d %d (%d) - 8 bytes\n",num,
  63. e1-s1,e2-s2,(e1-s1)-(e2-s2));
  64. }
  65. }