Kinson Chik | a8fa74c | 2011-07-29 11:33:41 -0700 | [diff] [blame] | 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 | |
| 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/rc4.h> |
| 36 | |
| 37 | void main(int argc,char *argv[]) |
| 38 | { |
| 39 | unsigned char buffer[1024]; |
| 40 | RC4_KEY 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=64,numm; |
| 46 | int j=0; |
| 47 | |
| 48 | if (argc >= 2) |
| 49 | num=atoi(argv[1]); |
| 50 | |
| 51 | if (num == 0) num=256; |
| 52 | if (num > 1024-16) num=1024-16; |
| 53 | numm=num+8; |
| 54 | |
| 55 | for (j=0; j<6; j++) |
| 56 | { |
| 57 | for (i=0; i<10; i++) /**/ |
| 58 | { |
| 59 | RC4(&ctx,numm,buffer,buffer); |
| 60 | GetTSC(s1); |
| 61 | RC4(&ctx,numm,buffer,buffer); |
| 62 | GetTSC(e1); |
| 63 | GetTSC(s2); |
| 64 | RC4(&ctx,num,buffer,buffer); |
| 65 | GetTSC(e2); |
| 66 | RC4(&ctx,num,buffer,buffer); |
| 67 | } |
| 68 | |
| 69 | printf("RC4 (%d bytes) %d %d (%d) - 8 bytes\n",num, |
| 70 | e1-s1,e2-s2,(e1-s1)-(e2-s2)); |
| 71 | } |
| 72 | } |
| 73 | |