castopts.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /* crypto/cast/castopts.c */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3. * All rights reserved.
  4. *
  5. * This package is an SSL implementation written
  6. * by Eric Young (eay@cryptsoft.com).
  7. * The implementation was written so as to conform with Netscapes SSL.
  8. *
  9. * This library is free for commercial and non-commercial use as long as
  10. * the following conditions are aheared to. The following conditions
  11. * apply to all code found in this distribution, be it the RC4, RSA,
  12. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  13. * included with this distribution is covered by the same copyright terms
  14. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15. *
  16. * Copyright remains Eric Young's, and as such any Copyright notices in
  17. * the code are not to be removed.
  18. * If this package is used in a product, Eric Young should be given attribution
  19. * as the author of the parts of the library used.
  20. * This can be in the form of a textual message at program startup or
  21. * in documentation (online or textual) provided with the package.
  22. *
  23. * Redistribution and use in source and binary forms, with or without
  24. * modification, are permitted provided that the following conditions
  25. * are met:
  26. * 1. Redistributions of source code must retain the copyright
  27. * notice, this list of conditions and the following disclaimer.
  28. * 2. Redistributions in binary form must reproduce the above copyright
  29. * notice, this list of conditions and the following disclaimer in the
  30. * documentation and/or other materials provided with the distribution.
  31. * 3. All advertising materials mentioning features or use of this software
  32. * must display the following acknowledgement:
  33. * "This product includes cryptographic software written by
  34. * Eric Young (eay@cryptsoft.com)"
  35. * The word 'cryptographic' can be left out if the rouines from the library
  36. * being used are not cryptographic related :-).
  37. * 4. If you include any Windows specific code (or a derivative thereof) from
  38. * the apps directory (application code) you must include an acknowledgement:
  39. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40. *
  41. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51. * SUCH DAMAGE.
  52. *
  53. * The licence and distribution terms for any publically available version or
  54. * derivative of this code cannot be changed. i.e. this code cannot simply be
  55. * copied and put under another distribution licence
  56. * [including the GNU Public Licence.]
  57. */
  58. /* define PART1, PART2, PART3 or PART4 to build only with a few of the options.
  59. * This is for machines with 64k code segment size restrictions. */
  60. #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
  61. #define TIMES
  62. #endif
  63. #include <stdio.h>
  64. #include <openssl/e_os2.h>
  65. #include OPENSSL_UNISTD_IO
  66. OPENSSL_DECLARE_EXIT
  67. #ifndef OPENSSL_SYS_NETWARE
  68. #include <signal.h>
  69. #endif
  70. #ifndef _IRIX
  71. #include <time.h>
  72. #endif
  73. #ifdef TIMES
  74. #include <sys/types.h>
  75. #include <sys/times.h>
  76. #endif
  77. /* Depending on the VMS version, the tms structure is perhaps defined.
  78. The __TMS macro will show if it was. If it wasn't defined, we should
  79. undefine TIMES, since that tells the rest of the program how things
  80. should be handled. -- Richard Levitte */
  81. #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
  82. #undef TIMES
  83. #endif
  84. #ifndef TIMES
  85. #include <sys/timeb.h>
  86. #endif
  87. #if defined(sun) || defined(__ultrix)
  88. #define _POSIX_SOURCE
  89. #include <limits.h>
  90. #include <sys/param.h>
  91. #endif
  92. #include <openssl/cast.h>
  93. #define CAST_DEFAULT_OPTIONS
  94. #undef E_CAST
  95. #define CAST_encrypt CAST_encrypt_normal
  96. #define CAST_decrypt CAST_decrypt_normal
  97. #define CAST_cbc_encrypt CAST_cbc_encrypt_normal
  98. #undef HEADER_CAST_LOCL_H
  99. #include "c_enc.c"
  100. #define CAST_PTR
  101. #undef CAST_PTR2
  102. #undef E_CAST
  103. #undef CAST_encrypt
  104. #undef CAST_decrypt
  105. #undef CAST_cbc_encrypt
  106. #define CAST_encrypt CAST_encrypt_ptr
  107. #define CAST_decrypt CAST_decrypt_ptr
  108. #define CAST_cbc_encrypt CAST_cbc_encrypt_ptr
  109. #undef HEADER_CAST_LOCL_H
  110. #include "c_enc.c"
  111. #undef CAST_PTR
  112. #define CAST_PTR2
  113. #undef E_CAST
  114. #undef CAST_encrypt
  115. #undef CAST_decrypt
  116. #undef CAST_cbc_encrypt
  117. #define CAST_encrypt CAST_encrypt_ptr2
  118. #define CAST_decrypt CAST_decrypt_ptr2
  119. #define CAST_cbc_encrypt CAST_cbc_encrypt_ptr2
  120. #undef HEADER_CAST_LOCL_H
  121. #include "c_enc.c"
  122. /* The following if from times(3) man page. It may need to be changed */
  123. #ifndef HZ
  124. # ifndef CLK_TCK
  125. # ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
  126. # define HZ 100.0
  127. # else /* _BSD_CLK_TCK_ */
  128. # define HZ ((double)_BSD_CLK_TCK_)
  129. # endif
  130. # else /* CLK_TCK */
  131. # define HZ ((double)CLK_TCK)
  132. # endif
  133. #endif
  134. #define BUFSIZE ((long)1024)
  135. long run=0;
  136. double Time_F(int s);
  137. #ifdef SIGALRM
  138. #if defined(__STDC__) || defined(sgi)
  139. #define SIGRETTYPE void
  140. #else
  141. #define SIGRETTYPE int
  142. #endif
  143. SIGRETTYPE sig_done(int sig);
  144. SIGRETTYPE sig_done(int sig)
  145. {
  146. signal(SIGALRM,sig_done);
  147. run=0;
  148. #ifdef LINT
  149. sig=sig;
  150. #endif
  151. }
  152. #endif
  153. #define START 0
  154. #define STOP 1
  155. double Time_F(int s)
  156. {
  157. double ret;
  158. #ifdef TIMES
  159. static struct tms tstart,tend;
  160. if (s == START)
  161. {
  162. times(&tstart);
  163. return(0);
  164. }
  165. else
  166. {
  167. times(&tend);
  168. ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
  169. return((ret == 0.0)?1e-6:ret);
  170. }
  171. #else /* !times() */
  172. static struct timeb tstart,tend;
  173. long i;
  174. if (s == START)
  175. {
  176. ftime(&tstart);
  177. return(0);
  178. }
  179. else
  180. {
  181. ftime(&tend);
  182. i=(long)tend.millitm-(long)tstart.millitm;
  183. ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
  184. return((ret == 0.0)?1e-6:ret);
  185. }
  186. #endif
  187. }
  188. #ifdef SIGALRM
  189. #define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
  190. #else
  191. #define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
  192. #endif
  193. #define time_it(func,name,index) \
  194. print_name(name); \
  195. Time_F(START); \
  196. for (count=0,run=1; COND(cb); count+=4) \
  197. { \
  198. unsigned long d[2]; \
  199. func(d,&sch); \
  200. func(d,&sch); \
  201. func(d,&sch); \
  202. func(d,&sch); \
  203. } \
  204. tm[index]=Time_F(STOP); \
  205. fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
  206. tm[index]=((double)COUNT(cb))/tm[index];
  207. #define print_it(name,index) \
  208. fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
  209. tm[index]*8,1.0e6/tm[index]);
  210. int main(int argc, char **argv)
  211. {
  212. long count;
  213. static unsigned char buf[BUFSIZE];
  214. static char key[16]={ 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
  215. 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
  216. CAST_KEY sch;
  217. double d,tm[16],max=0;
  218. int rank[16];
  219. char *str[16];
  220. int max_idx=0,i,num=0,j;
  221. #ifndef SIGALARM
  222. long ca,cb,cc,cd,ce;
  223. #endif
  224. for (i=0; i<12; i++)
  225. {
  226. tm[i]=0.0;
  227. rank[i]=0;
  228. }
  229. #ifndef TIMES
  230. fprintf(stderr,"To get the most accurate results, try to run this\n");
  231. fprintf(stderr,"program when this computer is idle.\n");
  232. #endif
  233. CAST_set_key(&sch,16,key);
  234. #ifndef SIGALRM
  235. fprintf(stderr,"First we calculate the approximate speed ...\n");
  236. count=10;
  237. do {
  238. long i;
  239. unsigned long data[2];
  240. count*=2;
  241. Time_F(START);
  242. for (i=count; i; i--)
  243. CAST_encrypt(data,&sch);
  244. d=Time_F(STOP);
  245. } while (d < 3.0);
  246. ca=count;
  247. cb=count*3;
  248. cc=count*3*8/BUFSIZE+1;
  249. cd=count*8/BUFSIZE+1;
  250. ce=count/20+1;
  251. #define COND(d) (count != (d))
  252. #define COUNT(d) (d)
  253. #else
  254. #define COND(c) (run)
  255. #define COUNT(d) (count)
  256. signal(SIGALRM,sig_done);
  257. alarm(10);
  258. #endif
  259. time_it(CAST_encrypt_normal, "CAST_encrypt_normal ", 0);
  260. time_it(CAST_encrypt_ptr, "CAST_encrypt_ptr ", 1);
  261. time_it(CAST_encrypt_ptr2, "CAST_encrypt_ptr2 ", 2);
  262. num+=3;
  263. str[0]="<nothing>";
  264. print_it("CAST_encrypt_normal ",0);
  265. max=tm[0];
  266. max_idx=0;
  267. str[1]="ptr ";
  268. print_it("CAST_encrypt_ptr ",1);
  269. if (max < tm[1]) { max=tm[1]; max_idx=1; }
  270. str[2]="ptr2 ";
  271. print_it("CAST_encrypt_ptr2 ",2);
  272. if (max < tm[2]) { max=tm[2]; max_idx=2; }
  273. printf("options CAST ecb/s\n");
  274. printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]);
  275. d=tm[max_idx];
  276. tm[max_idx]= -2.0;
  277. max= -1.0;
  278. for (;;)
  279. {
  280. for (i=0; i<3; i++)
  281. {
  282. if (max < tm[i]) { max=tm[i]; j=i; }
  283. }
  284. if (max < 0.0) break;
  285. printf("%s %12.2f %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0);
  286. tm[j]= -2.0;
  287. max= -1.0;
  288. }
  289. switch (max_idx)
  290. {
  291. case 0:
  292. printf("-DCAST_DEFAULT_OPTIONS\n");
  293. break;
  294. case 1:
  295. printf("-DCAST_PTR\n");
  296. break;
  297. case 2:
  298. printf("-DCAST_PTR2\n");
  299. break;
  300. }
  301. exit(0);
  302. #if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
  303. return(0);
  304. #endif
  305. }