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 
35 static int cnt;
36 #ifdef NO_ITIMER
37 char *hz;
38 struct tms tstart, tfinish;
39 #endif
40 #define ITIME	10		/* Number of seconds to run test. */
41 
42 char *crypt(), *fcrypt();
43 
44 void
Stop(void)45 Stop (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 ("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 
clearmem(start,cnt)72 static void clearmem(start, cnt)
73   char *start;
74   int cnt;
75   { while(cnt--)
76       *start++ = '\0';
77   }
78 
main(void)79 main (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 ("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 ((char*)&itv, (int)sizeof (itv));
131     signal (SIGVTALRM, Stop);
132     itv.it_value.tv_sec = ITIME;
133     itv.it_value.tv_usec = 0;
134     setitimer (ITIMER_VIRTUAL, &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