|
1 /* apps/s_time.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 |
|
59 #define NO_SHUTDOWN |
|
60 |
|
61 /*----------------------------------------- |
|
62 s_time - SSL client connection timer program |
|
63 Written and donated by Larry Streepy <streepy@healthcare.com> |
|
64 -----------------------------------------*/ |
|
65 #include <sys/select.h> |
|
66 #include <stdio.h> |
|
67 #include <stdlib.h> |
|
68 #include <string.h> |
|
69 |
|
70 #define USE_SOCKETS |
|
71 #include "apps.h" |
|
72 #ifdef OPENSSL_NO_STDIO |
|
73 #define APPS_WIN16 |
|
74 #endif |
|
75 #include <openssl/x509.h> |
|
76 #include <openssl/ssl.h> |
|
77 #include <openssl/pem.h> |
|
78 #include "s_apps.h" |
|
79 #include <openssl/err.h> |
|
80 #ifdef WIN32_STUFF |
|
81 #include "winmain.h" |
|
82 #include "wintext.h" |
|
83 #endif |
|
84 #if !defined(OPENSSL_SYS_MSDOS) |
|
85 #include OPENSSL_UNISTD |
|
86 #endif |
|
87 |
|
88 #if !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) |
|
89 #define TIMES |
|
90 #endif |
|
91 |
|
92 #ifndef _IRIX |
|
93 #include <time.h> |
|
94 #endif |
|
95 #ifdef TIMES |
|
96 #include <sys/types.h> |
|
97 #include <sys/times.h> |
|
98 #endif |
|
99 |
|
100 /* Depending on the VMS version, the tms structure is perhaps defined. |
|
101 The __TMS macro will show if it was. If it wasn't defined, we should |
|
102 undefine TIMES, since that tells the rest of the program how things |
|
103 should be handled. -- Richard Levitte */ |
|
104 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS) |
|
105 #undef TIMES |
|
106 #endif |
|
107 |
|
108 #if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE) |
|
109 #include <sys/timeb.h> |
|
110 #endif |
|
111 |
|
112 #if defined(sun) || defined(__ultrix) |
|
113 #define _POSIX_SOURCE |
|
114 #include <limits.h> |
|
115 #include <sys/param.h> |
|
116 #endif |
|
117 |
|
118 /* The following if from times(3) man page. It may need to be changed |
|
119 */ |
|
120 #ifndef HZ |
|
121 # ifdef _SC_CLK_TCK |
|
122 # define HZ ((double)sysconf(_SC_CLK_TCK)) |
|
123 # else |
|
124 # ifndef CLK_TCK |
|
125 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ |
|
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 #endif |
|
135 |
|
136 #undef PROG |
|
137 #define PROG s_time_main |
|
138 |
|
139 #undef ioctl |
|
140 #define ioctl ioctlsocket |
|
141 |
|
142 #define SSL_CONNECT_NAME "localhost:4433" |
|
143 |
|
144 /*#define TEST_CERT "client.pem" */ /* no default cert. */ |
|
145 |
|
146 #undef BUFSIZZ |
|
147 #define BUFSIZZ 1024*10 |
|
148 |
|
149 #define MYBUFSIZ 1024*8 |
|
150 |
|
151 #undef min |
|
152 #undef max |
|
153 #define min(a,b) (((a) < (b)) ? (a) : (b)) |
|
154 #define max(a,b) (((a) > (b)) ? (a) : (b)) |
|
155 |
|
156 #undef SECONDS |
|
157 #define SECONDS 30 |
|
158 extern int verify_depth; |
|
159 extern int verify_error; |
|
160 |
|
161 static void s_time_usage(void); |
|
162 static int parseArgs( int argc, char **argv ); |
|
163 static SSL *doConnection( SSL *scon ); |
|
164 static void s_time_init(void); |
|
165 |
|
166 /*********************************************************************** |
|
167 * Static data declarations |
|
168 */ |
|
169 |
|
170 /* static char *port=PORT_STR;*/ |
|
171 static char *host=SSL_CONNECT_NAME; |
|
172 static char *t_cert_file=NULL; |
|
173 static char *t_key_file=NULL; |
|
174 static char *CApath=NULL; |
|
175 static char *CAfile=NULL; |
|
176 static char *tm_cipher=NULL; |
|
177 static int tm_verify = SSL_VERIFY_NONE; |
|
178 static int maxTime = SECONDS; |
|
179 static SSL_CTX *tm_ctx=NULL; |
|
180 static SSL_METHOD *s_time_meth=NULL; |
|
181 static char *s_www_path=NULL; |
|
182 static long bytes_read=0; |
|
183 static int st_bugs=0; |
|
184 static int perform=0; |
|
185 #ifdef FIONBIO |
|
186 static int t_nbio=0; |
|
187 #endif |
|
188 #ifdef OPENSSL_SYS_WIN32 |
|
189 static int exitNow = 0; /* Set when it's time to exit main */ |
|
190 #endif |
|
191 |
|
192 static void s_time_init(void) |
|
193 { |
|
194 host=SSL_CONNECT_NAME; |
|
195 t_cert_file=NULL; |
|
196 t_key_file=NULL; |
|
197 CApath=NULL; |
|
198 CAfile=NULL; |
|
199 tm_cipher=NULL; |
|
200 tm_verify = SSL_VERIFY_NONE; |
|
201 maxTime = SECONDS; |
|
202 tm_ctx=NULL; |
|
203 s_time_meth=NULL; |
|
204 s_www_path=NULL; |
|
205 bytes_read=0; |
|
206 st_bugs=0; |
|
207 perform=0; |
|
208 |
|
209 #ifdef FIONBIO |
|
210 t_nbio=0; |
|
211 #endif |
|
212 #ifdef OPENSSL_SYS_WIN32 |
|
213 exitNow = 0; /* Set when it's time to exit main */ |
|
214 #endif |
|
215 } |
|
216 |
|
217 |
|
218 /*********************************************************************** |
|
219 * usage - display usage message |
|
220 */ |
|
221 static void s_time_usage(void) |
|
222 { |
|
223 static char umsg[] = "\ |
|
224 -time arg - max number of seconds to collect data, default %d\n\ |
|
225 -verify arg - turn on peer certificate verification, arg == depth\n\ |
|
226 -cert arg - certificate file to use, PEM format assumed\n\ |
|
227 -key arg - RSA file to use, PEM format assumed, key is in cert file\n\ |
|
228 file if not specified by this option\n\ |
|
229 -CApath arg - PEM format directory of CA's\n\ |
|
230 -CAfile arg - PEM format file of CA's\n\ |
|
231 -cipher - preferred cipher to use, play with 'openssl ciphers'\n\n"; |
|
232 |
|
233 printf( "usage: s_time <args>\n\n" ); |
|
234 |
|
235 printf("-connect host:port - host:port to connect to (default is %s)\n",SSL_CONNECT_NAME); |
|
236 #ifdef FIONBIO |
|
237 printf("-nbio - Run with non-blocking IO\n"); |
|
238 printf("-ssl2 - Just use SSLv2\n"); |
|
239 printf("-ssl3 - Just use SSLv3\n"); |
|
240 printf("-bugs - Turn on SSL bug compatibility\n"); |
|
241 printf("-new - Just time new connections\n"); |
|
242 printf("-reuse - Just time connection reuse\n"); |
|
243 printf("-www page - Retrieve 'page' from the site\n"); |
|
244 #endif |
|
245 printf( umsg,SECONDS ); |
|
246 |
|
247 } |
|
248 |
|
249 /*********************************************************************** |
|
250 * parseArgs - Parse command line arguments and initialize data |
|
251 * |
|
252 * Returns 0 if ok, -1 on bad args |
|
253 */ |
|
254 static int parseArgs(int argc, char **argv) |
|
255 { |
|
256 int badop = 0; |
|
257 |
|
258 verify_depth=0; |
|
259 verify_error=X509_V_OK; |
|
260 |
|
261 argc--; |
|
262 argv++; |
|
263 |
|
264 while (argc >= 1) { |
|
265 if (strcmp(*argv,"-connect") == 0) |
|
266 { |
|
267 if (--argc < 1) goto bad; |
|
268 host= *(++argv); |
|
269 } |
|
270 #if 0 |
|
271 else if( strcmp(*argv,"-host") == 0) |
|
272 { |
|
273 if (--argc < 1) goto bad; |
|
274 host= *(++argv); |
|
275 } |
|
276 else if( strcmp(*argv,"-port") == 0) |
|
277 { |
|
278 if (--argc < 1) goto bad; |
|
279 port= *(++argv); |
|
280 } |
|
281 #endif |
|
282 else if (strcmp(*argv,"-reuse") == 0) |
|
283 perform=2; |
|
284 else if (strcmp(*argv,"-new") == 0) |
|
285 perform=1; |
|
286 else if( strcmp(*argv,"-verify") == 0) { |
|
287 |
|
288 tm_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE; |
|
289 if (--argc < 1) goto bad; |
|
290 verify_depth=atoi(*(++argv)); |
|
291 BIO_printf(bio_err,"verify depth is %d\n",verify_depth); |
|
292 |
|
293 } else if( strcmp(*argv,"-cert") == 0) { |
|
294 |
|
295 if (--argc < 1) goto bad; |
|
296 t_cert_file= *(++argv); |
|
297 |
|
298 } else if( strcmp(*argv,"-key") == 0) { |
|
299 |
|
300 if (--argc < 1) goto bad; |
|
301 t_key_file= *(++argv); |
|
302 |
|
303 } else if( strcmp(*argv,"-CApath") == 0) { |
|
304 |
|
305 if (--argc < 1) goto bad; |
|
306 CApath= *(++argv); |
|
307 |
|
308 } else if( strcmp(*argv,"-CAfile") == 0) { |
|
309 |
|
310 if (--argc < 1) goto bad; |
|
311 CAfile= *(++argv); |
|
312 |
|
313 } else if( strcmp(*argv,"-cipher") == 0) { |
|
314 |
|
315 if (--argc < 1) goto bad; |
|
316 tm_cipher= *(++argv); |
|
317 } |
|
318 #ifdef FIONBIO |
|
319 else if(strcmp(*argv,"-nbio") == 0) { |
|
320 t_nbio=1; |
|
321 } |
|
322 #endif |
|
323 else if(strcmp(*argv,"-www") == 0) |
|
324 { |
|
325 if (--argc < 1) goto bad; |
|
326 s_www_path= *(++argv); |
|
327 if(strlen(s_www_path) > MYBUFSIZ-100) |
|
328 { |
|
329 BIO_printf(bio_err,"-www option too long\n"); |
|
330 badop=1; |
|
331 } |
|
332 } |
|
333 else if(strcmp(*argv,"-bugs") == 0) |
|
334 st_bugs=1; |
|
335 #ifndef OPENSSL_NO_SSL2 |
|
336 else if(strcmp(*argv,"-ssl2") == 0) |
|
337 s_time_meth=SSLv2_client_method(); |
|
338 #endif |
|
339 #ifndef OPENSSL_NO_SSL3 |
|
340 else if(strcmp(*argv,"-ssl3") == 0) |
|
341 s_time_meth=SSLv3_client_method(); |
|
342 #endif |
|
343 else if( strcmp(*argv,"-time") == 0) { |
|
344 |
|
345 if (--argc < 1) goto bad; |
|
346 maxTime= atoi(*(++argv)); |
|
347 } |
|
348 else { |
|
349 BIO_printf(bio_err,"unknown option %s\n",*argv); |
|
350 badop=1; |
|
351 break; |
|
352 } |
|
353 |
|
354 argc--; |
|
355 argv++; |
|
356 } |
|
357 |
|
358 if (perform == 0) perform=3; |
|
359 |
|
360 if(badop) { |
|
361 bad: |
|
362 s_time_usage(); |
|
363 return -1; |
|
364 } |
|
365 |
|
366 return 0; /* Valid args */ |
|
367 } |
|
368 |
|
369 /*********************************************************************** |
|
370 * TIME - time functions |
|
371 */ |
|
372 #define START 0 |
|
373 #define STOP 1 |
|
374 |
|
375 static double tm_Time_F(int s) |
|
376 { |
|
377 static double ret; |
|
378 #ifdef TIMES |
|
379 static struct tms tstart,tend; |
|
380 |
|
381 if(s == START) { |
|
382 //times(&tstart); shilps |
|
383 return(0); |
|
384 } else { |
|
385 //times(&tend); shilpa |
|
386 ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; |
|
387 return((ret == 0.0)?1e-6:ret); |
|
388 } |
|
389 #elif defined(OPENSSL_SYS_NETWARE) |
|
390 static clock_t tstart,tend; |
|
391 |
|
392 if (s == START) |
|
393 { |
|
394 tstart=clock(); |
|
395 return(0); |
|
396 } |
|
397 else |
|
398 { |
|
399 tend=clock(); |
|
400 ret=(double)((double)(tend)-(double)(tstart)); |
|
401 return((ret < 0.001)?0.001:ret); |
|
402 } |
|
403 #elif defined(OPENSSL_SYS_VXWORKS) |
|
404 { |
|
405 static unsigned long tick_start, tick_end; |
|
406 |
|
407 if( s == START ) |
|
408 { |
|
409 tick_start = tickGet(); |
|
410 return 0; |
|
411 } |
|
412 else |
|
413 { |
|
414 tick_end = tickGet(); |
|
415 ret = (double)(tick_end - tick_start) / (double)sysClkRateGet(); |
|
416 return((ret == 0.0)?1e-6:ret); |
|
417 } |
|
418 } |
|
419 #else /* !times() */ |
|
420 static struct timeb tstart,tend; |
|
421 long i; |
|
422 |
|
423 if(s == START) { |
|
424 ftime(&tstart); |
|
425 return(0); |
|
426 } else { |
|
427 ftime(&tend); |
|
428 i=(long)tend.millitm-(long)tstart.millitm; |
|
429 ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; |
|
430 return((ret == 0.0)?1e-6:ret); |
|
431 } |
|
432 #endif |
|
433 } |
|
434 |
|
435 /*********************************************************************** |
|
436 * MAIN - main processing area for client |
|
437 * real name depends on MONOLITH |
|
438 */ |
|
439 int MAIN(int, char **); |
|
440 |
|
441 int MAIN(int argc, char **argv) |
|
442 { |
|
443 double totalTime = 0.0; |
|
444 int nConn = 0; |
|
445 SSL *scon=NULL; |
|
446 long finishtime=0; |
|
447 int ret=1,i; |
|
448 MS_STATIC char buf[1024*8]; |
|
449 int ver; |
|
450 |
|
451 apps_startup(); |
|
452 s_time_init(); |
|
453 |
|
454 if (bio_err == NULL) |
|
455 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); |
|
456 |
|
457 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) |
|
458 s_time_meth=SSLv23_client_method(); |
|
459 #elif !defined(OPENSSL_NO_SSL3) |
|
460 s_time_meth=SSLv3_client_method(); |
|
461 #elif !defined(OPENSSL_NO_SSL2) |
|
462 s_time_meth=SSLv2_client_method(); |
|
463 #endif |
|
464 |
|
465 /* parse the command line arguments */ |
|
466 if( parseArgs( argc, argv ) < 0 ) |
|
467 goto end; |
|
468 |
|
469 OpenSSL_add_ssl_algorithms(); |
|
470 if ((tm_ctx=SSL_CTX_new(s_time_meth)) == NULL) return(1); |
|
471 |
|
472 SSL_CTX_set_quiet_shutdown(tm_ctx,1); |
|
473 |
|
474 if (st_bugs) SSL_CTX_set_options(tm_ctx,SSL_OP_ALL); |
|
475 SSL_CTX_set_cipher_list(tm_ctx,tm_cipher); |
|
476 if(!set_cert_stuff(tm_ctx,t_cert_file,t_key_file)) |
|
477 goto end; |
|
478 |
|
479 SSL_load_error_strings(); |
|
480 |
|
481 if ((!SSL_CTX_load_verify_locations(tm_ctx,CAfile,CApath)) || |
|
482 (!SSL_CTX_set_default_verify_paths(tm_ctx))) |
|
483 { |
|
484 /* BIO_printf(bio_err,"error setting default verify locations\n"); */ |
|
485 ERR_print_errors(bio_err); |
|
486 /* goto end; */ |
|
487 } |
|
488 |
|
489 if (tm_cipher == NULL) |
|
490 tm_cipher = getenv("SSL_CIPHER"); |
|
491 |
|
492 if (tm_cipher == NULL ) { |
|
493 fprintf( stderr, "No CIPHER specified\n" ); |
|
494 |
|
495 |
|
496 } |
|
497 |
|
498 if (!(perform & 1)) goto next; |
|
499 printf( "Collecting connection statistics for %d seconds\n", maxTime ); |
|
500 |
|
501 /* Loop and time how long it takes to make connections */ |
|
502 |
|
503 bytes_read=0; |
|
504 finishtime=(long)time(NULL)+maxTime; |
|
505 tm_Time_F(START); |
|
506 for (;;) |
|
507 { |
|
508 if (finishtime < (long)time(NULL)) break; |
|
509 #ifdef WIN32_STUFF |
|
510 |
|
511 if( flushWinMsgs(0) == -1 ) |
|
512 goto end; |
|
513 |
|
514 if( waitingToDie || exitNow ) /* we're dead */ |
|
515 goto end; |
|
516 #endif |
|
517 |
|
518 if( (scon = doConnection( NULL )) == NULL ) |
|
519 goto end; |
|
520 |
|
521 if (s_www_path != NULL) |
|
522 { |
|
523 BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); |
|
524 SSL_write(scon,buf,strlen(buf)); |
|
525 while ((i=SSL_read(scon,buf,sizeof(buf))) > 0) |
|
526 bytes_read+=i; |
|
527 } |
|
528 |
|
529 #ifdef NO_SHUTDOWN |
|
530 SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); |
|
531 #else |
|
532 SSL_shutdown(scon); |
|
533 #endif |
|
534 SHUTDOWN2(SSL_get_fd(scon)); |
|
535 |
|
536 nConn += 1; |
|
537 if (SSL_session_reused(scon)) |
|
538 ver='r'; |
|
539 else |
|
540 { |
|
541 ver=SSL_version(scon); |
|
542 if (ver == TLS1_VERSION) |
|
543 ver='t'; |
|
544 else if (ver == SSL3_VERSION) |
|
545 ver='3'; |
|
546 else if (ver == SSL2_VERSION) |
|
547 ver='2'; |
|
548 else |
|
549 ver='*'; |
|
550 } |
|
551 fputc(ver,stdout); |
|
552 fflush(stdout); |
|
553 SSL_free( scon ); |
|
554 scon=NULL; |
|
555 } |
|
556 totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ |
|
557 |
|
558 i=(int)((long)time(NULL)-finishtime+maxTime); |
|
559 printf( "\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", nConn, totalTime, ((double)nConn/totalTime),bytes_read); |
|
560 printf( "%d connections in %ld real seconds, %ld bytes read per connection\n",nConn,(long)time(NULL)-finishtime+maxTime,bytes_read/nConn); |
|
561 |
|
562 |
|
563 /* Now loop and time connections using the same session id over and over */ |
|
564 |
|
565 next: |
|
566 if (!(perform & 2)) goto end; |
|
567 |
|
568 printf( "\n\nNow timing with session id reuse.\n" ); |
|
569 |
|
570 |
|
571 /* Get an SSL object so we can reuse the session id */ |
|
572 if( (scon = doConnection( NULL )) == NULL ) |
|
573 { |
|
574 fprintf( stderr, "Unable to get connection\n" ); |
|
575 goto end; |
|
576 } |
|
577 |
|
578 if (s_www_path != NULL) |
|
579 { |
|
580 BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); |
|
581 SSL_write(scon,buf,strlen(buf)); |
|
582 while (SSL_read(scon,buf,sizeof(buf)) > 0) |
|
583 ; |
|
584 } |
|
585 #ifdef NO_SHUTDOWN |
|
586 SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); |
|
587 #else |
|
588 SSL_shutdown(scon); |
|
589 #endif |
|
590 SHUTDOWN2(SSL_get_fd(scon)); |
|
591 |
|
592 nConn = 0; |
|
593 totalTime = 0.0; |
|
594 |
|
595 finishtime=(long)time(NULL)+maxTime; |
|
596 |
|
597 printf( "starting\n" ); |
|
598 bytes_read=0; |
|
599 tm_Time_F(START); |
|
600 |
|
601 for (;;) |
|
602 { |
|
603 if (finishtime < (long)time(NULL)) break; |
|
604 |
|
605 #ifdef WIN32_STUFF |
|
606 if( flushWinMsgs(0) == -1 ) |
|
607 goto end; |
|
608 |
|
609 if( waitingToDie || exitNow ) /* we're dead */ |
|
610 goto end; |
|
611 #endif |
|
612 |
|
613 if( (doConnection( scon )) == NULL ) |
|
614 goto end; |
|
615 |
|
616 if (s_www_path) |
|
617 { |
|
618 BIO_snprintf(buf,sizeof buf,"GET %s HTTP/1.0\r\n\r\n",s_www_path); |
|
619 SSL_write(scon,buf,strlen(buf)); |
|
620 while ((i=SSL_read(scon,buf,sizeof(buf))) > 0) |
|
621 bytes_read+=i; |
|
622 } |
|
623 |
|
624 #ifdef NO_SHUTDOWN |
|
625 SSL_set_shutdown(scon,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); |
|
626 #else |
|
627 SSL_shutdown(scon); |
|
628 #endif |
|
629 SHUTDOWN2(SSL_get_fd(scon)); |
|
630 |
|
631 nConn += 1; |
|
632 if (SSL_session_reused(scon)) |
|
633 ver='r'; |
|
634 else |
|
635 { |
|
636 ver=SSL_version(scon); |
|
637 if (ver == TLS1_VERSION) |
|
638 ver='t'; |
|
639 else if (ver == SSL3_VERSION) |
|
640 ver='3'; |
|
641 else if (ver == SSL2_VERSION) |
|
642 ver='2'; |
|
643 else |
|
644 ver='*'; |
|
645 } |
|
646 fputc(ver,stdout); |
|
647 fflush(stdout); |
|
648 } |
|
649 totalTime += tm_Time_F(STOP); /* Add the time for this iteration*/ |
|
650 |
|
651 printf( "\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", nConn, totalTime, ((double)nConn/totalTime),bytes_read); |
|
652 printf( "%d connections in %ld real seconds, %ld bytes read per connection\n",nConn,(long)time(NULL)-finishtime+maxTime,bytes_read/nConn); |
|
653 |
|
654 ret=0; |
|
655 end: |
|
656 if (scon != NULL) SSL_free(scon); |
|
657 |
|
658 if (tm_ctx != NULL) |
|
659 { |
|
660 SSL_CTX_free(tm_ctx); |
|
661 tm_ctx=NULL; |
|
662 } |
|
663 apps_shutdown(); |
|
664 OPENSSL_EXIT(ret); |
|
665 } |
|
666 |
|
667 /*********************************************************************** |
|
668 * doConnection - make a connection |
|
669 * Args: |
|
670 * scon = earlier ssl connection for session id, or NULL |
|
671 * Returns: |
|
672 * SSL * = the connection pointer. |
|
673 */ |
|
674 static SSL *doConnection(SSL *scon) |
|
675 { |
|
676 BIO *conn; |
|
677 SSL *serverCon; |
|
678 int width, i; |
|
679 fd_set readfds; |
|
680 |
|
681 if ((conn=BIO_new(BIO_s_connect())) == NULL) |
|
682 return(NULL); |
|
683 |
|
684 /* BIO_set_conn_port(conn,port);*/ |
|
685 BIO_set_conn_hostname(conn,host); |
|
686 |
|
687 if (scon == NULL) |
|
688 serverCon=SSL_new(tm_ctx); |
|
689 else |
|
690 { |
|
691 serverCon=scon; |
|
692 SSL_set_connect_state(serverCon); |
|
693 } |
|
694 |
|
695 SSL_set_bio(serverCon,conn,conn); |
|
696 |
|
697 #if 0 |
|
698 if( scon != NULL ) |
|
699 SSL_set_session(serverCon,SSL_get_session(scon)); |
|
700 #endif |
|
701 |
|
702 /* ok, lets connect */ |
|
703 for(;;) { |
|
704 i=SSL_connect(serverCon); |
|
705 if (BIO_sock_should_retry(i)) |
|
706 { |
|
707 BIO_printf(bio_err,"DELAY\n"); |
|
708 |
|
709 i=SSL_get_fd(serverCon); |
|
710 width=i+1; |
|
711 FD_ZERO(&readfds); |
|
712 FD_SET(i,&readfds); |
|
713 /* Note: under VMS with SOCKETSHR the 2nd parameter |
|
714 * is currently of type (int *) whereas under other |
|
715 * systems it is (void *) if you don't have a cast it |
|
716 * will choke the compiler: if you do have a cast then |
|
717 * you can either go for (int *) or (void *). |
|
718 */ |
|
719 select(width,(void *)&readfds,NULL,NULL,NULL); |
|
720 continue; |
|
721 } |
|
722 break; |
|
723 } |
|
724 if(i <= 0) |
|
725 { |
|
726 BIO_printf(bio_err,"ERROR\n"); |
|
727 if (verify_error != X509_V_OK) |
|
728 BIO_printf(bio_err,"verify error:%s\n", |
|
729 X509_verify_cert_error_string(verify_error)); |
|
730 else |
|
731 ERR_print_errors(bio_err); |
|
732 if (scon == NULL) |
|
733 SSL_free(serverCon); |
|
734 return NULL; |
|
735 } |
|
736 |
|
737 return serverCon; |
|
738 } |
|
739 |
|
740 |