]> git.ipfire.org Git - thirdparty/openssl.git/blame - ssl/ssltest.c
Use new-style system-id macros everywhere possible. I hope I haven't
[thirdparty/openssl.git] / ssl / ssltest.c
CommitLineData
d02b48c6 1/* ssl/ssltest.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
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 */
3ac82faa
BM
58/* ====================================================================
59 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
d02b48c6 111
6f7af152
BM
112#include <assert.h>
113#include <errno.h>
114#include <limits.h>
d02b48c6
RE
115#include <stdio.h>
116#include <stdlib.h>
117#include <string.h>
563f1503 118#include <time.h>
17e3dd1c 119
7e701817 120#include "openssl/e_os.h"
17e3dd1c 121
ec577822
BM
122#include <openssl/bio.h>
123#include <openssl/crypto.h>
563f1503 124#include <openssl/evp.h>
ec577822
BM
125#include <openssl/x509.h>
126#include <openssl/ssl.h>
127#include <openssl/err.h>
b9d82f47 128#include <openssl/rand.h>
bc36ee62 129#ifdef OPENSSL_SYS_WINDOWS
f9b3bff6 130#include <winsock.h>
d02b48c6
RE
131#include "../crypto/bio/bss_file.c"
132#endif
133
bc36ee62 134#ifdef OPENSSL_SYS_VMS
7d7d2cbc
UM
135# define TEST_SERVER_CERT "SYS$DISK:[-.APPS]SERVER.PEM"
136# define TEST_CLIENT_CERT "SYS$DISK:[-.APPS]CLIENT.PEM"
137#else
138# define TEST_SERVER_CERT "../apps/server.pem"
139# define TEST_CLIENT_CERT "../apps/client.pem"
140#endif
d02b48c6 141
23f80f46
RL
142/* There is really no standard for this, so let's assign some tentative
143 numbers. In any case, these numbers are only for this test */
144#define COMP_RLE 1
145#define COMP_ZLIB 2
146
396f6314 147static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
bc36ee62 148#ifndef OPENSSL_NO_RSA
df63a389 149static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
46b3bd54 150static void free_tmp_rsa(void);
79df9d62 151#endif
bc36ee62 152#ifndef OPENSSL_NO_DH
d02b48c6 153static DH *get_dh512(void);
e4589582
BM
154static DH *get_dh1024(void);
155static DH *get_dh1024dsa(void);
53002dc6
BM
156#endif
157
396f6314
BM
158static BIO *bio_err=NULL;
159static BIO *bio_stdout=NULL;
d02b48c6
RE
160
161static char *cipher=NULL;
79875776
BM
162static int verbose=0;
163static int debug=0;
d58d092b
BM
164#if 0
165/* Not used yet. */
d02b48c6
RE
166#ifdef FIONBIO
167static int s_nbio=0;
168#endif
d58d092b 169#endif
d02b48c6 170
b9d82f47 171static const char rnd_seed[] = "string to make the random number generator think it has entropy";
d02b48c6 172
563f1503 173int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
58964a49 174int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
6b691a5c 175static void sv_usage(void)
d02b48c6
RE
176 {
177 fprintf(stderr,"usage: ssltest [args ...]\n");
178 fprintf(stderr,"\n");
179 fprintf(stderr," -server_auth - check server certificate\n");
180 fprintf(stderr," -client_auth - do client authentication\n");
181 fprintf(stderr," -v - more output\n");
58964a49
RE
182 fprintf(stderr," -d - debug output\n");
183 fprintf(stderr," -reuse - use session-id reuse\n");
184 fprintf(stderr," -num <val> - number of connections to perform\n");
185 fprintf(stderr," -bytes <val> - number of bytes to swap between client/server\n");
bc36ee62 186#ifndef OPENSSL_NO_DH
e4589582
BM
187 fprintf(stderr," -dhe1024 - use 1024 bit key (safe prime) for DHE\n");
188 fprintf(stderr," -dhe1024dsa - use 1024 bit key (with 160-bit subprime) for DHE\n");
77fa04a9
BM
189 fprintf(stderr," -no_dhe - disable DHE\n");
190#endif
bc36ee62 191#ifndef OPENSSL_NO_SSL2
d02b48c6
RE
192 fprintf(stderr," -ssl2 - use SSLv2\n");
193#endif
bc36ee62 194#ifndef OPENSSL_NO_SSL3
d02b48c6 195 fprintf(stderr," -ssl3 - use SSLv3\n");
58964a49 196#endif
bc36ee62 197#ifndef OPENSSL_NO_TLS1
58964a49 198 fprintf(stderr," -tls1 - use TLSv1\n");
d02b48c6
RE
199#endif
200 fprintf(stderr," -CApath arg - PEM format directory of CA's\n");
201 fprintf(stderr," -CAfile arg - PEM format file of CA's\n");
7d2509b6
BM
202 fprintf(stderr," -cert arg - Server certificate file\n");
203 fprintf(stderr," -key arg - Server key file (default: same as -cert)\n");
204 fprintf(stderr," -c_cert arg - Client certificate file\n");
205 fprintf(stderr," -c_key arg - Client key file (default: same as -c_cert)\n");
58964a49 206 fprintf(stderr," -cipher arg - The cipher list\n");
95d29597
BM
207 fprintf(stderr," -bio_pair - Use BIO pairs\n");
208 fprintf(stderr," -f - Test even cases that can't work\n");
563f1503 209 fprintf(stderr," -time - measure processor time used by client and server\n");
23f80f46
RL
210 fprintf(stderr," -zlib - use zlib compression\n");
211 fprintf(stderr," -time - use rle compression\n");
563f1503
BM
212 }
213
214static void print_details(SSL *c_ssl, const char *prefix)
215 {
216 SSL_CIPHER *ciph;
217 X509 *cert;
218
219 ciph=SSL_get_current_cipher(c_ssl);
220 BIO_printf(bio_stdout,"%s%s, cipher %s %s",
221 prefix,
222 SSL_get_version(c_ssl),
223 SSL_CIPHER_get_version(ciph),
224 SSL_CIPHER_get_name(ciph));
225 cert=SSL_get_peer_certificate(c_ssl);
226 if (cert != NULL)
227 {
228 EVP_PKEY *pkey = X509_get_pubkey(cert);
229 if (pkey != NULL)
230 {
231 if (0)
232 ;
bc36ee62 233#ifndef OPENSSL_NO_RSA
563f1503
BM
234 else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
235 && pkey->pkey.rsa->n != NULL)
236 {
237 BIO_printf(bio_stdout, ", %d bit RSA",
238 BN_num_bits(pkey->pkey.rsa->n));
239 }
240#endif
bc36ee62 241#ifndef OPENSSL_NO_DSA
563f1503
BM
242 else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
243 && pkey->pkey.dsa->p != NULL)
244 {
245 BIO_printf(bio_stdout, ", %d bit DSA",
246 BN_num_bits(pkey->pkey.dsa->p));
247 }
248#endif
249 EVP_PKEY_free(pkey);
250 }
251 X509_free(cert);
252 }
253 /* The SSL API does not allow us to look at temporary RSA/DH keys,
254 * otherwise we should print their lengths too */
255 BIO_printf(bio_stdout,"\n");
d02b48c6
RE
256 }
257
3ac82faa
BM
258static void lock_dbg_cb(int mode, int type, const char *file, int line)
259 {
260 static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
261 const char *errstr = NULL;
262 int rw;
263
264 rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
265 if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
266 {
267 errstr = "invalid mode";
268 goto err;
269 }
270
271 if (type < 0 || type > CRYPTO_NUM_LOCKS)
272 {
273 errstr = "type out of bounds";
274 goto err;
275 }
276
277 if (mode & CRYPTO_LOCK)
278 {
279 if (modes[type])
280 {
281 errstr = "already locked";
282 /* must not happen in a single-threaded program
283 * (would deadlock) */
284 goto err;
285 }
286
287 modes[type] = rw;
288 }
289 else if (mode & CRYPTO_UNLOCK)
290 {
291 if (!modes[type])
292 {
293 errstr = "not locked";
294 goto err;
295 }
296
297 if (modes[type] != rw)
298 {
299 errstr = (rw == CRYPTO_READ) ?
300 "CRYPTO_r_unlock on write lock" :
301 "CRYPTO_w_unlock on read lock";
302 }
303
304 modes[type] = 0;
305 }
306 else
307 {
308 errstr = "invalid mode";
309 goto err;
310 }
311
312 err:
313 if (errstr)
314 {
315 /* we cannot use bio_err here */
316 fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
317 errstr, mode, type, file, line);
318 }
319 }
320
6b691a5c 321int main(int argc, char *argv[])
d02b48c6
RE
322 {
323 char *CApath=NULL,*CAfile=NULL;
324 int badop=0;
95d29597
BM
325 int bio_pair=0;
326 int force=0;
58964a49 327 int tls1=0,ssl2=0,ssl3=0,ret=1;
d02b48c6 328 int client_auth=0;
58964a49 329 int server_auth=0,i;
d02b48c6 330 char *server_cert=TEST_SERVER_CERT;
65b002f3 331 char *server_key=NULL;
d02b48c6 332 char *client_cert=TEST_CLIENT_CERT;
65b002f3 333 char *client_key=NULL;
d02b48c6
RE
334 SSL_CTX *s_ctx=NULL;
335 SSL_CTX *c_ctx=NULL;
336 SSL_METHOD *meth=NULL;
58964a49
RE
337 SSL *c_ssl,*s_ssl;
338 int number=1,reuse=0;
339 long bytes=1L;
bc36ee62 340#ifndef OPENSSL_NO_DH
d02b48c6 341 DH *dh;
e4589582 342 int dhe1024 = 0, dhe1024dsa = 0;
58964a49 343#endif
e4589582 344 int no_dhe = 0;
563f1503
BM
345 int print_time = 0;
346 clock_t s_time = 0, c_time = 0;
23f80f46 347 int comp = 0;
8df788c9 348 COMP_METHOD *cm = NULL;
563f1503 349
79875776
BM
350 verbose = 0;
351 debug = 0;
352 cipher = 0;
353
3ac82faa
BM
354 CRYPTO_set_locking_callback(lock_dbg_cb);
355
79875776 356 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
d02b48c6 357
b9d82f47
UM
358 RAND_seed(rnd_seed, sizeof rnd_seed);
359
d02b48c6
RE
360 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
361 bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE);
362
d02b48c6
RE
363 argc--;
364 argv++;
365
366 while (argc >= 1)
367 {
368 if (strcmp(*argv,"-server_auth") == 0)
369 server_auth=1;
370 else if (strcmp(*argv,"-client_auth") == 0)
371 client_auth=1;
372 else if (strcmp(*argv,"-v") == 0)
373 verbose=1;
58964a49
RE
374 else if (strcmp(*argv,"-d") == 0)
375 debug=1;
376 else if (strcmp(*argv,"-reuse") == 0)
377 reuse=1;
bc36ee62 378#ifndef OPENSSL_NO_DH
48c843c3
BM
379 else if (strcmp(*argv,"-dhe1024") == 0)
380 dhe1024=1;
e4589582
BM
381 else if (strcmp(*argv,"-dhe1024dsa") == 0)
382 dhe1024dsa=1;
383#endif
77fa04a9
BM
384 else if (strcmp(*argv,"-no_dhe") == 0)
385 no_dhe=1;
d02b48c6
RE
386 else if (strcmp(*argv,"-ssl2") == 0)
387 ssl2=1;
58964a49
RE
388 else if (strcmp(*argv,"-tls1") == 0)
389 tls1=1;
d02b48c6
RE
390 else if (strcmp(*argv,"-ssl3") == 0)
391 ssl3=1;
58964a49
RE
392 else if (strncmp(*argv,"-num",4) == 0)
393 {
394 if (--argc < 1) goto bad;
395 number= atoi(*(++argv));
396 if (number == 0) number=1;
397 }
398 else if (strcmp(*argv,"-bytes") == 0)
399 {
400 if (--argc < 1) goto bad;
401 bytes= atol(*(++argv));
402 if (bytes == 0L) bytes=1L;
403 i=strlen(argv[0]);
404 if (argv[0][i-1] == 'k') bytes*=1024L;
405 if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
406 }
d02b48c6
RE
407 else if (strcmp(*argv,"-cert") == 0)
408 {
409 if (--argc < 1) goto bad;
410 server_cert= *(++argv);
411 }
412 else if (strcmp(*argv,"-s_cert") == 0)
413 {
414 if (--argc < 1) goto bad;
415 server_cert= *(++argv);
416 }
65b002f3
BM
417 else if (strcmp(*argv,"-key") == 0)
418 {
419 if (--argc < 1) goto bad;
420 server_key= *(++argv);
421 }
422 else if (strcmp(*argv,"-s_key") == 0)
423 {
424 if (--argc < 1) goto bad;
425 server_key= *(++argv);
426 }
d02b48c6
RE
427 else if (strcmp(*argv,"-c_cert") == 0)
428 {
429 if (--argc < 1) goto bad;
430 client_cert= *(++argv);
431 }
65b002f3
BM
432 else if (strcmp(*argv,"-c_key") == 0)
433 {
434 if (--argc < 1) goto bad;
435 client_key= *(++argv);
436 }
d02b48c6
RE
437 else if (strcmp(*argv,"-cipher") == 0)
438 {
439 if (--argc < 1) goto bad;
440 cipher= *(++argv);
441 }
442 else if (strcmp(*argv,"-CApath") == 0)
443 {
444 if (--argc < 1) goto bad;
445 CApath= *(++argv);
446 }
447 else if (strcmp(*argv,"-CAfile") == 0)
448 {
449 if (--argc < 1) goto bad;
450 CAfile= *(++argv);
451 }
95d29597
BM
452 else if (strcmp(*argv,"-bio_pair") == 0)
453 {
454 bio_pair = 1;
455 }
456 else if (strcmp(*argv,"-f") == 0)
457 {
458 force = 1;
459 }
563f1503
BM
460 else if (strcmp(*argv,"-time") == 0)
461 {
462 print_time = 1;
463 }
23f80f46
RL
464 else if (strcmp(*argv,"-zlib") == 0)
465 {
466 comp = COMP_ZLIB;
467 }
468 else if (strcmp(*argv,"-rle") == 0)
469 {
470 comp = COMP_RLE;
471 }
d02b48c6
RE
472 else
473 {
474 fprintf(stderr,"unknown option %s\n",*argv);
475 badop=1;
476 break;
477 }
478 argc--;
479 argv++;
480 }
481 if (badop)
482 {
483bad:
484 sv_usage();
485 goto end;
486 }
487
95d29597
BM
488 if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
489 {
563f1503
BM
490 fprintf(stderr, "This case cannot work. Use -f to perform "
491 "the test anyway (and\n-d to see what happens), "
492 "or add one of -ssl2, -ssl3, -tls1, -reuse\n"
493 "to avoid protocol mismatch.\n");
95d29597
BM
494 exit(1);
495 }
496
563f1503
BM
497 if (print_time)
498 {
499 if (!bio_pair)
500 {
501 fprintf(stderr, "Using BIO pair (-bio_pair)\n");
502 bio_pair = 1;
503 }
504 if (number < 50 && !force)
505 fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
506 }
507
d02b48c6
RE
508/* if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
509
413c4f45 510 SSL_library_init();
d02b48c6
RE
511 SSL_load_error_strings();
512
bd68b6b1
RL
513 if (comp == COMP_ZLIB) cm = COMP_zlib();
514 if (comp == COMP_RLE) cm = COMP_rle();
515 if (cm != NULL)
23f80f46 516 {
23f80f46 517 if (cm->type != NID_undef)
bd68b6b1 518 SSL_COMP_add_compression_method(comp, cm);
23f80f46 519 else
4751717c 520 {
bd68b6b1
RL
521 fprintf(stderr,
522 "Warning: %s compression not supported\n",
523 (comp == COMP_RLE ? "rle" :
524 (comp == COMP_ZLIB ? "zlib" :
525 "unknown")));
4751717c
RL
526 ERR_print_errors_fp(stderr);
527 }
23f80f46
RL
528 }
529
bc36ee62 530#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
d02b48c6
RE
531 if (ssl2)
532 meth=SSLv2_method();
533 else
58964a49
RE
534 if (tls1)
535 meth=TLSv1_method();
536 else
d02b48c6
RE
537 if (ssl3)
538 meth=SSLv3_method();
539 else
540 meth=SSLv23_method();
541#else
bc36ee62 542#ifdef OPENSSL_NO_SSL2
d02b48c6
RE
543 meth=SSLv3_method();
544#else
545 meth=SSLv2_method();
546#endif
547#endif
548
549 c_ctx=SSL_CTX_new(meth);
550 s_ctx=SSL_CTX_new(meth);
551 if ((c_ctx == NULL) || (s_ctx == NULL))
552 {
553 ERR_print_errors(bio_err);
554 goto end;
555 }
556
557 if (cipher != NULL)
558 {
559 SSL_CTX_set_cipher_list(c_ctx,cipher);
560 SSL_CTX_set_cipher_list(s_ctx,cipher);
561 }
562
bc36ee62 563#ifndef OPENSSL_NO_DH
77fa04a9 564 if (!no_dhe)
48c843c3 565 {
e4589582 566 if (dhe1024dsa)
48c843c3 567 {
e4589582 568 /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
77fa04a9 569 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
e4589582 570 dh=get_dh1024dsa();
48c843c3 571 }
e4589582
BM
572 else if (dhe1024)
573 dh=get_dh1024();
77fa04a9 574 else
77fa04a9
BM
575 dh=get_dh512();
576 SSL_CTX_set_tmp_dh(s_ctx,dh);
577 DH_free(dh);
578 }
e4589582
BM
579#else
580 (void)no_dhe;
58964a49
RE
581#endif
582
bc36ee62 583#ifndef OPENSSL_NO_RSA
58964a49 584 SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
d02b48c6
RE
585#endif
586
587 if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
588 {
589 ERR_print_errors(bio_err);
590 }
65b002f3
BM
591 else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
592 (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
d02b48c6
RE
593 {
594 ERR_print_errors(bio_err);
595 goto end;
596 }
597
598 if (client_auth)
599 {
600 SSL_CTX_use_certificate_file(c_ctx,client_cert,
601 SSL_FILETYPE_PEM);
65b002f3
BM
602 SSL_CTX_use_PrivateKey_file(c_ctx,
603 (client_key?client_key:client_cert),
d02b48c6
RE
604 SSL_FILETYPE_PEM);
605 }
606
607 if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
608 (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
609 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
610 (!SSL_CTX_set_default_verify_paths(c_ctx)))
611 {
58964a49 612 /* fprintf(stderr,"SSL_load_verify_locations\n"); */
d02b48c6 613 ERR_print_errors(bio_err);
58964a49 614 /* goto end; */
d02b48c6
RE
615 }
616
617 if (client_auth)
618 {
53002dc6 619 BIO_printf(bio_err,"client authentication\n");
d02b48c6
RE
620 SSL_CTX_set_verify(s_ctx,
621 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
622 verify_callback);
623 }
624 if (server_auth)
625 {
53002dc6 626 BIO_printf(bio_err,"server authentication\n");
d02b48c6
RE
627 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
628 verify_callback);
629 }
b1fe6ca1
BM
630
631 {
632 int session_id_context = 0;
633 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
634 }
d02b48c6 635
58964a49
RE
636 c_ssl=SSL_new(c_ctx);
637 s_ssl=SSL_new(s_ctx);
638
bc36ee62 639#ifndef OPENSSL_NO_KRB5
f9b3bff6
RL
640 if (c_ssl && c_ssl->kssl_ctx)
641 {
642 char localhost[257];
643
644 if (gethostname(localhost, 256) == 0)
645 {
646 kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
647 localhost);
648 }
649 }
bc36ee62 650#endif /* OPENSSL_NO_KRB5 */
f9b3bff6 651
58964a49
RE
652 for (i=0; i<number; i++)
653 {
654 if (!reuse) SSL_set_session(c_ssl,NULL);
95d29597 655 if (bio_pair)
563f1503 656 ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
95d29597
BM
657 else
658 ret=doit(s_ssl,c_ssl,bytes);
58964a49
RE
659 }
660
661 if (!verbose)
662 {
563f1503 663 print_details(c_ssl, "");
58964a49
RE
664 }
665 if ((number > 1) || (bytes > 1L))
53002dc6 666 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
563f1503
BM
667 if (print_time)
668 {
617d71bc
BM
669#ifdef CLOCKS_PER_SEC
670 /* "To determine the time in seconds, the value returned
671 * by the clock function should be divided by the value
672 * of the macro CLOCKS_PER_SEC."
673 * -- ISO/IEC 9899 */
563f1503
BM
674 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
675 "Approximate total client time: %6.2f s\n",
676 (double)s_time/CLOCKS_PER_SEC,
677 (double)c_time/CLOCKS_PER_SEC);
617d71bc
BM
678#else
679 /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
680 * -- cc on NeXTstep/OpenStep */
681 BIO_printf(bio_stdout,
682 "Approximate total server time: %6.2f units\n"
683 "Approximate total client time: %6.2f units\n",
684 (double)s_time,
685 (double)c_time);
686#endif
563f1503 687 }
58964a49
RE
688
689 SSL_free(s_ssl);
690 SSL_free(c_ssl);
691
d02b48c6
RE
692end:
693 if (s_ctx != NULL) SSL_CTX_free(s_ctx);
694 if (c_ctx != NULL) SSL_CTX_free(c_ctx);
695
696 if (bio_stdout != NULL) BIO_free(bio_stdout);
697
bc36ee62 698#ifndef OPENSSL_NO_RSA
46b3bd54
BM
699 free_tmp_rsa();
700#endif
dfeab068 701 ERR_free_strings();
d02b48c6
RE
702 ERR_remove_state(0);
703 EVP_cleanup();
704 CRYPTO_mem_leaks(bio_err);
79875776 705 if (bio_err != NULL) BIO_free(bio_err);
d02b48c6
RE
706 EXIT(ret);
707 }
708
563f1503
BM
709int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
710 clock_t *s_time, clock_t *c_time)
95d29597
BM
711 {
712 long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
713 BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
714 BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
95d29597
BM
715 int ret = 1;
716
717 size_t bufsiz = 256; /* small buffer for testing */
718
719 if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
720 goto err;
721 if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
722 goto err;
723
724 s_ssl_bio = BIO_new(BIO_f_ssl());
725 if (!s_ssl_bio)
726 goto err;
727
728 c_ssl_bio = BIO_new(BIO_f_ssl());
729 if (!c_ssl_bio)
730 goto err;
731
732 SSL_set_connect_state(c_ssl);
733 SSL_set_bio(c_ssl, client, client);
734 (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
735
736 SSL_set_accept_state(s_ssl);
737 SSL_set_bio(s_ssl, server, server);
738 (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
739
740 do
741 {
742 /* c_ssl_bio: SSL filter BIO
743 *
744 * client: pseudo-I/O for SSL library
745 *
746 * client_io: client's SSL communication; usually to be
747 * relayed over some I/O facility, but in this
748 * test program, we're the server, too:
749 *
750 * server_io: server's SSL communication
751 *
752 * server: pseudo-I/O for SSL library
753 *
754 * s_ssl_bio: SSL filter BIO
755 *
756 * The client and the server each employ a "BIO pair":
757 * client + client_io, server + server_io.
758 * BIO pairs are symmetric. A BIO pair behaves similar
759 * to a non-blocking socketpair (but both endpoints must
760 * be handled by the same thread).
7eea36bb
BM
761 * [Here we could connect client and server to the ends
762 * of a single BIO pair, but then this code would be less
763 * suitable as an example for BIO pairs in general.]
95d29597
BM
764 *
765 * Useful functions for querying the state of BIO pair endpoints:
766 *
767 * BIO_ctrl_pending(bio) number of bytes we can read now
f50c0497 768 * BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil
95d29597 769 * other side's read attempt
657e60fa 770 * BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now
95d29597
BM
771 *
772 * ..._read_request is never more than ..._write_guarantee;
773 * it depends on the application which one you should use.
774 */
775
776 /* We have non-blocking behaviour throughout this test program, but
777 * can be sure that there is *some* progress in each iteration; so
778 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
779 * -- we just try everything in each iteration
780 */
781
782 {
783 /* CLIENT */
784
785 MS_STATIC char cbuf[1024*8];
786 int i, r;
563f1503 787 clock_t c_clock = clock();
95d29597
BM
788
789 if (debug)
790 if (SSL_in_init(c_ssl))
791 printf("client waiting in SSL_connect - %s\n",
792 SSL_state_string_long(c_ssl));
793
794 if (cw_num > 0)
795 {
796 /* Write to server. */
797
798 if (cw_num > (long)sizeof cbuf)
799 i = sizeof cbuf;
800 else
801 i = (int)cw_num;
802 r = BIO_write(c_ssl_bio, cbuf, i);
29159a42 803 if (r < 0)
95d29597
BM
804 {
805 if (!BIO_should_retry(c_ssl_bio))
806 {
807 fprintf(stderr,"ERROR in CLIENT\n");
808 goto err;
809 }
810 /* BIO_should_retry(...) can just be ignored here.
811 * The library expects us to call BIO_write with
812 * the same arguments again, and that's what we will
813 * do in the next iteration. */
814 }
815 else if (r == 0)
816 {
817 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
818 goto err;
819 }
820 else
821 {
822 if (debug)
823 printf("client wrote %d\n", r);
824 cw_num -= r;
825 }
826 }
827
828 if (cr_num > 0)
829 {
830 /* Read from server. */
831
832 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
833 if (r < 0)
834 {
835 if (!BIO_should_retry(c_ssl_bio))
836 {
837 fprintf(stderr,"ERROR in CLIENT\n");
838 goto err;
839 }
840 /* Again, "BIO_should_retry" can be ignored. */
841 }
842 else if (r == 0)
843 {
844 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
845 goto err;
846 }
847 else
848 {
849 if (debug)
850 printf("client read %d\n", r);
851 cr_num -= r;
852 }
853 }
563f1503
BM
854
855 /* c_time and s_time increments will typically be very small
856 * (depending on machine speed and clock tick intervals),
857 * but sampling over a large number of connections should
858 * result in fairly accurate figures. We cannot guarantee
859 * a lot, however -- if each connection lasts for exactly
860 * one clock tick, it will be counted only for the client
861 * or only for the server or even not at all.
862 */
863 *c_time += (clock() - c_clock);
95d29597
BM
864 }
865
866 {
867 /* SERVER */
868
869 MS_STATIC char sbuf[1024*8];
870 int i, r;
563f1503 871 clock_t s_clock = clock();
95d29597
BM
872
873 if (debug)
874 if (SSL_in_init(s_ssl))
875 printf("server waiting in SSL_accept - %s\n",
876 SSL_state_string_long(s_ssl));
877
878 if (sw_num > 0)
879 {
880 /* Write to client. */
881
882 if (sw_num > (long)sizeof sbuf)
883 i = sizeof sbuf;
884 else
885 i = (int)sw_num;
886 r = BIO_write(s_ssl_bio, sbuf, i);
29159a42 887 if (r < 0)
95d29597
BM
888 {
889 if (!BIO_should_retry(s_ssl_bio))
890 {
891 fprintf(stderr,"ERROR in SERVER\n");
892 goto err;
893 }
894 /* Ignore "BIO_should_retry". */
895 }
896 else if (r == 0)
897 {
898 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
899 goto err;
900 }
901 else
902 {
903 if (debug)
904 printf("server wrote %d\n", r);
905 sw_num -= r;
906 }
907 }
908
909 if (sr_num > 0)
910 {
911 /* Read from client. */
912
913 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
914 if (r < 0)
915 {
916 if (!BIO_should_retry(s_ssl_bio))
917 {
918 fprintf(stderr,"ERROR in SERVER\n");
919 goto err;
920 }
921 /* blah, blah */
922 }
923 else if (r == 0)
924 {
925 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
926 goto err;
927 }
928 else
929 {
930 if (debug)
931 printf("server read %d\n", r);
932 sr_num -= r;
933 }
934 }
563f1503
BM
935
936 *s_time += (clock() - s_clock);
95d29597
BM
937 }
938
939 {
940 /* "I/O" BETWEEN CLIENT AND SERVER. */
941
95d29597 942 size_t r1, r2;
6f7af152
BM
943 BIO *io1 = server_io, *io2 = client_io;
944 /* we use the non-copying interface for io1
945 * and the standard BIO_write/BIO_read interface for io2
946 */
947
95d29597
BM
948 static int prev_progress = 1;
949 int progress = 0;
950
6f7af152 951 /* io1 to io2 */
95d29597
BM
952 do
953 {
6f7af152
BM
954 size_t num;
955 int r;
956
957 r1 = BIO_ctrl_pending(io1);
958 r2 = BIO_ctrl_get_write_guarantee(io2);
95d29597
BM
959
960 num = r1;
961 if (r2 < num)
962 num = r2;
963 if (num)
964 {
6f7af152
BM
965 char *dataptr;
966
95d29597
BM
967 if (INT_MAX < num) /* yeah, right */
968 num = INT_MAX;
969
6f7af152
BM
970 r = BIO_nread(io1, &dataptr, (int)num);
971 assert(r > 0);
972 assert(r <= (int)num);
973 /* possibly r < num (non-contiguous data) */
974 num = r;
975 r = BIO_write(io2, dataptr, (int)num);
95d29597
BM
976 if (r != (int)num) /* can't happen */
977 {
978 fprintf(stderr, "ERROR: BIO_write could not write "
979 "BIO_ctrl_get_write_guarantee() bytes");
980 goto err;
981 }
982 progress = 1;
983
984 if (debug)
6f7af152
BM
985 printf((io1 == client_io) ?
986 "C->S relaying: %d bytes\n" :
987 "S->C relaying: %d bytes\n",
988 (int)num);
95d29597
BM
989 }
990 }
991 while (r1 && r2);
992
6f7af152
BM
993 /* io2 to io1 */
994 {
995 size_t num;
996 int r;
997
998 r1 = BIO_ctrl_pending(io2);
999 r2 = BIO_ctrl_get_read_request(io1);
1000 /* here we could use ..._get_write_guarantee instead of
1001 * ..._get_read_request, but by using the latter
1002 * we test restartability of the SSL implementation
1003 * more thoroughly */
95d29597
BM
1004 num = r1;
1005 if (r2 < num)
1006 num = r2;
1007 if (num)
1008 {
6f7af152
BM
1009 char *dataptr;
1010
95d29597
BM
1011 if (INT_MAX < num)
1012 num = INT_MAX;
6f7af152
BM
1013
1014 if (num > 1)
cb0369d8 1015 --num; /* test restartability even more thoroughly */
95d29597 1016
6f7af152
BM
1017 r = BIO_nwrite(io1, &dataptr, (int)num);
1018 assert(r > 0);
1019 assert(r <= (int)num);
1020 num = r;
1021 r = BIO_read(io2, dataptr, (int)num);
95d29597
BM
1022 if (r != (int)num) /* can't happen */
1023 {
1024 fprintf(stderr, "ERROR: BIO_read could not read "
1025 "BIO_ctrl_pending() bytes");
1026 goto err;
1027 }
95d29597 1028 progress = 1;
6f7af152 1029
95d29597 1030 if (debug)
6f7af152
BM
1031 printf((io2 == client_io) ?
1032 "C->S relaying: %d bytes\n" :
1033 "S->C relaying: %d bytes\n",
1034 (int)num);
95d29597 1035 }
6f7af152 1036 } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
95d29597
BM
1037
1038 if (!progress && !prev_progress)
1039 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
95d29597
BM
1040 {
1041 fprintf(stderr, "ERROR: got stuck\n");
d7fcc7f6
BM
1042 if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
1043 {
1044 fprintf(stderr, "This can happen for SSL2 because "
1045 "CLIENT-FINISHED and SERVER-VERIFY are written \n"
1046 "concurrently ...");
1047 if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
1048 && strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
1049 {
1050 fprintf(stderr, " ok.\n");
1051 goto end;
1052 }
1053 }
1054 fprintf(stderr, " ERROR.\n");
95d29597
BM
1055 goto err;
1056 }
1057 prev_progress = progress;
1058 }
1059 }
1060 while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
1061
95d29597 1062 if (verbose)
563f1503
BM
1063 print_details(c_ssl, "DONE via BIO pair: ");
1064end:
95d29597
BM
1065 ret = 0;
1066
1067 err:
1068 ERR_print_errors(bio_err);
1069
1070 if (server)
1071 BIO_free(server);
1072 if (server_io)
1073 BIO_free(server_io);
1074 if (client)
1075 BIO_free(client);
1076 if (client_io)
1077 BIO_free(client_io);
1078 if (s_ssl_bio)
1079 BIO_free(s_ssl_bio);
1080 if (c_ssl_bio)
1081 BIO_free(c_ssl_bio);
1082
1083 return ret;
1084 }
1085
1086
d02b48c6
RE
1087#define W_READ 1
1088#define W_WRITE 2
1089#define C_DONE 1
1090#define S_DONE 2
1091
6b691a5c 1092int doit(SSL *s_ssl, SSL *c_ssl, long count)
d02b48c6 1093 {
58964a49
RE
1094 MS_STATIC char cbuf[1024*8],sbuf[1024*8];
1095 long cw_num=count,cr_num=count;
1096 long sw_num=count,sr_num=count;
d02b48c6 1097 int ret=1;
d02b48c6
RE
1098 BIO *c_to_s=NULL;
1099 BIO *s_to_c=NULL;
1100 BIO *c_bio=NULL;
1101 BIO *s_bio=NULL;
1102 int c_r,c_w,s_r,s_w;
1103 int c_want,s_want;
58964a49 1104 int i,j;
d02b48c6
RE
1105 int done=0;
1106 int c_write,s_write;
1107 int do_server=0,do_client=0;
d02b48c6 1108
d02b48c6
RE
1109 c_to_s=BIO_new(BIO_s_mem());
1110 s_to_c=BIO_new(BIO_s_mem());
1111 if ((s_to_c == NULL) || (c_to_s == NULL))
1112 {
1113 ERR_print_errors(bio_err);
1114 goto err;
1115 }
1116
1117 c_bio=BIO_new(BIO_f_ssl());
1118 s_bio=BIO_new(BIO_f_ssl());
1119 if ((c_bio == NULL) || (s_bio == NULL))
1120 {
1121 ERR_print_errors(bio_err);
1122 goto err;
1123 }
1124
1125 SSL_set_connect_state(c_ssl);
1126 SSL_set_bio(c_ssl,s_to_c,c_to_s);
58964a49 1127 BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
d02b48c6
RE
1128
1129 SSL_set_accept_state(s_ssl);
1130 SSL_set_bio(s_ssl,c_to_s,s_to_c);
58964a49 1131 BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
d02b48c6
RE
1132
1133 c_r=0; s_r=1;
1134 c_w=1; s_w=0;
1135 c_want=W_WRITE;
1136 s_want=0;
1137 c_write=1,s_write=0;
1138
1139 /* We can always do writes */
1140 for (;;)
1141 {
1142 do_server=0;
1143 do_client=0;
1144
1145 i=(int)BIO_pending(s_bio);
1146 if ((i && s_r) || s_w) do_server=1;
1147
1148 i=(int)BIO_pending(c_bio);
1149 if ((i && c_r) || c_w) do_client=1;
1150
58964a49 1151 if (do_server && debug)
d02b48c6
RE
1152 {
1153 if (SSL_in_init(s_ssl))
1154 printf("server waiting in SSL_accept - %s\n",
1155 SSL_state_string_long(s_ssl));
58964a49 1156/* else if (s_write)
d02b48c6 1157 printf("server:SSL_write()\n");
58964a49
RE
1158 else
1159 printf("server:SSL_read()\n"); */
d02b48c6
RE
1160 }
1161
58964a49 1162 if (do_client && debug)
d02b48c6
RE
1163 {
1164 if (SSL_in_init(c_ssl))
1165 printf("client waiting in SSL_connect - %s\n",
1166 SSL_state_string_long(c_ssl));
58964a49 1167/* else if (c_write)
d02b48c6
RE
1168 printf("client:SSL_write()\n");
1169 else
58964a49 1170 printf("client:SSL_read()\n"); */
d02b48c6
RE
1171 }
1172
1173 if (!do_client && !do_server)
1174 {
1175 fprintf(stdout,"ERROR IN STARTUP\n");
1176 ERR_print_errors(bio_err);
1177 break;
1178 }
1179 if (do_client && !(done & C_DONE))
1180 {
1181 if (c_write)
1182 {
58964a49
RE
1183 j=(cw_num > (long)sizeof(cbuf))
1184 ?sizeof(cbuf):(int)cw_num;
1185 i=BIO_write(c_bio,cbuf,j);
d02b48c6
RE
1186 if (i < 0)
1187 {
1188 c_r=0;
1189 c_w=0;
1190 if (BIO_should_retry(c_bio))
1191 {
1192 if (BIO_should_read(c_bio))
1193 c_r=1;
1194 if (BIO_should_write(c_bio))
1195 c_w=1;
1196 }
1197 else
1198 {
1199 fprintf(stderr,"ERROR in CLIENT\n");
1200 ERR_print_errors(bio_err);
1201 goto err;
1202 }
1203 }
1204 else if (i == 0)
1205 {
1206 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1207 goto err;
1208 }
1209 else
1210 {
58964a49
RE
1211 if (debug)
1212 printf("client wrote %d\n",i);
d02b48c6 1213 /* ok */
58964a49 1214 s_r=1;
d02b48c6 1215 c_write=0;
58964a49 1216 cw_num-=i;
d02b48c6
RE
1217 }
1218 }
1219 else
1220 {
58964a49 1221 i=BIO_read(c_bio,cbuf,sizeof(cbuf));
d02b48c6
RE
1222 if (i < 0)
1223 {
1224 c_r=0;
1225 c_w=0;
1226 if (BIO_should_retry(c_bio))
1227 {
1228 if (BIO_should_read(c_bio))
1229 c_r=1;
1230 if (BIO_should_write(c_bio))
1231 c_w=1;
1232 }
1233 else
1234 {
1235 fprintf(stderr,"ERROR in CLIENT\n");
1236 ERR_print_errors(bio_err);
1237 goto err;
1238 }
1239 }
1240 else if (i == 0)
1241 {
1242 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1243 goto err;
1244 }
1245 else
1246 {
58964a49
RE
1247 if (debug)
1248 printf("client read %d\n",i);
1249 cr_num-=i;
1250 if (sw_num > 0)
1251 {
1252 s_write=1;
1253 s_w=1;
1254 }
1255 if (cr_num <= 0)
1256 {
1257 s_write=1;
1258 s_w=1;
1259 done=S_DONE|C_DONE;
1260 }
d02b48c6
RE
1261 }
1262 }
1263 }
1264
1265 if (do_server && !(done & S_DONE))
1266 {
1267 if (!s_write)
1268 {
58964a49 1269 i=BIO_read(s_bio,sbuf,sizeof(cbuf));
d02b48c6
RE
1270 if (i < 0)
1271 {
1272 s_r=0;
1273 s_w=0;
1274 if (BIO_should_retry(s_bio))
1275 {
1276 if (BIO_should_read(s_bio))
1277 s_r=1;
1278 if (BIO_should_write(s_bio))
1279 s_w=1;
1280 }
1281 else
1282 {
1283 fprintf(stderr,"ERROR in SERVER\n");
1284 ERR_print_errors(bio_err);
1285 goto err;
1286 }
1287 }
1288 else if (i == 0)
1289 {
1290 ERR_print_errors(bio_err);
1291 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
1292 goto err;
1293 }
1294 else
1295 {
58964a49
RE
1296 if (debug)
1297 printf("server read %d\n",i);
1298 sr_num-=i;
1299 if (cw_num > 0)
1300 {
1301 c_write=1;
1302 c_w=1;
1303 }
1304 if (sr_num <= 0)
1305 {
1306 s_write=1;
1307 s_w=1;
1308 c_write=0;
1309 }
d02b48c6
RE
1310 }
1311 }
1312 else
1313 {
58964a49
RE
1314 j=(sw_num > (long)sizeof(sbuf))?
1315 sizeof(sbuf):(int)sw_num;
1316 i=BIO_write(s_bio,sbuf,j);
d02b48c6
RE
1317 if (i < 0)
1318 {
1319 s_r=0;
1320 s_w=0;
1321 if (BIO_should_retry(s_bio))
1322 {
1323 if (BIO_should_read(s_bio))
1324 s_r=1;
1325 if (BIO_should_write(s_bio))
1326 s_w=1;
1327 }
1328 else
1329 {
1330 fprintf(stderr,"ERROR in SERVER\n");
1331 ERR_print_errors(bio_err);
1332 goto err;
1333 }
1334 }
1335 else if (i == 0)
1336 {
1337 ERR_print_errors(bio_err);
1338 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
1339 goto err;
1340 }
1341 else
1342 {
58964a49
RE
1343 if (debug)
1344 printf("server wrote %d\n",i);
1345 sw_num-=i;
d02b48c6 1346 s_write=0;
58964a49
RE
1347 c_r=1;
1348 if (sw_num <= 0)
1349 done|=S_DONE;
d02b48c6
RE
1350 }
1351 }
1352 }
1353
1354 if ((done & S_DONE) && (done & C_DONE)) break;
1355 }
1356
58964a49 1357 if (verbose)
563f1503 1358 print_details(c_ssl, "DONE: ");
d02b48c6
RE
1359 ret=0;
1360err:
1361 /* We have to set the BIO's to NULL otherwise they will be
26a3a48d 1362 * OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and
d02b48c6
RE
1363 * again when c_ssl is SSL_free()ed.
1364 * This is a hack required because s_ssl and c_ssl are sharing the same
1365 * BIO structure and SSL_set_bio() and SSL_free() automatically
1366 * BIO_free non NULL entries.
1367 * You should not normally do this or be required to do this */
1368 if (s_ssl != NULL)
1369 {
1370 s_ssl->rbio=NULL;
1371 s_ssl->wbio=NULL;
1372 }
1373 if (c_ssl != NULL)
1374 {
1375 c_ssl->rbio=NULL;
1376 c_ssl->wbio=NULL;
1377 }
1378
1379 if (c_to_s != NULL) BIO_free(c_to_s);
1380 if (s_to_c != NULL) BIO_free(s_to_c);
58964a49
RE
1381 if (c_bio != NULL) BIO_free_all(c_bio);
1382 if (s_bio != NULL) BIO_free_all(s_bio);
d02b48c6
RE
1383 return(ret);
1384 }
1385
396f6314 1386static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
d02b48c6
RE
1387 {
1388 char *s,buf[256];
1389
1390 s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,256);
1391 if (s != NULL)
1392 {
1393 if (ok)
1394 fprintf(stderr,"depth=%d %s\n",ctx->error_depth,buf);
1395 else
1396 fprintf(stderr,"depth=%d error=%d %s\n",
1397 ctx->error_depth,ctx->error,buf);
1398 }
1399
1400 if (ok == 0)
1401 {
1402 switch (ctx->error)
1403 {
1404 case X509_V_ERR_CERT_NOT_YET_VALID:
1405 case X509_V_ERR_CERT_HAS_EXPIRED:
1406 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
1407 ok=1;
1408 }
1409 }
1410
1411 return(ok);
1412 }
1413
bc36ee62 1414#ifndef OPENSSL_NO_RSA
46b3bd54
BM
1415static RSA *rsa_tmp=NULL;
1416
df63a389 1417static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
58964a49 1418 {
58964a49
RE
1419 if (rsa_tmp == NULL)
1420 {
60e31c3a 1421 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
d58d092b 1422 (void)BIO_flush(bio_err);
60e31c3a 1423 rsa_tmp=RSA_generate_key(keylength,RSA_F4,NULL,NULL);
58964a49 1424 BIO_printf(bio_err,"\n");
d58d092b 1425 (void)BIO_flush(bio_err);
58964a49
RE
1426 }
1427 return(rsa_tmp);
1428 }
46b3bd54
BM
1429
1430static void free_tmp_rsa(void)
1431 {
1432 if (rsa_tmp != NULL)
1433 {
1434 RSA_free(rsa_tmp);
1435 rsa_tmp = NULL;
1436 }
1437 }
79df9d62 1438#endif
53002dc6 1439
bc36ee62 1440#ifndef OPENSSL_NO_DH
e4589582
BM
1441/* These DH parameters have been generated as follows:
1442 * $ openssl dhparam -C -noout 512
1443 * $ openssl dhparam -C -noout 1024
1444 * $ openssl dhparam -C -noout -dsaparam 1024
1445 * (The third function has been renamed to avoid name conflicts.)
1446 */
f3f316f1 1447static DH *get_dh512()
e4589582
BM
1448 {
1449 static unsigned char dh512_p[]={
1450 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
1451 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
1452 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
1453 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
1454 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
1455 0x02,0xC5,0xAE,0x23,
1456 };
1457 static unsigned char dh512_g[]={
1458 0x02,
1459 };
1460 DH *dh;
1461
1462 if ((dh=DH_new()) == NULL) return(NULL);
1463 dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
1464 dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
1465 if ((dh->p == NULL) || (dh->g == NULL))
1466 { DH_free(dh); return(NULL); }
1467 return(dh);
1468 }
1469
f3f316f1 1470static DH *get_dh1024()
53002dc6 1471 {
e4589582
BM
1472 static unsigned char dh1024_p[]={
1473 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
1474 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
1475 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
1476 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
1477 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
1478 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
1479 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
1480 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
1481 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
1482 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
1483 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
1484 };
1485 static unsigned char dh1024_g[]={
1486 0x02,
1487 };
1488 DH *dh;
1489
1490 if ((dh=DH_new()) == NULL) return(NULL);
1491 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
1492 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
1493 if ((dh->p == NULL) || (dh->g == NULL))
1494 { DH_free(dh); return(NULL); }
1495 return(dh);
1496 }
53002dc6 1497
f3f316f1 1498static DH *get_dh1024dsa()
e4589582
BM
1499 {
1500 static unsigned char dh1024_p[]={
1501 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
1502 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
1503 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
1504 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
1505 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
1506 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
1507 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
1508 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
1509 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
1510 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
1511 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
1512 };
1513 static unsigned char dh1024_g[]={
1514 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
1515 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
1516 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
1517 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
1518 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
1519 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
1520 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
1521 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
1522 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
1523 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
1524 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
1525 };
1526 DH *dh;
53002dc6 1527
e4589582
BM
1528 if ((dh=DH_new()) == NULL) return(NULL);
1529 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
1530 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
1531 if ((dh->p == NULL) || (dh->g == NULL))
1532 { DH_free(dh); return(NULL); }
1533 dh->length = 160;
1534 return(dh);
53002dc6
BM
1535 }
1536#endif