1/*
2 * This fcrypt/crypt speed testing program
3 * is derived from one floating around in
4 * the net. It's distributed along with
5 * UFC-crypt but is not covered by any
6 * licence.
7 *
8 * @(#)speeds.c 1.11 20 Aug 1996
9 */
10
11#include <signal.h>
12#include <stdio.h>
13
14#ifndef SIGVTALRM
15/*
16 * patch from chip@chinacat.unicom.com (Chip Rosenthal):
17 * you may enable it if your system does not include
18 * a setitimer() function. You'll have to ensure the
19 * existence an environment variable: HZ giving how many
20 * ticks goes per second.
21 * If not existing in your default environment 50, 60
22 * or even 100 may be the right value. Perhaps you should
23 * then use 'time ./ufc 10000' instead of guessing.
24 */
25#define NO_ITIMER
26#endif
27
28#ifdef NO_ITIMER
29#include <sys/types.h>
30#include <sys/times.h>
31#else
32#include <sys/time.h>
33#endif
34
35static int cnt;
36#ifdef NO_ITIMER
37char *hz;
38struct tms tstart, tfinish;
39#endif
40#define ITIME 10 /* Number of seconds to run test. */
41
42char *crypt(), *fcrypt();
43
44void
45Stop (void)
46{
47 double elapsed;
48#ifdef NO_ITIMER
49 (void) times(&tfinish);
50 elapsed = ((tfinish.tms_utime + tfinish.tms_stime) -
51 (tstart.tms_utime + tstart.tms_stime)) / atoi(hz);
52 printf("elapsed time = %d sec, CPU time = %f sec\n", ITIME, elapsed);
53#else
54 elapsed = ITIME;
55#endif
56 printf (format: "Did %f %s()s per second.\n", ((float) cnt) / elapsed,
57#if defined(FCRYPT)
58 "fcrypt"
59#else
60 "crypt"
61#endif
62 );
63 exit (0);
64}
65
66/*
67 * Silly rewrite of 'bzero'. I do so
68 * because some machines don't have
69 * bzero and some don't have memset.
70 */
71
72static void clearmem(start, cnt)
73 char *start;
74 int cnt;
75 { while(cnt--)
76 *start++ = '\0';
77 }
78
79main (void)
80{
81 char *s;
82#ifdef NO_ITIMER
83 extern char *getenv();
84#else
85 struct itimerval itv;
86#endif
87
88#ifdef NO_ITIMER
89 if ((hz = getenv("HZ")) == NULL) {
90 fprintf(stderr, "HZ environment parameter undefined\n");
91 exit(1);
92 }
93#endif
94
95#ifdef FCRYPT
96 printf("\n");
97 printf("Warning: this version of the speed program may run slower when\n");
98 printf("benchmarking UFC-crypt than previous versions. This is because it\n");
99 printf("stresses the CPU hardware cache in order to get benchmark figures\n");
100 printf("that corresponds closer to the performance that can be expected in\n");
101 printf("a password cracker.\n\n");
102#endif
103
104 printf (format: "Running %s for %d seconds of virtual time ...\n",
105#ifdef FCRYPT
106 "UFC-crypt",
107#else
108 "crypt(libc)",
109#endif
110 ITIME);
111
112#ifdef FCRYPT
113 init_des ();
114#endif
115
116#ifdef NO_ITIMER
117 signal(SIGALRM, Stop);
118 switch (fork()) {
119 case -1:
120 perror("fork failed");
121 exit(1);
122 case 0:
123 sleep(10);
124 kill(getppid(), SIGALRM);
125 exit(0);
126 default:
127 (void) times(&tstart);
128 }
129#else
130 clearmem (start: (char*)&itv, cnt: (int)sizeof (itv));
131 signal (SIGVTALRM, handler: Stop);
132 itv.it_value.tv_sec = ITIME;
133 itv.it_value.tv_usec = 0;
134 setitimer (ITIMER_VIRTUAL, new: &itv, NULL);
135#endif
136
137
138 s = "fredred";
139 for (cnt = 0;; cnt++)
140 {
141#ifdef FCRYPT
142 s = fcrypt (s, "eek");
143#else
144 s = crypt (s, "eek");
145#endif
146 }
147}
148
149
150
151
152
153
154

source code of glibc/crypt/speeds.c