rc5speed.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /* crypto/rc5/rc5speed.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. /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
  59. /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
  60. #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
  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. /*
  78. * Depending on the VMS version, the tms structure is perhaps defined.
  79. * The __TMS macro will show if it was. If it wasn't defined, we should
  80. * undefine TIMES, since that tells the rest of the program how things
  81. * should be handled. -- Richard Levitte
  82. */
  83. #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
  84. # undef TIMES
  85. #endif
  86. #ifndef TIMES
  87. # include <sys/timeb.h>
  88. #endif
  89. #if defined(sun) || defined(__ultrix)
  90. # define _POSIX_SOURCE
  91. # include <limits.h>
  92. # include <sys/param.h>
  93. #endif
  94. #include <openssl/rc5.h>
  95. /* The following if from times(3) man page. It may need to be changed */
  96. #ifndef HZ
  97. # ifndef CLK_TCK
  98. # define HZ 100.0
  99. # else /* CLK_TCK */
  100. # define HZ ((double)CLK_TCK)
  101. # endif
  102. #endif
  103. #define BUFSIZE ((long)1024)
  104. long run = 0;
  105. double Time_F(int s);
  106. #ifdef SIGALRM
  107. # if defined(__STDC__) || defined(sgi) || defined(_AIX)
  108. # define SIGRETTYPE void
  109. # else
  110. # define SIGRETTYPE int
  111. # endif
  112. SIGRETTYPE sig_done(int sig);
  113. SIGRETTYPE sig_done(int sig)
  114. {
  115. signal(SIGALRM, sig_done);
  116. run = 0;
  117. # ifdef LINT
  118. sig = sig;
  119. # endif
  120. }
  121. #endif
  122. #define START 0
  123. #define STOP 1
  124. double Time_F(int s)
  125. {
  126. double ret;
  127. #ifdef TIMES
  128. static struct tms tstart, tend;
  129. if (s == START) {
  130. times(&tstart);
  131. return (0);
  132. } else {
  133. times(&tend);
  134. ret = ((double)(tend.tms_utime - tstart.tms_utime)) / HZ;
  135. return ((ret == 0.0) ? 1e-6 : ret);
  136. }
  137. #else /* !times() */
  138. static struct timeb tstart, tend;
  139. long i;
  140. if (s == START) {
  141. ftime(&tstart);
  142. return (0);
  143. } else {
  144. ftime(&tend);
  145. i = (long)tend.millitm - (long)tstart.millitm;
  146. ret = ((double)(tend.time - tstart.time)) + ((double)i) / 1e3;
  147. return ((ret == 0.0) ? 1e-6 : ret);
  148. }
  149. #endif
  150. }
  151. int main(int argc, char **argv)
  152. {
  153. long count;
  154. static unsigned char buf[BUFSIZE];
  155. static unsigned char key[] = {
  156. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
  157. 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
  158. };
  159. RC5_32_KEY sch;
  160. double a, b, c, d;
  161. #ifndef SIGALRM
  162. long ca, cb, cc;
  163. #endif
  164. #ifndef TIMES
  165. printf("To get the most accurate results, try to run this\n");
  166. printf("program when this computer is idle.\n");
  167. #endif
  168. #ifndef SIGALRM
  169. printf("First we calculate the approximate speed ...\n");
  170. RC5_32_set_key(&sch, 16, key, 12);
  171. count = 10;
  172. do {
  173. long i;
  174. unsigned long data[2];
  175. count *= 2;
  176. Time_F(START);
  177. for (i = count; i; i--)
  178. RC5_32_encrypt(data, &sch);
  179. d = Time_F(STOP);
  180. } while (d < 3.0);
  181. ca = count / 512;
  182. cb = count;
  183. cc = count * 8 / BUFSIZE + 1;
  184. printf("Doing RC5_32_set_key %ld times\n", ca);
  185. # define COND(d) (count != (d))
  186. # define COUNT(d) (d)
  187. #else
  188. # define COND(c) (run)
  189. # define COUNT(d) (count)
  190. signal(SIGALRM, sig_done);
  191. printf("Doing RC5_32_set_key for 10 seconds\n");
  192. alarm(10);
  193. #endif
  194. Time_F(START);
  195. for (count = 0, run = 1; COND(ca); count += 4) {
  196. RC5_32_set_key(&sch, 16, key, 12);
  197. RC5_32_set_key(&sch, 16, key, 12);
  198. RC5_32_set_key(&sch, 16, key, 12);
  199. RC5_32_set_key(&sch, 16, key, 12);
  200. }
  201. d = Time_F(STOP);
  202. printf("%ld RC5_32_set_key's in %.2f seconds\n", count, d);
  203. a = ((double)COUNT(ca)) / d;
  204. #ifdef SIGALRM
  205. printf("Doing RC5_32_encrypt's for 10 seconds\n");
  206. alarm(10);
  207. #else
  208. printf("Doing RC5_32_encrypt %ld times\n", cb);
  209. #endif
  210. Time_F(START);
  211. for (count = 0, run = 1; COND(cb); count += 4) {
  212. unsigned long data[2];
  213. RC5_32_encrypt(data, &sch);
  214. RC5_32_encrypt(data, &sch);
  215. RC5_32_encrypt(data, &sch);
  216. RC5_32_encrypt(data, &sch);
  217. }
  218. d = Time_F(STOP);
  219. printf("%ld RC5_32_encrypt's in %.2f second\n", count, d);
  220. b = ((double)COUNT(cb) * 8) / d;
  221. #ifdef SIGALRM
  222. printf("Doing RC5_32_cbc_encrypt on %ld byte blocks for 10 seconds\n",
  223. BUFSIZE);
  224. alarm(10);
  225. #else
  226. printf("Doing RC5_32_cbc_encrypt %ld times on %ld byte blocks\n", cc,
  227. BUFSIZE);
  228. #endif
  229. Time_F(START);
  230. for (count = 0, run = 1; COND(cc); count++)
  231. RC5_32_cbc_encrypt(buf, buf, BUFSIZE, &sch, &(key[0]), RC5_ENCRYPT);
  232. d = Time_F(STOP);
  233. printf("%ld RC5_32_cbc_encrypt's of %ld byte blocks in %.2f second\n",
  234. count, BUFSIZE, d);
  235. c = ((double)COUNT(cc) * BUFSIZE) / d;
  236. printf("RC5_32/12/16 set_key per sec = %12.2f (%9.3fuS)\n", a,
  237. 1.0e6 / a);
  238. printf("RC5_32/12/16 raw ecb bytes per sec = %12.2f (%9.3fuS)\n", b,
  239. 8.0e6 / b);
  240. printf("RC5_32/12/16 cbc bytes per sec = %12.2f (%9.3fuS)\n", c,
  241. 8.0e6 / c);
  242. exit(0);
  243. #if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
  244. return (0);
  245. #endif
  246. }