Make the s_server command listen on IPv6 only when requested
[openssl.git] / test / ssltest_old.c
1 /*
2  * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
3  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
4  * Copyright 2005 Nokia. All rights reserved.
5  *
6  * Licensed under the OpenSSL license (the "License").  You may not use
7  * this file except in compliance with the License.  You can obtain a copy
8  * in the file LICENSE in the source distribution or at
9  * https://www.openssl.org/source/license.html
10  */
11
12 #include "e_os.h"
13
14 /* Or gethostname won't be declared properly on Linux and GNU platforms. */
15 #ifndef _BSD_SOURCE
16 # define _BSD_SOURCE 1
17 #endif
18 #ifndef _DEFAULT_SOURCE
19 # define _DEFAULT_SOURCE 1
20 #endif
21
22 #include <assert.h>
23 #include <errno.h>
24 #include <limits.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <time.h>
29
30 #include "internal/nelem.h"
31
32 #ifdef OPENSSL_SYS_VMS
33 /*
34  * Or isascii won't be declared properly on VMS (at least with DECompHP C).
35  */
36 # define _XOPEN_SOURCE 500
37 #endif
38
39 #include <ctype.h>
40
41 #include <openssl/bio.h>
42 #include <openssl/crypto.h>
43 #include <openssl/evp.h>
44 #include <openssl/x509.h>
45 #include <openssl/x509v3.h>
46 #include <openssl/ssl.h>
47 #include <openssl/err.h>
48 #include <openssl/rand.h>
49 #ifndef OPENSSL_NO_RSA
50 # include <openssl/rsa.h>
51 #endif
52 #ifndef OPENSSL_NO_DSA
53 # include <openssl/dsa.h>
54 #endif
55 #ifndef OPENSSL_NO_DH
56 # include <openssl/dh.h>
57 #endif
58 #include <openssl/bn.h>
59 #ifndef OPENSSL_NO_CT
60 # include <openssl/ct.h>
61 #endif
62
63 /*
64  * Or gethostname won't be declared properly
65  * on Compaq platforms (at least with DEC C).
66  * Do not try to put it earlier, or IPv6 includes
67  * get screwed...
68  */
69 #define _XOPEN_SOURCE_EXTENDED  1
70
71 #ifdef OPENSSL_SYS_WINDOWS
72 # include <winsock.h>
73 #else
74 # include OPENSSL_UNISTD
75 #endif
76
77 static SSL_CTX *s_ctx = NULL;
78 static SSL_CTX *s_ctx2 = NULL;
79
80 /*
81  * There is really no standard for this, so let's assign something
82  * only for this test
83  */
84 #define COMP_ZLIB       1
85
86 static int verify_callback(int ok, X509_STORE_CTX *ctx);
87 static int app_verify_callback(X509_STORE_CTX *ctx, void *arg);
88 #define APP_CALLBACK_STRING "Test Callback Argument"
89 struct app_verify_arg {
90     char *string;
91     int app_verify;
92 };
93
94 #ifndef OPENSSL_NO_DH
95 static DH *get_dh512(void);
96 static DH *get_dh1024(void);
97 static DH *get_dh1024dsa(void);
98 #endif
99
100 static char *psk_key = NULL;    /* by default PSK is not used */
101 #ifndef OPENSSL_NO_PSK
102 static unsigned int psk_client_callback(SSL *ssl, const char *hint,
103                                         char *identity,
104                                         unsigned int max_identity_len,
105                                         unsigned char *psk,
106                                         unsigned int max_psk_len);
107 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
108                                         unsigned char *psk,
109                                         unsigned int max_psk_len);
110 #endif
111
112 static BIO *bio_err = NULL;
113 static BIO *bio_stdout = NULL;
114
115 #ifndef OPENSSL_NO_NEXTPROTONEG
116 /* Note that this code assumes that this is only a one element list: */
117 static const char NEXT_PROTO_STRING[] = "\x09testproto";
118 static int npn_client = 0;
119 static int npn_server = 0;
120 static int npn_server_reject = 0;
121
122 static int cb_client_npn(SSL *s, unsigned char **out, unsigned char *outlen,
123                          const unsigned char *in, unsigned int inlen,
124                          void *arg)
125 {
126     /*
127      * This callback only returns the protocol string, rather than a length
128      * prefixed set. We assume that NEXT_PROTO_STRING is a one element list
129      * and remove the first byte to chop off the length prefix.
130      */
131     *out = (unsigned char *)NEXT_PROTO_STRING + 1;
132     *outlen = sizeof(NEXT_PROTO_STRING) - 2;
133     return SSL_TLSEXT_ERR_OK;
134 }
135
136 static int cb_server_npn(SSL *s, const unsigned char **data,
137                          unsigned int *len, void *arg)
138 {
139     *data = (const unsigned char *)NEXT_PROTO_STRING;
140     *len = sizeof(NEXT_PROTO_STRING) - 1;
141     return SSL_TLSEXT_ERR_OK;
142 }
143
144 static int cb_server_rejects_npn(SSL *s, const unsigned char **data,
145                                  unsigned int *len, void *arg)
146 {
147     return SSL_TLSEXT_ERR_NOACK;
148 }
149
150 static int verify_npn(SSL *client, SSL *server)
151 {
152     const unsigned char *client_s;
153     unsigned client_len;
154     const unsigned char *server_s;
155     unsigned server_len;
156
157     SSL_get0_next_proto_negotiated(client, &client_s, &client_len);
158     SSL_get0_next_proto_negotiated(server, &server_s, &server_len);
159
160     if (client_len) {
161         BIO_printf(bio_stdout, "Client NPN: ");
162         BIO_write(bio_stdout, client_s, client_len);
163         BIO_printf(bio_stdout, "\n");
164     }
165
166     if (server_len) {
167         BIO_printf(bio_stdout, "Server NPN: ");
168         BIO_write(bio_stdout, server_s, server_len);
169         BIO_printf(bio_stdout, "\n");
170     }
171
172     /*
173      * If an NPN string was returned, it must be the protocol that we
174      * expected to negotiate.
175      */
176     if (client_len && (client_len != sizeof(NEXT_PROTO_STRING) - 2 ||
177                        memcmp(client_s, NEXT_PROTO_STRING + 1, client_len)))
178         return -1;
179     if (server_len && (server_len != sizeof(NEXT_PROTO_STRING) - 2 ||
180                        memcmp(server_s, NEXT_PROTO_STRING + 1, server_len)))
181         return -1;
182
183     if (!npn_client && client_len)
184         return -1;
185     if (!npn_server && server_len)
186         return -1;
187     if (npn_server_reject && server_len)
188         return -1;
189     if (npn_client && npn_server && (!client_len || !server_len))
190         return -1;
191
192     return 0;
193 }
194 #endif
195
196 static const char *alpn_client;
197 static char *alpn_server;
198 static char *alpn_server2;
199 static const char *alpn_expected;
200 static unsigned char *alpn_selected;
201 static const char *server_min_proto;
202 static const char *server_max_proto;
203 static const char *client_min_proto;
204 static const char *client_max_proto;
205 static const char *should_negotiate;
206 static const char *sn_client;
207 static const char *sn_server1;
208 static const char *sn_server2;
209 static int sn_expect = 0;
210 static const char *server_sess_out;
211 static const char *server_sess_in;
212 static const char *client_sess_out;
213 static const char *client_sess_in;
214 static SSL_SESSION *server_sess;
215 static SSL_SESSION *client_sess;
216
217 static int servername_cb(SSL *s, int *ad, void *arg)
218 {
219     const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
220     if (sn_server2 == NULL) {
221         BIO_printf(bio_stdout, "Servername 2 is NULL\n");
222         return SSL_TLSEXT_ERR_NOACK;
223     }
224
225     if (servername) {
226         if (s_ctx2 != NULL && sn_server2 != NULL &&
227             !strcasecmp(servername, sn_server2)) {
228             BIO_printf(bio_stdout, "Switching server context.\n");
229             SSL_set_SSL_CTX(s, s_ctx2);
230         }
231     }
232     return SSL_TLSEXT_ERR_OK;
233 }
234 static int verify_servername(SSL *client, SSL *server)
235 {
236     /* just need to see if sn_context is what we expect */
237     SSL_CTX* ctx = SSL_get_SSL_CTX(server);
238     if (sn_expect == 0)
239         return 0;
240     if (sn_expect == 1 && ctx == s_ctx)
241         return 0;
242     if (sn_expect == 2 && ctx == s_ctx2)
243         return 0;
244     BIO_printf(bio_stdout, "Servername: expected context %d\n", sn_expect);
245     if (ctx == s_ctx2)
246         BIO_printf(bio_stdout, "Servername: context is 2\n");
247     else if (ctx == s_ctx)
248         BIO_printf(bio_stdout, "Servername: context is 1\n");
249     else
250         BIO_printf(bio_stdout, "Servername: context is unknown\n");
251     return -1;
252 }
253
254
255 /*-
256  * next_protos_parse parses a comma separated list of strings into a string
257  * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
258  *   outlen: (output) set to the length of the resulting buffer on success.
259  *   in: a NUL terminated string like "abc,def,ghi"
260  *
261  *   returns: a malloced buffer or NULL on failure.
262  */
263 static unsigned char *next_protos_parse(size_t *outlen,
264                                         const char *in)
265 {
266     size_t len;
267     unsigned char *out;
268     size_t i, start = 0;
269
270     len = strlen(in);
271     if (len >= 65535)
272         return NULL;
273
274     out = OPENSSL_malloc(strlen(in) + 1);
275     if (!out)
276         return NULL;
277
278     for (i = 0; i <= len; ++i) {
279         if (i == len || in[i] == ',') {
280             if (i - start > 255) {
281                 OPENSSL_free(out);
282                 return NULL;
283             }
284             out[start] = (unsigned char)(i - start);
285             start = i + 1;
286         } else
287             out[i + 1] = in[i];
288     }
289
290     *outlen = len + 1;
291     return out;
292 }
293
294 static int cb_server_alpn(SSL *s, const unsigned char **out,
295                           unsigned char *outlen, const unsigned char *in,
296                           unsigned int inlen, void *arg)
297 {
298     unsigned char *protos;
299     size_t protos_len;
300     char* alpn_str = arg;
301
302     protos = next_protos_parse(&protos_len, alpn_str);
303     if (protos == NULL) {
304         fprintf(stderr, "failed to parser ALPN server protocol string: %s\n",
305                 alpn_str);
306         abort();
307     }
308
309     if (SSL_select_next_proto
310         ((unsigned char **)out, outlen, protos, protos_len, in,
311          inlen) != OPENSSL_NPN_NEGOTIATED) {
312         OPENSSL_free(protos);
313         return SSL_TLSEXT_ERR_NOACK;
314     }
315
316     /*
317      * Make a copy of the selected protocol which will be freed in
318      * verify_alpn.
319      */
320     alpn_selected = OPENSSL_malloc(*outlen);
321     memcpy(alpn_selected, *out, *outlen);
322     *out = alpn_selected;
323
324     OPENSSL_free(protos);
325     return SSL_TLSEXT_ERR_OK;
326 }
327
328 static int verify_alpn(SSL *client, SSL *server)
329 {
330     const unsigned char *client_proto, *server_proto;
331     unsigned int client_proto_len = 0, server_proto_len = 0;
332     SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
333     SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
334
335     OPENSSL_free(alpn_selected);
336     alpn_selected = NULL;
337
338     if (client_proto_len != server_proto_len) {
339         BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
340         goto err;
341     }
342
343     if (client_proto != NULL &&
344         memcmp(client_proto, server_proto, client_proto_len) != 0) {
345         BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
346         goto err;
347     }
348
349     if (client_proto_len > 0 && alpn_expected == NULL) {
350         BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
351         goto err;
352     }
353
354     if (alpn_expected != NULL &&
355         (client_proto_len != strlen(alpn_expected) ||
356          memcmp(client_proto, alpn_expected, client_proto_len) != 0)) {
357         BIO_printf(bio_stdout,
358                    "ALPN selected protocols not equal to expected protocol: %s\n",
359                    alpn_expected);
360         goto err;
361     }
362
363     return 0;
364
365  err:
366     BIO_printf(bio_stdout, "ALPN results: client: '");
367     BIO_write(bio_stdout, client_proto, client_proto_len);
368     BIO_printf(bio_stdout, "', server: '");
369     BIO_write(bio_stdout, server_proto, server_proto_len);
370     BIO_printf(bio_stdout, "'\n");
371     BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '",
372                    alpn_client);
373     if (SSL_get_SSL_CTX(server) == s_ctx2) {
374         BIO_printf(bio_stdout, "%s'\n",
375                    alpn_server2);
376     } else {
377         BIO_printf(bio_stdout, "%s'\n",
378                    alpn_server);
379     }
380     return -1;
381 }
382
383 /*
384  * WARNING : below extension types are *NOT* IETF assigned, and could
385  * conflict if these types are reassigned and handled specially by OpenSSL
386  * in the future
387  */
388 #define TACK_EXT_TYPE 62208
389 #define CUSTOM_EXT_TYPE_0 1000
390 #define CUSTOM_EXT_TYPE_1 1001
391 #define CUSTOM_EXT_TYPE_2 1002
392 #define CUSTOM_EXT_TYPE_3 1003
393
394 static const char custom_ext_cli_string[] = "abc";
395 static const char custom_ext_srv_string[] = "defg";
396
397 /* These set from cmdline */
398 static char *serverinfo_file = NULL;
399 static int serverinfo_sct = 0;
400 static int serverinfo_tack = 0;
401
402 /* These set based on extension callbacks */
403 static int serverinfo_sct_seen = 0;
404 static int serverinfo_tack_seen = 0;
405 static int serverinfo_other_seen = 0;
406
407 /* This set from cmdline */
408 static int custom_ext = 0;
409
410 /* This set based on extension callbacks */
411 static int custom_ext_error = 0;
412
413 static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type,
414                                    const unsigned char *in, size_t inlen,
415                                    int *al, void *arg)
416 {
417     if (ext_type == TLSEXT_TYPE_signed_certificate_timestamp)
418         serverinfo_sct_seen++;
419     else if (ext_type == TACK_EXT_TYPE)
420         serverinfo_tack_seen++;
421     else
422         serverinfo_other_seen++;
423     return 1;
424 }
425
426 static int verify_serverinfo()
427 {
428     if (serverinfo_sct != serverinfo_sct_seen)
429         return -1;
430     if (serverinfo_tack != serverinfo_tack_seen)
431         return -1;
432     if (serverinfo_other_seen)
433         return -1;
434     return 0;
435 }
436
437 /*-
438  * Four test cases for custom extensions:
439  * 0 - no ClientHello extension or ServerHello response
440  * 1 - ClientHello with "abc", no response
441  * 2 - ClientHello with "abc", empty response
442  * 3 - ClientHello with "abc", "defg" response
443  */
444
445 static int custom_ext_0_cli_add_cb(SSL *s, unsigned int ext_type,
446                                    const unsigned char **out,
447                                    size_t *outlen, int *al, void *arg)
448 {
449     if (ext_type != CUSTOM_EXT_TYPE_0)
450         custom_ext_error = 1;
451     return 0;                   /* Don't send an extension */
452 }
453
454 static int custom_ext_0_cli_parse_cb(SSL *s, unsigned int ext_type,
455                                      const unsigned char *in,
456                                      size_t inlen, int *al, void *arg)
457 {
458     return 1;
459 }
460
461 static int custom_ext_1_cli_add_cb(SSL *s, unsigned int ext_type,
462                                    const unsigned char **out,
463                                    size_t *outlen, int *al, void *arg)
464 {
465     if (ext_type != CUSTOM_EXT_TYPE_1)
466         custom_ext_error = 1;
467     *out = (const unsigned char *)custom_ext_cli_string;
468     *outlen = strlen(custom_ext_cli_string);
469     return 1;                   /* Send "abc" */
470 }
471
472 static int custom_ext_1_cli_parse_cb(SSL *s, unsigned int ext_type,
473                                      const unsigned char *in,
474                                      size_t inlen, int *al, void *arg)
475 {
476     return 1;
477 }
478
479 static int custom_ext_2_cli_add_cb(SSL *s, unsigned int ext_type,
480                                    const unsigned char **out,
481                                    size_t *outlen, int *al, void *arg)
482 {
483     if (ext_type != CUSTOM_EXT_TYPE_2)
484         custom_ext_error = 1;
485     *out = (const unsigned char *)custom_ext_cli_string;
486     *outlen = strlen(custom_ext_cli_string);
487     return 1;                   /* Send "abc" */
488 }
489
490 static int custom_ext_2_cli_parse_cb(SSL *s, unsigned int ext_type,
491                                      const unsigned char *in,
492                                      size_t inlen, int *al, void *arg)
493 {
494     if (ext_type != CUSTOM_EXT_TYPE_2)
495         custom_ext_error = 1;
496     if (inlen != 0)
497         custom_ext_error = 1;   /* Should be empty response */
498     return 1;
499 }
500
501 static int custom_ext_3_cli_add_cb(SSL *s, unsigned int ext_type,
502                                    const unsigned char **out,
503                                    size_t *outlen, int *al, void *arg)
504 {
505     if (ext_type != CUSTOM_EXT_TYPE_3)
506         custom_ext_error = 1;
507     *out = (const unsigned char *)custom_ext_cli_string;
508     *outlen = strlen(custom_ext_cli_string);
509     return 1;                   /* Send "abc" */
510 }
511
512 static int custom_ext_3_cli_parse_cb(SSL *s, unsigned int ext_type,
513                                      const unsigned char *in,
514                                      size_t inlen, int *al, void *arg)
515 {
516     if (ext_type != CUSTOM_EXT_TYPE_3)
517         custom_ext_error = 1;
518     if (inlen != strlen(custom_ext_srv_string))
519         custom_ext_error = 1;
520     if (memcmp(custom_ext_srv_string, in, inlen) != 0)
521         custom_ext_error = 1;   /* Check for "defg" */
522     return 1;
523 }
524
525 /*
526  * custom_ext_0_cli_add_cb returns 0 - the server won't receive a callback
527  * for this extension
528  */
529 static int custom_ext_0_srv_parse_cb(SSL *s, unsigned int ext_type,
530                                      const unsigned char *in,
531                                      size_t inlen, int *al, void *arg)
532 {
533     custom_ext_error = 1;
534     return 1;
535 }
536
537 /* 'add' callbacks are only called if the 'parse' callback is called */
538 static int custom_ext_0_srv_add_cb(SSL *s, unsigned int ext_type,
539                                    const unsigned char **out,
540                                    size_t *outlen, int *al, void *arg)
541 {
542     /* Error: should not have been called */
543     custom_ext_error = 1;
544     return 0;                   /* Don't send an extension */
545 }
546
547 static int custom_ext_1_srv_parse_cb(SSL *s, unsigned int ext_type,
548                                      const unsigned char *in,
549                                      size_t inlen, int *al, void *arg)
550 {
551     if (ext_type != CUSTOM_EXT_TYPE_1)
552         custom_ext_error = 1;
553     /* Check for "abc" */
554     if (inlen != strlen(custom_ext_cli_string))
555         custom_ext_error = 1;
556     if (memcmp(in, custom_ext_cli_string, inlen) != 0)
557         custom_ext_error = 1;
558     return 1;
559 }
560
561 static int custom_ext_1_srv_add_cb(SSL *s, unsigned int ext_type,
562                                    const unsigned char **out,
563                                    size_t *outlen, int *al, void *arg)
564 {
565     return 0;                   /* Don't send an extension */
566 }
567
568 static int custom_ext_2_srv_parse_cb(SSL *s, unsigned int ext_type,
569                                      const unsigned char *in,
570                                      size_t inlen, int *al, void *arg)
571 {
572     if (ext_type != CUSTOM_EXT_TYPE_2)
573         custom_ext_error = 1;
574     /* Check for "abc" */
575     if (inlen != strlen(custom_ext_cli_string))
576         custom_ext_error = 1;
577     if (memcmp(in, custom_ext_cli_string, inlen) != 0)
578         custom_ext_error = 1;
579     return 1;
580 }
581
582 static int custom_ext_2_srv_add_cb(SSL *s, unsigned int ext_type,
583                                    const unsigned char **out,
584                                    size_t *outlen, int *al, void *arg)
585 {
586     *out = NULL;
587     *outlen = 0;
588     return 1;                   /* Send empty extension */
589 }
590
591 static int custom_ext_3_srv_parse_cb(SSL *s, unsigned int ext_type,
592                                      const unsigned char *in,
593                                      size_t inlen, int *al, void *arg)
594 {
595     if (ext_type != CUSTOM_EXT_TYPE_3)
596         custom_ext_error = 1;
597     /* Check for "abc" */
598     if (inlen != strlen(custom_ext_cli_string))
599         custom_ext_error = 1;
600     if (memcmp(in, custom_ext_cli_string, inlen) != 0)
601         custom_ext_error = 1;
602     return 1;
603 }
604
605 static int custom_ext_3_srv_add_cb(SSL *s, unsigned int ext_type,
606                                    const unsigned char **out,
607                                    size_t *outlen, int *al, void *arg)
608 {
609     *out = (const unsigned char *)custom_ext_srv_string;
610     *outlen = strlen(custom_ext_srv_string);
611     return 1;                   /* Send "defg" */
612 }
613
614 static char *cipher = NULL;
615 static int verbose = 0;
616 static int debug = 0;
617
618 int doit_localhost(SSL *s_ssl, SSL *c_ssl, int family,
619                    long bytes, clock_t *s_time, clock_t *c_time);
620 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long bytes, clock_t *s_time,
621                  clock_t *c_time);
622 int doit(SSL *s_ssl, SSL *c_ssl, long bytes);
623
624 static void sv_usage(void)
625 {
626     fprintf(stderr, "usage: ssltest [args ...]\n");
627     fprintf(stderr, "\n");
628     fprintf(stderr, " -server_auth  - check server certificate\n");
629     fprintf(stderr, " -client_auth  - do client authentication\n");
630     fprintf(stderr, " -v            - more output\n");
631     fprintf(stderr, " -d            - debug output\n");
632     fprintf(stderr, " -reuse        - use session-id reuse\n");
633     fprintf(stderr, " -num <val>    - number of connections to perform\n");
634     fprintf(stderr,
635             " -bytes <val>  - number of bytes to swap between client/server\n");
636 #ifndef OPENSSL_NO_DH
637     fprintf(stderr,
638             " -dhe512       - use 512 bit key for DHE (to test failure)\n");
639     fprintf(stderr,
640             " -dhe1024      - use 1024 bit key (safe prime) for DHE (default, no-op)\n");
641     fprintf(stderr,
642             " -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
643     fprintf(stderr, " -no_dhe       - disable DHE\n");
644 #endif
645 #ifndef OPENSSL_NO_EC
646     fprintf(stderr, " -no_ecdhe     - disable ECDHE\nTODO(openssl-team): no_ecdhe was broken by auto ecdh. Make this work again.\n");
647 #endif
648 #ifndef OPENSSL_NO_PSK
649     fprintf(stderr, " -psk arg      - PSK in hex (without 0x)\n");
650 #endif
651 #ifndef OPENSSL_NO_SSL3
652     fprintf(stderr, " -ssl3         - use SSLv3\n");
653 #endif
654 #ifndef OPENSSL_NO_TLS1
655     fprintf(stderr, " -tls1         - use TLSv1\n");
656 #endif
657 #ifndef OPENSSL_NO_DTLS
658     fprintf(stderr, " -dtls         - use DTLS\n");
659 #ifndef OPENSSL_NO_DTLS1
660     fprintf(stderr, " -dtls1        - use DTLSv1\n");
661 #endif
662 #ifndef OPENSSL_NO_DTLS1_2
663     fprintf(stderr, " -dtls12       - use DTLSv1.2\n");
664 #endif
665 #endif
666     fprintf(stderr, " -CApath arg   - PEM format directory of CA's\n");
667     fprintf(stderr, " -CAfile arg   - PEM format file of CA's\n");
668     fprintf(stderr, " -cert arg     - Server certificate file\n");
669     fprintf(stderr,
670             " -key arg      - Server key file (default: same as -cert)\n");
671     fprintf(stderr, " -c_cert arg   - Client certificate file\n");
672     fprintf(stderr,
673             " -c_key arg    - Client key file (default: same as -c_cert)\n");
674     fprintf(stderr, " -cipher arg   - The cipher list\n");
675     fprintf(stderr, " -bio_pair     - Use BIO pairs\n");
676     fprintf(stderr, " -ipv4         - Use IPv4 connection on localhost\n");
677     fprintf(stderr, " -ipv6         - Use IPv6 connection on localhost\n");
678     fprintf(stderr, " -f            - Test even cases that can't work\n");
679     fprintf(stderr,
680             " -time         - measure processor time used by client and server\n");
681     fprintf(stderr, " -zlib         - use zlib compression\n");
682 #ifndef OPENSSL_NO_NEXTPROTONEG
683     fprintf(stderr, " -npn_client - have client side offer NPN\n");
684     fprintf(stderr, " -npn_server - have server side offer NPN\n");
685     fprintf(stderr, " -npn_server_reject - have server reject NPN\n");
686 #endif
687     fprintf(stderr, " -serverinfo_file file - have server use this file\n");
688     fprintf(stderr, " -serverinfo_sct  - have client offer and expect SCT\n");
689     fprintf(stderr,
690             " -serverinfo_tack - have client offer and expect TACK\n");
691     fprintf(stderr,
692             " -custom_ext - try various custom extension callbacks\n");
693     fprintf(stderr, " -alpn_client <string> - have client side offer ALPN\n");
694     fprintf(stderr, " -alpn_server <string> - have server side offer ALPN\n");
695     fprintf(stderr, " -alpn_server1 <string> - alias for -alpn_server\n");
696     fprintf(stderr, " -alpn_server2 <string> - have server side context 2 offer ALPN\n");
697     fprintf(stderr,
698             " -alpn_expected <string> - the ALPN protocol that should be negotiated\n");
699     fprintf(stderr, " -server_min_proto <string> - Minimum version the server should support\n");
700     fprintf(stderr, " -server_max_proto <string> - Maximum version the server should support\n");
701     fprintf(stderr, " -client_min_proto <string> - Minimum version the client should support\n");
702     fprintf(stderr, " -client_max_proto <string> - Maximum version the client should support\n");
703     fprintf(stderr, " -should_negotiate <string> - The version that should be negotiated, fail-client or fail-server\n");
704 #ifndef OPENSSL_NO_CT
705     fprintf(stderr, " -noct         - no certificate transparency\n");
706     fprintf(stderr, " -requestct    - request certificate transparency\n");
707     fprintf(stderr, " -requirect    - require certificate transparency\n");
708 #endif
709     fprintf(stderr, " -sn_client <string>  - have client request this servername\n");
710     fprintf(stderr, " -sn_server1 <string> - have server context 1 respond to this servername\n");
711     fprintf(stderr, " -sn_server2 <string> - have server context 2 respond to this servername\n");
712     fprintf(stderr, " -sn_expect1          - expected server 1\n");
713     fprintf(stderr, " -sn_expect2          - expected server 2\n");
714     fprintf(stderr, " -server_sess_out <file>    - Save the server session to a file\n");
715     fprintf(stderr, " -server_sess_in <file>     - Read the server session from a file\n");
716     fprintf(stderr, " -client_sess_out <file>    - Save the client session to a file\n");
717     fprintf(stderr, " -client_sess_in <file>     - Read the client session from a file\n");
718     fprintf(stderr, " -should_reuse <number>     - The expected state of reusing the session\n");
719     fprintf(stderr, " -no_ticket    - do not issue TLS session ticket\n");
720 }
721
722 static void print_key_details(BIO *out, EVP_PKEY *key)
723 {
724     int keyid = EVP_PKEY_id(key);
725 #ifndef OPENSSL_NO_EC
726     if (keyid == EVP_PKEY_EC) {
727         EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
728         int nid;
729         const char *cname;
730         nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
731         EC_KEY_free(ec);
732         cname = EC_curve_nid2nist(nid);
733         if (!cname)
734             cname = OBJ_nid2sn(nid);
735         BIO_printf(out, "%d bits EC (%s)", EVP_PKEY_bits(key), cname);
736     } else
737 #endif
738     {
739         const char *algname;
740         switch (keyid) {
741         case EVP_PKEY_RSA:
742             algname = "RSA";
743             break;
744         case EVP_PKEY_DSA:
745             algname = "DSA";
746             break;
747         case EVP_PKEY_DH:
748             algname = "DH";
749             break;
750         default:
751             algname = OBJ_nid2sn(keyid);
752             break;
753         }
754         BIO_printf(out, "%d bits %s", EVP_PKEY_bits(key), algname);
755     }
756 }
757
758 static void print_details(SSL *c_ssl, const char *prefix)
759 {
760     const SSL_CIPHER *ciph;
761     int mdnid;
762     X509 *cert;
763     EVP_PKEY *pkey;
764
765     ciph = SSL_get_current_cipher(c_ssl);
766     BIO_printf(bio_stdout, "%s%s, cipher %s %s",
767                prefix,
768                SSL_get_version(c_ssl),
769                SSL_CIPHER_get_version(ciph), SSL_CIPHER_get_name(ciph));
770     cert = SSL_get_peer_certificate(c_ssl);
771     if (cert != NULL) {
772         EVP_PKEY* pubkey = X509_get0_pubkey(cert);
773
774         if (pubkey != NULL) {
775             BIO_puts(bio_stdout, ", ");
776             print_key_details(bio_stdout, pubkey);
777         }
778         X509_free(cert);
779     }
780     if (SSL_get_server_tmp_key(c_ssl, &pkey)) {
781         BIO_puts(bio_stdout, ", temp key: ");
782         print_key_details(bio_stdout, pkey);
783         EVP_PKEY_free(pkey);
784     }
785     if (SSL_get_peer_signature_nid(c_ssl, &mdnid))
786         BIO_printf(bio_stdout, ", digest=%s", OBJ_nid2sn(mdnid));
787     BIO_printf(bio_stdout, "\n");
788 }
789
790 /*
791  * protocol_from_string - converts a protocol version string to a number
792  *
793  * Returns -1 on failure or the version on success
794  */
795 static int protocol_from_string(const char *value)
796 {
797     struct protocol_versions {
798         const char *name;
799         int version;
800     };
801     static const struct protocol_versions versions[] = {
802         {"ssl3", SSL3_VERSION},
803         {"tls1", TLS1_VERSION},
804         {"tls1.1", TLS1_1_VERSION},
805         {"tls1.2", TLS1_2_VERSION},
806         {"tls1.3", TLS1_3_VERSION},
807         {"dtls1", DTLS1_VERSION},
808         {"dtls1.2", DTLS1_2_VERSION}};
809     size_t i;
810     size_t n = OSSL_NELEM(versions);
811
812     for (i = 0; i < n; i++)
813         if (strcmp(versions[i].name, value) == 0)
814             return versions[i].version;
815     return -1;
816 }
817
818 static SSL_SESSION *read_session(const char *filename)
819 {
820     SSL_SESSION *sess;
821     BIO *f = BIO_new_file(filename, "r");
822
823     if (f == NULL) {
824         BIO_printf(bio_err, "Can't open session file %s\n", filename);
825         ERR_print_errors(bio_err);
826         return NULL;
827     }
828     sess = PEM_read_bio_SSL_SESSION(f, NULL, 0, NULL);
829     if (sess == NULL) {
830         BIO_printf(bio_err, "Can't parse session file %s\n", filename);
831         ERR_print_errors(bio_err);
832     }
833     BIO_free(f);
834     return sess;
835 }
836
837 static int write_session(const char *filename, SSL_SESSION *sess)
838 {
839     BIO *f = BIO_new_file(filename, "w");
840
841     if (sess == NULL) {
842         BIO_printf(bio_err, "No session information\n");
843         return 0;
844     }
845     if (f == NULL) {
846         BIO_printf(bio_err, "Can't open session file %s\n", filename);
847         ERR_print_errors(bio_err);
848         return 0;
849     }
850     PEM_write_bio_SSL_SESSION(f, sess);
851     BIO_free(f);
852     return 1;
853 }
854
855 /*
856  * set_protocol_version - Sets protocol version minimum or maximum
857  *
858  * Returns 0 on failure and 1 on success
859  */
860 static int set_protocol_version(const char *version, SSL *ssl, int setting)
861 {
862     if (version != NULL) {
863         int ver = protocol_from_string(version);
864         if (ver < 0) {
865             BIO_printf(bio_err, "Error parsing: %s\n", version);
866             return 0;
867         }
868         return SSL_ctrl(ssl, setting, ver, NULL);
869     }
870     return 1;
871 }
872
873 int main(int argc, char *argv[])
874 {
875     const char *CApath = NULL, *CAfile = NULL;
876     int badop = 0;
877     enum { BIO_MEM, BIO_PAIR, BIO_IPV4, BIO_IPV6 } bio_type = BIO_MEM;
878     int force = 0;
879     int dtls1 = 0, dtls12 = 0, dtls = 0, tls1 = 0, tls1_2 = 0, ssl3 = 0;
880     int ret = EXIT_FAILURE;
881     int client_auth = 0;
882     int server_auth = 0, i;
883     struct app_verify_arg app_verify_arg =
884         { APP_CALLBACK_STRING, 0 };
885     char *p;
886     SSL_CTX *c_ctx = NULL;
887     const SSL_METHOD *meth = NULL;
888     SSL *c_ssl, *s_ssl;
889     int number = 1, reuse = 0;
890     int should_reuse = -1;
891     int no_ticket = 0;
892     long bytes = 256L;
893 #ifndef OPENSSL_NO_DH
894     DH *dh;
895     int dhe512 = 0, dhe1024dsa = 0;
896 #endif
897     int no_dhe = 0;
898     int no_psk = 0;
899     int print_time = 0;
900     clock_t s_time = 0, c_time = 0;
901 #ifndef OPENSSL_NO_COMP
902     int n, comp = 0;
903     COMP_METHOD *cm = NULL;
904     STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
905 #endif
906     int no_protocol;
907     int min_version = 0, max_version = 0;
908 #ifndef OPENSSL_NO_CT
909     /*
910      * Disable CT validation by default, because it will interfere with
911      * anything using custom extension handlers to deal with SCT extensions.
912      */
913     int ct_validation = 0;
914 #endif
915     SSL_CONF_CTX *s_cctx = NULL, *c_cctx = NULL, *s_cctx2 = NULL;
916     STACK_OF(OPENSSL_STRING) *conf_args = NULL;
917     char *arg = NULL, *argn = NULL;
918
919     verbose = 0;
920     debug = 0;
921     cipher = 0;
922
923     bio_err = BIO_new_fp(stderr, BIO_NOCLOSE | BIO_FP_TEXT);
924
925     p = getenv("OPENSSL_DEBUG_MEMORY");
926     if (p != NULL && strcmp(p, "on") == 0)
927         CRYPTO_set_mem_debug(1);
928     CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
929
930     bio_stdout = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
931
932     s_cctx = SSL_CONF_CTX_new();
933     s_cctx2 = SSL_CONF_CTX_new();
934     c_cctx = SSL_CONF_CTX_new();
935
936     if (!s_cctx || !c_cctx || !s_cctx2) {
937         ERR_print_errors(bio_err);
938         goto end;
939     }
940
941     SSL_CONF_CTX_set_flags(s_cctx,
942                            SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_SERVER |
943                            SSL_CONF_FLAG_CERTIFICATE |
944                            SSL_CONF_FLAG_REQUIRE_PRIVATE);
945     SSL_CONF_CTX_set_flags(s_cctx2,
946                            SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_SERVER |
947                            SSL_CONF_FLAG_CERTIFICATE |
948                            SSL_CONF_FLAG_REQUIRE_PRIVATE);
949     if (!SSL_CONF_CTX_set1_prefix(s_cctx, "-s_")) {
950         ERR_print_errors(bio_err);
951         goto end;
952     }
953     if (!SSL_CONF_CTX_set1_prefix(s_cctx2, "-s_")) {
954         ERR_print_errors(bio_err);
955         goto end;
956     }
957
958     SSL_CONF_CTX_set_flags(c_cctx,
959                            SSL_CONF_FLAG_CMDLINE | SSL_CONF_FLAG_CLIENT |
960                            SSL_CONF_FLAG_CERTIFICATE |
961                            SSL_CONF_FLAG_REQUIRE_PRIVATE);
962     if (!SSL_CONF_CTX_set1_prefix(c_cctx, "-c_")) {
963         ERR_print_errors(bio_err);
964         goto end;
965     }
966
967     argc--;
968     argv++;
969
970     while (argc >= 1) {
971         if (strcmp(*argv, "-F") == 0) {
972             fprintf(stderr,
973                     "not compiled with FIPS support, so exiting without running.\n");
974             EXIT(0);
975         } else if (strcmp(*argv, "-server_auth") == 0)
976             server_auth = 1;
977         else if (strcmp(*argv, "-client_auth") == 0)
978             client_auth = 1;
979         else if (strcmp(*argv, "-v") == 0)
980             verbose = 1;
981         else if (strcmp(*argv, "-d") == 0)
982             debug = 1;
983         else if (strcmp(*argv, "-reuse") == 0)
984             reuse = 1;
985         else if (strcmp(*argv, "-dhe512") == 0) {
986 #ifndef OPENSSL_NO_DH
987             dhe512 = 1;
988 #else
989             fprintf(stderr,
990                     "ignoring -dhe512, since I'm compiled without DH\n");
991 #endif
992         } else if (strcmp(*argv, "-dhe1024dsa") == 0) {
993 #ifndef OPENSSL_NO_DH
994             dhe1024dsa = 1;
995 #else
996             fprintf(stderr,
997                     "ignoring -dhe1024dsa, since I'm compiled without DH\n");
998 #endif
999         } else if (strcmp(*argv, "-no_dhe") == 0)
1000             no_dhe = 1;
1001         else if (strcmp(*argv, "-no_ecdhe") == 0)
1002             /* obsolete */;
1003         else if (strcmp(*argv, "-psk") == 0) {
1004             if (--argc < 1)
1005                 goto bad;
1006             psk_key = *(++argv);
1007 #ifndef OPENSSL_NO_PSK
1008             if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key)) {
1009                 BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
1010                 goto bad;
1011             }
1012 #else
1013             no_psk = 1;
1014 #endif
1015         }
1016         else if (strcmp(*argv, "-tls1_2") == 0) {
1017             tls1_2 = 1;
1018         } else if (strcmp(*argv, "-tls1") == 0) {
1019             tls1 = 1;
1020         } else if (strcmp(*argv, "-ssl3") == 0) {
1021             ssl3 = 1;
1022         } else if (strcmp(*argv, "-dtls1") == 0) {
1023             dtls1 = 1;
1024         } else if (strcmp(*argv, "-dtls12") == 0) {
1025             dtls12 = 1;
1026         } else if (strcmp(*argv, "-dtls") == 0) {
1027             dtls = 1;
1028         } else if (strncmp(*argv, "-num", 4) == 0) {
1029             if (--argc < 1)
1030                 goto bad;
1031             number = atoi(*(++argv));
1032             if (number == 0)
1033                 number = 1;
1034         } else if (strcmp(*argv, "-bytes") == 0) {
1035             if (--argc < 1)
1036                 goto bad;
1037             bytes = atol(*(++argv));
1038             if (bytes == 0L)
1039                 bytes = 1L;
1040             i = strlen(argv[0]);
1041             if (argv[0][i - 1] == 'k')
1042                 bytes *= 1024L;
1043             if (argv[0][i - 1] == 'm')
1044                 bytes *= 1024L * 1024L;
1045         } else if (strcmp(*argv, "-cipher") == 0) {
1046             if (--argc < 1)
1047                 goto bad;
1048             cipher = *(++argv);
1049         } else if (strcmp(*argv, "-CApath") == 0) {
1050             if (--argc < 1)
1051                 goto bad;
1052             CApath = *(++argv);
1053         } else if (strcmp(*argv, "-CAfile") == 0) {
1054             if (--argc < 1)
1055                 goto bad;
1056             CAfile = *(++argv);
1057         } else if (strcmp(*argv, "-bio_pair") == 0) {
1058             bio_type = BIO_PAIR;
1059         }
1060 #ifndef OPENSSL_NO_SOCK
1061         else if (strcmp(*argv, "-ipv4") == 0) {
1062             bio_type = BIO_IPV4;
1063         } else if (strcmp(*argv, "-ipv6") == 0) {
1064             bio_type = BIO_IPV6;
1065         }
1066 #endif
1067         else if (strcmp(*argv, "-f") == 0) {
1068             force = 1;
1069         } else if (strcmp(*argv, "-time") == 0) {
1070             print_time = 1;
1071         }
1072 #ifndef OPENSSL_NO_CT
1073         else if (strcmp(*argv, "-noct") == 0) {
1074             ct_validation = 0;
1075         }
1076         else if (strcmp(*argv, "-ct") == 0) {
1077             ct_validation = 1;
1078         }
1079 #endif
1080 #ifndef OPENSSL_NO_COMP
1081         else if (strcmp(*argv, "-zlib") == 0) {
1082             comp = COMP_ZLIB;
1083         }
1084 #endif
1085         else if (strcmp(*argv, "-app_verify") == 0) {
1086             app_verify_arg.app_verify = 1;
1087         }
1088 #ifndef OPENSSL_NO_NEXTPROTONEG
1089           else if (strcmp(*argv, "-npn_client") == 0) {
1090             npn_client = 1;
1091         } else if (strcmp(*argv, "-npn_server") == 0) {
1092             npn_server = 1;
1093         } else if (strcmp(*argv, "-npn_server_reject") == 0) {
1094             npn_server_reject = 1;
1095         }
1096 #endif
1097         else if (strcmp(*argv, "-serverinfo_sct") == 0) {
1098             serverinfo_sct = 1;
1099         } else if (strcmp(*argv, "-serverinfo_tack") == 0) {
1100             serverinfo_tack = 1;
1101         } else if (strcmp(*argv, "-serverinfo_file") == 0) {
1102             if (--argc < 1)
1103                 goto bad;
1104             serverinfo_file = *(++argv);
1105         } else if (strcmp(*argv, "-custom_ext") == 0) {
1106             custom_ext = 1;
1107         } else if (strcmp(*argv, "-alpn_client") == 0) {
1108             if (--argc < 1)
1109                 goto bad;
1110             alpn_client = *(++argv);
1111         } else if (strcmp(*argv, "-alpn_server") == 0 ||
1112                    strcmp(*argv, "-alpn_server1") == 0) {
1113             if (--argc < 1)
1114                 goto bad;
1115             alpn_server = *(++argv);
1116         } else if (strcmp(*argv, "-alpn_server2") == 0) {
1117             if (--argc < 1)
1118                 goto bad;
1119             alpn_server2 = *(++argv);
1120         } else if (strcmp(*argv, "-alpn_expected") == 0) {
1121             if (--argc < 1)
1122                 goto bad;
1123             alpn_expected = *(++argv);
1124         } else if (strcmp(*argv, "-server_min_proto") == 0) {
1125             if (--argc < 1)
1126                 goto bad;
1127             server_min_proto = *(++argv);
1128         } else if (strcmp(*argv, "-server_max_proto") == 0) {
1129             if (--argc < 1)
1130                 goto bad;
1131             server_max_proto = *(++argv);
1132         } else if (strcmp(*argv, "-client_min_proto") == 0) {
1133             if (--argc < 1)
1134                 goto bad;
1135             client_min_proto = *(++argv);
1136         } else if (strcmp(*argv, "-client_max_proto") == 0) {
1137             if (--argc < 1)
1138                 goto bad;
1139             client_max_proto = *(++argv);
1140         } else if (strcmp(*argv, "-should_negotiate") == 0) {
1141             if (--argc < 1)
1142                 goto bad;
1143             should_negotiate = *(++argv);
1144         } else if (strcmp(*argv, "-sn_client") == 0) {
1145             if (--argc < 1)
1146                 goto bad;
1147             sn_client = *(++argv);
1148         } else if (strcmp(*argv, "-sn_server1") == 0) {
1149             if (--argc < 1)
1150                 goto bad;
1151             sn_server1 = *(++argv);
1152         } else if (strcmp(*argv, "-sn_server2") == 0) {
1153             if (--argc < 1)
1154                 goto bad;
1155             sn_server2 = *(++argv);
1156         } else if (strcmp(*argv, "-sn_expect1") == 0) {
1157             sn_expect = 1;
1158         } else if (strcmp(*argv, "-sn_expect2") == 0) {
1159             sn_expect = 2;
1160         } else if (strcmp(*argv, "-server_sess_out") == 0) {
1161             if (--argc < 1)
1162                 goto bad;
1163             server_sess_out = *(++argv);
1164         } else if (strcmp(*argv, "-server_sess_in") == 0) {
1165             if (--argc < 1)
1166                 goto bad;
1167             server_sess_in = *(++argv);
1168         } else if (strcmp(*argv, "-client_sess_out") == 0) {
1169             if (--argc < 1)
1170                 goto bad;
1171             client_sess_out = *(++argv);
1172         } else if (strcmp(*argv, "-client_sess_in") == 0) {
1173             if (--argc < 1)
1174                 goto bad;
1175             client_sess_in = *(++argv);
1176         } else if (strcmp(*argv, "-should_reuse") == 0) {
1177             if (--argc < 1)
1178                 goto bad;
1179             should_reuse = !!atoi(*(++argv));
1180         } else if (strcmp(*argv, "-no_ticket") == 0) {
1181             no_ticket = 1;
1182         } else {
1183             int rv;
1184             arg = argv[0];
1185             argn = argv[1];
1186             /* Try to process command using SSL_CONF */
1187             rv = SSL_CONF_cmd_argv(c_cctx, &argc, &argv);
1188             /* If not processed try server */
1189             if (rv == 0)
1190                 rv = SSL_CONF_cmd_argv(s_cctx, &argc, &argv);
1191             /* Recognised: store it for later use */
1192             if (rv > 0) {
1193                 if (rv == 1)
1194                     argn = NULL;
1195                 if (!conf_args) {
1196                     conf_args = sk_OPENSSL_STRING_new_null();
1197                     if (!conf_args)
1198                         goto end;
1199                 }
1200                 if (!sk_OPENSSL_STRING_push(conf_args, arg))
1201                     goto end;
1202                 if (!sk_OPENSSL_STRING_push(conf_args, argn))
1203                     goto end;
1204                 continue;
1205             }
1206             if (rv == -3)
1207                 BIO_printf(bio_err, "Missing argument for %s\n", arg);
1208             else if (rv < 0)
1209                 BIO_printf(bio_err, "Error with command %s\n", arg);
1210             else if (rv == 0)
1211                 BIO_printf(bio_err, "unknown option %s\n", arg);
1212             badop = 1;
1213             break;
1214         }
1215         argc--;
1216         argv++;
1217     }
1218     if (badop) {
1219  bad:
1220         sv_usage();
1221         goto end;
1222     }
1223
1224     if (ssl3 + tls1 + tls1_2 + dtls + dtls1 + dtls12 > 1) {
1225         fprintf(stderr, "At most one of -ssl3, -tls1, -tls1_2, -dtls, -dtls1 or -dtls12 should "
1226                 "be requested.\n");
1227         EXIT(1);
1228     }
1229
1230 #ifdef OPENSSL_NO_SSL3
1231     if (ssl3)
1232         no_protocol = 1;
1233     else
1234 #endif
1235 #ifdef OPENSSL_NO_TLS1
1236     if (tls1)
1237         no_protocol = 1;
1238     else
1239 #endif
1240 #ifdef OPENSSL_NO_TLS1_2
1241     if (tls1_2)
1242         no_protocol = 1;
1243     else
1244 #endif
1245 #if defined(OPENSSL_NO_DTLS) || defined(OPENSSL_NO_DTLS1)
1246     if (dtls1)
1247         no_protocol = 1;
1248     else
1249 #endif
1250 #if defined(OPENSSL_NO_DTLS) || defined(OPENSSL_NO_DTLS1_2)
1251     if (dtls12)
1252         no_protocol = 1;
1253     else
1254 #endif
1255         no_protocol = 0;
1256
1257     /*
1258      * Testing was requested for a compiled-out protocol (e.g. SSLv3).
1259      * Ideally, we would error out, but the generic test wrapper can't know
1260      * when to expect failure. So we do nothing and return success.
1261      */
1262     if (no_protocol) {
1263         fprintf(stderr, "Testing was requested for a disabled protocol. "
1264                 "Skipping tests.\n");
1265         ret = EXIT_SUCCESS;
1266         goto end;
1267     }
1268
1269     if (!ssl3 && !tls1 && !tls1_2 && !dtls && !dtls1 && !dtls12 && number > 1
1270             && !reuse && !force) {
1271         fprintf(stderr, "This case cannot work.  Use -f to perform "
1272                 "the test anyway (and\n-d to see what happens), "
1273                 "or add one of -ssl3, -tls1, -tls1_2, -dtls, -dtls1, -dtls12, -reuse\n"
1274                 "to avoid protocol mismatch.\n");
1275         EXIT(1);
1276     }
1277
1278     if (print_time) {
1279         if (bio_type != BIO_PAIR) {
1280             fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1281             bio_type = BIO_PAIR;
1282         }
1283         if (number < 50 && !force)
1284             fprintf(stderr,
1285                     "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1286     }
1287
1288 #ifndef OPENSSL_NO_COMP
1289     if (comp == COMP_ZLIB)
1290         cm = COMP_zlib();
1291     if (cm != NULL) {
1292         if (COMP_get_type(cm) != NID_undef) {
1293             if (SSL_COMP_add_compression_method(comp, cm) != 0) {
1294                 fprintf(stderr, "Failed to add compression method\n");
1295                 ERR_print_errors_fp(stderr);
1296             }
1297         } else {
1298             fprintf(stderr,
1299                     "Warning: %s compression not supported\n",
1300                     comp == COMP_ZLIB ? "zlib" : "unknown");
1301             ERR_print_errors_fp(stderr);
1302         }
1303     }
1304     ssl_comp_methods = SSL_COMP_get_compression_methods();
1305     n = sk_SSL_COMP_num(ssl_comp_methods);
1306     if (n) {
1307         int j;
1308         printf("Available compression methods:");
1309         for (j = 0; j < n; j++) {
1310             SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
1311             printf("  %s:%d", SSL_COMP_get0_name(c), SSL_COMP_get_id(c));
1312         }
1313         printf("\n");
1314     }
1315 #endif
1316
1317 #ifndef OPENSSL_NO_TLS
1318     meth = TLS_method();
1319     if (ssl3) {
1320         min_version = SSL3_VERSION;
1321         max_version = SSL3_VERSION;
1322     } else if (tls1) {
1323         min_version = TLS1_VERSION;
1324         max_version = TLS1_VERSION;
1325     } else if (tls1_2) {
1326         min_version = TLS1_2_VERSION;
1327         max_version = TLS1_2_VERSION;
1328     }
1329 #endif
1330 #ifndef OPENSSL_NO_DTLS
1331     if (dtls || dtls1 || dtls12)
1332         meth = DTLS_method();
1333     if (dtls1) {
1334         min_version = DTLS1_VERSION;
1335         max_version = DTLS1_VERSION;
1336     } else if (dtls12) {
1337         min_version = DTLS1_2_VERSION;
1338         max_version = DTLS1_2_VERSION;
1339     }
1340 #endif
1341
1342     c_ctx = SSL_CTX_new(meth);
1343     s_ctx = SSL_CTX_new(meth);
1344     s_ctx2 = SSL_CTX_new(meth); /* no SSL_CTX_dup! */
1345     if ((c_ctx == NULL) || (s_ctx == NULL) || (s_ctx2 == NULL)) {
1346         ERR_print_errors(bio_err);
1347         goto end;
1348     }
1349     /*
1350      * Since we will use low security ciphersuites and keys for testing set
1351      * security level to zero by default. Tests can override this by adding
1352      * "@SECLEVEL=n" to the cipher string.
1353      */
1354     SSL_CTX_set_security_level(c_ctx, 0);
1355     SSL_CTX_set_security_level(s_ctx, 0);
1356     SSL_CTX_set_security_level(s_ctx2, 0);
1357
1358     if (no_ticket) {
1359         SSL_CTX_set_options(c_ctx, SSL_OP_NO_TICKET);
1360         SSL_CTX_set_options(s_ctx, SSL_OP_NO_TICKET);
1361     }
1362
1363     if (SSL_CTX_set_min_proto_version(c_ctx, min_version) == 0)
1364         goto end;
1365     if (SSL_CTX_set_max_proto_version(c_ctx, max_version) == 0)
1366         goto end;
1367     if (SSL_CTX_set_min_proto_version(s_ctx, min_version) == 0)
1368         goto end;
1369     if (SSL_CTX_set_max_proto_version(s_ctx, max_version) == 0)
1370         goto end;
1371
1372     if (cipher != NULL) {
1373         if (!SSL_CTX_set_cipher_list(c_ctx, cipher)
1374             || !SSL_CTX_set_cipher_list(s_ctx, cipher)
1375             || !SSL_CTX_set_cipher_list(s_ctx2, cipher)) {
1376             ERR_print_errors(bio_err);
1377             goto end;
1378         }
1379     }
1380
1381 #ifndef OPENSSL_NO_CT
1382     if (ct_validation &&
1383         !SSL_CTX_enable_ct(c_ctx, SSL_CT_VALIDATION_STRICT)) {
1384         ERR_print_errors(bio_err);
1385         goto end;
1386     }
1387 #endif
1388
1389     /* Process SSL_CONF arguments */
1390     SSL_CONF_CTX_set_ssl_ctx(c_cctx, c_ctx);
1391     SSL_CONF_CTX_set_ssl_ctx(s_cctx, s_ctx);
1392     SSL_CONF_CTX_set_ssl_ctx(s_cctx2, s_ctx2);
1393
1394     for (i = 0; i < sk_OPENSSL_STRING_num(conf_args); i += 2) {
1395         int rv;
1396         arg = sk_OPENSSL_STRING_value(conf_args, i);
1397         argn = sk_OPENSSL_STRING_value(conf_args, i + 1);
1398         rv = SSL_CONF_cmd(c_cctx, arg, argn);
1399         /* If not recognised use server context */
1400         if (rv == -2) {
1401             rv = SSL_CONF_cmd(s_cctx2, arg, argn);
1402             if (rv > 0)
1403                 rv = SSL_CONF_cmd(s_cctx, arg, argn);
1404         }
1405         if (rv <= 0) {
1406             BIO_printf(bio_err, "Error processing %s %s\n",
1407                        arg, argn ? argn : "");
1408             ERR_print_errors(bio_err);
1409             goto end;
1410         }
1411     }
1412
1413     if (!SSL_CONF_CTX_finish(s_cctx) || !SSL_CONF_CTX_finish(c_cctx) || !SSL_CONF_CTX_finish(s_cctx2)) {
1414         BIO_puts(bio_err, "Error finishing context\n");
1415         ERR_print_errors(bio_err);
1416         goto end;
1417     }
1418 #ifndef OPENSSL_NO_DH
1419     if (!no_dhe) {
1420         if (dhe1024dsa) {
1421             dh = get_dh1024dsa();
1422         } else if (dhe512)
1423             dh = get_dh512();
1424         else
1425             dh = get_dh1024();
1426         SSL_CTX_set_tmp_dh(s_ctx, dh);
1427         SSL_CTX_set_tmp_dh(s_ctx2, dh);
1428         DH_free(dh);
1429     }
1430 #else
1431     (void)no_dhe;
1432 #endif
1433
1434     if ((!SSL_CTX_load_verify_locations(s_ctx, CAfile, CApath)) ||
1435         (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1436         (!SSL_CTX_load_verify_locations(s_ctx2, CAfile, CApath)) ||
1437         (!SSL_CTX_set_default_verify_paths(s_ctx2)) ||
1438         (!SSL_CTX_load_verify_locations(c_ctx, CAfile, CApath)) ||
1439         (!SSL_CTX_set_default_verify_paths(c_ctx))) {
1440         ERR_print_errors(bio_err);
1441     }
1442
1443 #ifndef OPENSSL_NO_CT
1444     if (!SSL_CTX_set_default_ctlog_list_file(s_ctx) ||
1445         !SSL_CTX_set_default_ctlog_list_file(s_ctx2) ||
1446         !SSL_CTX_set_default_ctlog_list_file(c_ctx)) {
1447         ERR_print_errors(bio_err);
1448     }
1449 #endif
1450
1451     if (client_auth) {
1452         printf("client authentication\n");
1453         SSL_CTX_set_verify(s_ctx,
1454                            SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1455                            verify_callback);
1456         SSL_CTX_set_verify(s_ctx2,
1457                            SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1458                            verify_callback);
1459         SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback,
1460                                          &app_verify_arg);
1461         SSL_CTX_set_cert_verify_callback(s_ctx2, app_verify_callback,
1462                                          &app_verify_arg);
1463     }
1464     if (server_auth) {
1465         printf("server authentication\n");
1466         SSL_CTX_set_verify(c_ctx, SSL_VERIFY_PEER, verify_callback);
1467         SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback,
1468                                          &app_verify_arg);
1469     }
1470
1471     {
1472         int session_id_context = 0;
1473         if (!SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context,
1474                                             sizeof(session_id_context)) ||
1475             !SSL_CTX_set_session_id_context(s_ctx2, (void *)&session_id_context,
1476                                             sizeof(session_id_context))) {
1477             ERR_print_errors(bio_err);
1478             goto end;
1479         }
1480     }
1481
1482     /* Use PSK only if PSK key is given */
1483     if (psk_key != NULL) {
1484         /*
1485          * no_psk is used to avoid putting psk command to openssl tool
1486          */
1487         if (no_psk) {
1488             /*
1489              * if PSK is not compiled in and psk key is given, do nothing and
1490              * exit successfully
1491              */
1492             ret = EXIT_SUCCESS;
1493             goto end;
1494         }
1495 #ifndef OPENSSL_NO_PSK
1496         SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1497         SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1498         SSL_CTX_set_psk_server_callback(s_ctx2, psk_server_callback);
1499         if (debug)
1500             BIO_printf(bio_err, "setting PSK identity hint to s_ctx\n");
1501         if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint") ||
1502             !SSL_CTX_use_psk_identity_hint(s_ctx2, "ctx server identity_hint")) {
1503             BIO_printf(bio_err, "error setting PSK identity hint to s_ctx\n");
1504             ERR_print_errors(bio_err);
1505             goto end;
1506         }
1507 #endif
1508     }
1509
1510 #ifndef OPENSSL_NO_NEXTPROTONEG
1511     if (npn_client) {
1512         SSL_CTX_set_next_proto_select_cb(c_ctx, cb_client_npn, NULL);
1513     }
1514     if (npn_server) {
1515         if (npn_server_reject) {
1516             BIO_printf(bio_err,
1517                        "Can't have both -npn_server and -npn_server_reject\n");
1518             goto end;
1519         }
1520         SSL_CTX_set_npn_advertised_cb(s_ctx, cb_server_npn, NULL);
1521         SSL_CTX_set_npn_advertised_cb(s_ctx2, cb_server_npn, NULL);
1522     }
1523     if (npn_server_reject) {
1524         SSL_CTX_set_npn_advertised_cb(s_ctx, cb_server_rejects_npn, NULL);
1525         SSL_CTX_set_npn_advertised_cb(s_ctx2, cb_server_rejects_npn, NULL);
1526     }
1527 #endif
1528
1529     if (serverinfo_sct) {
1530         if (!SSL_CTX_add_client_custom_ext(c_ctx,
1531                 TLSEXT_TYPE_signed_certificate_timestamp,
1532                 NULL, NULL, NULL,
1533                 serverinfo_cli_parse_cb, NULL)) {
1534             BIO_printf(bio_err, "Error adding SCT extension\n");
1535             goto end;
1536         }
1537     }
1538     if (serverinfo_tack) {
1539         if (!SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
1540                                       NULL, NULL, NULL,
1541                                       serverinfo_cli_parse_cb, NULL)) {
1542             BIO_printf(bio_err, "Error adding TACK extension\n");
1543             goto end;
1544         }
1545     }
1546     if (serverinfo_file)
1547         if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file) ||
1548             !SSL_CTX_use_serverinfo_file(s_ctx2, serverinfo_file)) {
1549             BIO_printf(bio_err, "missing serverinfo file\n");
1550             goto end;
1551         }
1552
1553     if (custom_ext) {
1554         if (!SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
1555                                       custom_ext_0_cli_add_cb,
1556                                       NULL, NULL,
1557                                       custom_ext_0_cli_parse_cb, NULL)
1558             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
1559                                       custom_ext_1_cli_add_cb,
1560                                       NULL, NULL,
1561                                       custom_ext_1_cli_parse_cb, NULL)
1562             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
1563                                       custom_ext_2_cli_add_cb,
1564                                       NULL, NULL,
1565                                       custom_ext_2_cli_parse_cb, NULL)
1566             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
1567                                       custom_ext_3_cli_add_cb,
1568                                       NULL, NULL,
1569                                       custom_ext_3_cli_parse_cb, NULL)
1570             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
1571                                       custom_ext_0_srv_add_cb,
1572                                       NULL, NULL,
1573                                       custom_ext_0_srv_parse_cb, NULL)
1574             || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_0,
1575                                       custom_ext_0_srv_add_cb,
1576                                       NULL, NULL,
1577                                       custom_ext_0_srv_parse_cb, NULL)
1578             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
1579                                       custom_ext_1_srv_add_cb,
1580                                       NULL, NULL,
1581                                       custom_ext_1_srv_parse_cb, NULL)
1582             || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_1,
1583                                       custom_ext_1_srv_add_cb,
1584                                       NULL, NULL,
1585                                       custom_ext_1_srv_parse_cb, NULL)
1586             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
1587                                       custom_ext_2_srv_add_cb,
1588                                       NULL, NULL,
1589                                       custom_ext_2_srv_parse_cb, NULL)
1590             || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_2,
1591                                       custom_ext_2_srv_add_cb,
1592                                       NULL, NULL,
1593                                       custom_ext_2_srv_parse_cb, NULL)
1594             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
1595                                       custom_ext_3_srv_add_cb,
1596                                       NULL, NULL,
1597                                       custom_ext_3_srv_parse_cb, NULL)
1598             || !SSL_CTX_add_server_custom_ext(s_ctx2, CUSTOM_EXT_TYPE_3,
1599                                       custom_ext_3_srv_add_cb,
1600                                       NULL, NULL,
1601                                       custom_ext_3_srv_parse_cb, NULL)) {
1602             BIO_printf(bio_err, "Error setting custom extensions\n");
1603             goto end;
1604         }
1605     }
1606
1607     if (alpn_server)
1608         SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, alpn_server);
1609     if (alpn_server2)
1610         SSL_CTX_set_alpn_select_cb(s_ctx2, cb_server_alpn, alpn_server2);
1611
1612     if (alpn_client) {
1613         size_t alpn_len;
1614         unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
1615
1616         if (alpn == NULL) {
1617             BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
1618             goto end;
1619         }
1620         /* Returns 0 on success!! */
1621         if (SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len)) {
1622             BIO_printf(bio_err, "Error setting ALPN\n");
1623             OPENSSL_free(alpn);
1624             goto end;
1625         }
1626         OPENSSL_free(alpn);
1627     }
1628
1629     if (server_sess_in != NULL) {
1630         server_sess = read_session(server_sess_in);
1631         if (server_sess == NULL)
1632             goto end;
1633     }
1634     if (client_sess_in != NULL) {
1635         client_sess = read_session(client_sess_in);
1636         if (client_sess == NULL)
1637             goto end;
1638     }
1639
1640     if (server_sess_out != NULL || server_sess_in != NULL) {
1641         char *keys;
1642         long size;
1643
1644         /* Use a fixed key so that we can decrypt the ticket. */
1645         size = SSL_CTX_set_tlsext_ticket_keys(s_ctx, NULL, 0);
1646         keys = OPENSSL_zalloc(size);
1647         SSL_CTX_set_tlsext_ticket_keys(s_ctx, keys, size);
1648         OPENSSL_free(keys);
1649     }
1650
1651     if (sn_server1 != NULL || sn_server2 != NULL)
1652         SSL_CTX_set_tlsext_servername_callback(s_ctx, servername_cb);
1653
1654     c_ssl = SSL_new(c_ctx);
1655     s_ssl = SSL_new(s_ctx);
1656
1657     if (sn_client)
1658         SSL_set_tlsext_host_name(c_ssl, sn_client);
1659
1660     if (!set_protocol_version(server_min_proto, s_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
1661         goto end;
1662     if (!set_protocol_version(server_max_proto, s_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
1663         goto end;
1664     if (!set_protocol_version(client_min_proto, c_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
1665         goto end;
1666     if (!set_protocol_version(client_max_proto, c_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
1667         goto end;
1668
1669     if (server_sess) {
1670         if (SSL_CTX_add_session(s_ctx, server_sess) == 0) {
1671             BIO_printf(bio_err, "Can't add server session\n");
1672             ERR_print_errors(bio_err);
1673             goto end;
1674         }
1675     }
1676
1677     BIO_printf(bio_stdout, "Doing handshakes=%d bytes=%ld\n", number, bytes);
1678     for (i = 0; i < number; i++) {
1679         if (!reuse) {
1680             if (!SSL_set_session(c_ssl, NULL)) {
1681                 BIO_printf(bio_err, "Failed to set session\n");
1682                 goto end;
1683             }
1684         }
1685         if (client_sess_in != NULL) {
1686             if (SSL_set_session(c_ssl, client_sess) == 0) {
1687                 BIO_printf(bio_err, "Can't set client session\n");
1688                 ERR_print_errors(bio_err);
1689                 goto end;
1690             }
1691         }
1692         switch (bio_type) {
1693         case BIO_MEM:
1694             ret = doit(s_ssl, c_ssl, bytes);
1695             break;
1696         case BIO_PAIR:
1697             ret = doit_biopair(s_ssl, c_ssl, bytes, &s_time, &c_time);
1698             break;
1699 #ifndef OPENSSL_NO_SOCK
1700         case BIO_IPV4:
1701             ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV4,
1702                                  bytes, &s_time, &c_time);
1703             break;
1704         case BIO_IPV6:
1705             ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV6,
1706                                  bytes, &s_time, &c_time);
1707             break;
1708 #else
1709         case BIO_IPV4:
1710         case BIO_IPV6:
1711             ret = EXIT_FAILURE;
1712             goto err;
1713 #endif
1714         }
1715         if (ret != EXIT_SUCCESS)  break;
1716     }
1717
1718     if (should_negotiate && ret == EXIT_SUCCESS &&
1719         strcmp(should_negotiate, "fail-server") != 0 &&
1720         strcmp(should_negotiate, "fail-client") != 0) {
1721         int version = protocol_from_string(should_negotiate);
1722         if (version < 0) {
1723             BIO_printf(bio_err, "Error parsing: %s\n", should_negotiate);
1724             ret = EXIT_FAILURE;
1725             goto err;
1726         }
1727         if (SSL_version(c_ssl) != version) {
1728             BIO_printf(bio_err, "Unexpected version negotiated. "
1729                 "Expected: %s, got %s\n", should_negotiate, SSL_get_version(c_ssl));
1730             ret = EXIT_FAILURE;
1731             goto err;
1732         }
1733     }
1734
1735     if (should_reuse != -1) {
1736         if (SSL_session_reused(s_ssl) != should_reuse ||
1737             SSL_session_reused(c_ssl) != should_reuse) {
1738             BIO_printf(bio_err, "Unexpected session reuse state. "
1739                 "Expected: %d, server: %d, client: %d\n", should_reuse,
1740                 SSL_session_reused(s_ssl), SSL_session_reused(c_ssl));
1741             ret = EXIT_FAILURE;
1742             goto err;
1743         }
1744     }
1745
1746     if (server_sess_out != NULL) {
1747         if (write_session(server_sess_out, SSL_get_session(s_ssl)) == 0) {
1748             ret = EXIT_FAILURE;
1749             goto err;
1750         }
1751     }
1752     if (client_sess_out != NULL) {
1753         if (write_session(client_sess_out, SSL_get_session(c_ssl)) == 0) {
1754             ret = EXIT_FAILURE;
1755             goto err;
1756         }
1757     }
1758
1759     if (!verbose) {
1760         print_details(c_ssl, "");
1761     }
1762     if (print_time) {
1763 #ifdef CLOCKS_PER_SEC
1764         /*
1765          * "To determine the time in seconds, the value returned by the clock
1766          * function should be divided by the value of the macro
1767          * CLOCKS_PER_SEC." -- ISO/IEC 9899
1768          */
1769         BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1770                    "Approximate total client time: %6.2f s\n",
1771                    (double)s_time / CLOCKS_PER_SEC,
1772                    (double)c_time / CLOCKS_PER_SEC);
1773 #else
1774         BIO_printf(bio_stdout,
1775                    "Approximate total server time: %6.2f units\n"
1776                    "Approximate total client time: %6.2f units\n",
1777                    (double)s_time, (double)c_time);
1778 #endif
1779     }
1780
1781  err:
1782     SSL_free(s_ssl);
1783     SSL_free(c_ssl);
1784
1785  end:
1786     SSL_CTX_free(s_ctx);
1787     SSL_CTX_free(s_ctx2);
1788     SSL_CTX_free(c_ctx);
1789     SSL_CONF_CTX_free(s_cctx);
1790     SSL_CONF_CTX_free(s_cctx2);
1791     SSL_CONF_CTX_free(c_cctx);
1792     sk_OPENSSL_STRING_free(conf_args);
1793
1794     BIO_free(bio_stdout);
1795
1796     SSL_SESSION_free(server_sess);
1797     SSL_SESSION_free(client_sess);
1798
1799 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
1800     if (CRYPTO_mem_leaks(bio_err) <= 0)
1801         ret = EXIT_FAILURE;
1802 #endif
1803     BIO_free(bio_err);
1804     EXIT(ret);
1805 }
1806
1807 #ifndef OPENSSL_NO_SOCK
1808 int doit_localhost(SSL *s_ssl, SSL *c_ssl, int family, long count,
1809                    clock_t *s_time, clock_t *c_time)
1810 {
1811     long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1812     BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1813     BIO *acpt = NULL, *server = NULL, *client = NULL;
1814     char addr_str[40];
1815     int ret = EXIT_FAILURE;
1816     int err_in_client = 0;
1817     int err_in_server = 0;
1818
1819     acpt = BIO_new_accept("0");
1820     if (acpt == NULL)
1821         goto err;
1822     BIO_set_accept_ip_family(acpt, family);
1823     BIO_set_bind_mode(acpt, BIO_SOCK_NONBLOCK | BIO_SOCK_REUSEADDR);
1824     if (BIO_do_accept(acpt) <= 0)
1825         goto err;
1826
1827     BIO_snprintf(addr_str, sizeof(addr_str), ":%s", BIO_get_accept_port(acpt));
1828
1829     client = BIO_new_connect(addr_str);
1830     BIO_set_conn_ip_family(client, family);
1831     if (!client)
1832         goto err;
1833
1834     if (BIO_set_nbio(client, 1) <= 0)
1835         goto err;
1836     if (BIO_set_nbio(acpt, 1) <= 0)
1837         goto err;
1838
1839     {
1840         int st_connect = 0, st_accept = 0;
1841
1842         while(!st_connect || !st_accept) {
1843             if (!st_connect) {
1844                 if (BIO_do_connect(client) <= 0) {
1845                     if (!BIO_should_retry(client))
1846                         goto err;
1847                 } else {
1848                     st_connect = 1;
1849                 }
1850             }
1851             if (!st_accept) {
1852                 if (BIO_do_accept(acpt) <= 0) {
1853                     if (!BIO_should_retry(acpt))
1854                         goto err;
1855                 } else {
1856                     st_accept = 1;
1857                 }
1858             }
1859         }
1860     }
1861     /* We're not interested in accepting further connects */
1862     server = BIO_pop(acpt);
1863     BIO_free_all(acpt);
1864     acpt = NULL;
1865
1866     s_ssl_bio = BIO_new(BIO_f_ssl());
1867     if (!s_ssl_bio)
1868         goto err;
1869
1870     c_ssl_bio = BIO_new(BIO_f_ssl());
1871     if (!c_ssl_bio)
1872         goto err;
1873
1874     SSL_set_connect_state(c_ssl);
1875     SSL_set_bio(c_ssl, client, client);
1876     (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1877
1878     SSL_set_accept_state(s_ssl);
1879     SSL_set_bio(s_ssl, server, server);
1880     (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1881
1882     do {
1883         /*-
1884          * c_ssl_bio:          SSL filter BIO
1885          *
1886          * client:             I/O for SSL library
1887          *
1888          *
1889          * server:             I/O for SSL library
1890          *
1891          * s_ssl_bio:          SSL filter BIO
1892          */
1893
1894         /*
1895          * We have non-blocking behaviour throughout this test program, but
1896          * can be sure that there is *some* progress in each iteration; so we
1897          * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
1898          * we just try everything in each iteration
1899          */
1900
1901         {
1902             /* CLIENT */
1903
1904             char cbuf[1024 * 8];
1905             int i, r;
1906             clock_t c_clock = clock();
1907
1908             memset(cbuf, 0, sizeof(cbuf));
1909
1910             if (debug)
1911                 if (SSL_in_init(c_ssl))
1912                     printf("client waiting in SSL_connect - %s\n",
1913                            SSL_state_string_long(c_ssl));
1914
1915             if (cw_num > 0) {
1916                 /* Write to server. */
1917
1918                 if (cw_num > (long)sizeof(cbuf))
1919                     i = sizeof(cbuf);
1920                 else
1921                     i = (int)cw_num;
1922                 r = BIO_write(c_ssl_bio, cbuf, i);
1923                 if (r < 0) {
1924                     if (!BIO_should_retry(c_ssl_bio)) {
1925                         fprintf(stderr, "ERROR in CLIENT\n");
1926                         err_in_client = 1;
1927                         goto err;
1928                     }
1929                     /*
1930                      * BIO_should_retry(...) can just be ignored here. The
1931                      * library expects us to call BIO_write with the same
1932                      * arguments again, and that's what we will do in the
1933                      * next iteration.
1934                      */
1935                 } else if (r == 0) {
1936                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
1937                     goto err;
1938                 } else {
1939                     if (debug)
1940                         printf("client wrote %d\n", r);
1941                     cw_num -= r;
1942                 }
1943             }
1944
1945             if (cr_num > 0) {
1946                 /* Read from server. */
1947
1948                 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
1949                 if (r < 0) {
1950                     if (!BIO_should_retry(c_ssl_bio)) {
1951                         fprintf(stderr, "ERROR in CLIENT\n");
1952                         err_in_client = 1;
1953                         goto err;
1954                     }
1955                     /*
1956                      * Again, "BIO_should_retry" can be ignored.
1957                      */
1958                 } else if (r == 0) {
1959                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
1960                     goto err;
1961                 } else {
1962                     if (debug)
1963                         printf("client read %d\n", r);
1964                     cr_num -= r;
1965                 }
1966             }
1967
1968             /*
1969              * c_time and s_time increments will typically be very small
1970              * (depending on machine speed and clock tick intervals), but
1971              * sampling over a large number of connections should result in
1972              * fairly accurate figures.  We cannot guarantee a lot, however
1973              * -- if each connection lasts for exactly one clock tick, it
1974              * will be counted only for the client or only for the server or
1975              * even not at all.
1976              */
1977             *c_time += (clock() - c_clock);
1978         }
1979
1980         {
1981             /* SERVER */
1982
1983             char sbuf[1024 * 8];
1984             int i, r;
1985             clock_t s_clock = clock();
1986
1987             memset(sbuf, 0, sizeof(sbuf));
1988
1989             if (debug)
1990                 if (SSL_in_init(s_ssl))
1991                     printf("server waiting in SSL_accept - %s\n",
1992                            SSL_state_string_long(s_ssl));
1993
1994             if (sw_num > 0) {
1995                 /* Write to client. */
1996
1997                 if (sw_num > (long)sizeof(sbuf))
1998                     i = sizeof(sbuf);
1999                 else
2000                     i = (int)sw_num;
2001                 r = BIO_write(s_ssl_bio, sbuf, i);
2002                 if (r < 0) {
2003                     if (!BIO_should_retry(s_ssl_bio)) {
2004                         fprintf(stderr, "ERROR in SERVER\n");
2005                         err_in_server = 1;
2006                         goto err;
2007                     }
2008                     /* Ignore "BIO_should_retry". */
2009                 } else if (r == 0) {
2010                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2011                     goto err;
2012                 } else {
2013                     if (debug)
2014                         printf("server wrote %d\n", r);
2015                     sw_num -= r;
2016                 }
2017             }
2018
2019             if (sr_num > 0) {
2020                 /* Read from client. */
2021
2022                 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2023                 if (r < 0) {
2024                     if (!BIO_should_retry(s_ssl_bio)) {
2025                         fprintf(stderr, "ERROR in SERVER\n");
2026                         err_in_server = 1;
2027                         goto err;
2028                     }
2029                     /* blah, blah */
2030                 } else if (r == 0) {
2031                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2032                     goto err;
2033                 } else {
2034                     if (debug)
2035                         printf("server read %d\n", r);
2036                     sr_num -= r;
2037                 }
2038             }
2039
2040             *s_time += (clock() - s_clock);
2041         }
2042     }
2043     while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2044
2045     if (verbose)
2046         print_details(c_ssl, "DONE via TCP connect: ");
2047 # ifndef OPENSSL_NO_NEXTPROTONEG
2048     if (verify_npn(c_ssl, s_ssl) < 0)
2049         goto end;
2050 # endif
2051     if (verify_serverinfo() < 0) {
2052         fprintf(stderr, "Server info verify error\n");
2053         goto err;
2054     }
2055     if (verify_alpn(c_ssl, s_ssl) < 0
2056             || verify_servername(c_ssl, s_ssl) < 0)
2057         goto err;
2058
2059     if (custom_ext_error) {
2060         fprintf(stderr, "Custom extension error\n");
2061         goto err;
2062     }
2063
2064 # ifndef OPENSSL_NO_NEXTPROTONEG
2065  end:
2066 # endif
2067     ret = EXIT_SUCCESS;
2068
2069  err:
2070     ERR_print_errors(bio_err);
2071
2072     BIO_free_all(acpt);
2073     BIO_free(server);
2074     BIO_free(client);
2075     BIO_free(s_ssl_bio);
2076     BIO_free(c_ssl_bio);
2077
2078     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2079         ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2080     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2081         ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2082
2083     return ret;
2084 }
2085 #endif
2086
2087 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
2088                  clock_t *s_time, clock_t *c_time)
2089 {
2090     long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
2091     BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
2092     BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
2093     int ret = EXIT_FAILURE;
2094     int err_in_client = 0;
2095     int err_in_server = 0;
2096
2097     size_t bufsiz = 256;        /* small buffer for testing */
2098
2099     if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
2100         goto err;
2101     if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
2102         goto err;
2103
2104     s_ssl_bio = BIO_new(BIO_f_ssl());
2105     if (!s_ssl_bio)
2106         goto err;
2107
2108     c_ssl_bio = BIO_new(BIO_f_ssl());
2109     if (!c_ssl_bio)
2110         goto err;
2111
2112     SSL_set_connect_state(c_ssl);
2113     SSL_set_bio(c_ssl, client, client);
2114     (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
2115
2116     SSL_set_accept_state(s_ssl);
2117     SSL_set_bio(s_ssl, server, server);
2118     (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
2119
2120     do {
2121         /*-
2122          * c_ssl_bio:          SSL filter BIO
2123          *
2124          * client:             pseudo-I/O for SSL library
2125          *
2126          * client_io:          client's SSL communication; usually to be
2127          *                     relayed over some I/O facility, but in this
2128          *                     test program, we're the server, too:
2129          *
2130          * server_io:          server's SSL communication
2131          *
2132          * server:             pseudo-I/O for SSL library
2133          *
2134          * s_ssl_bio:          SSL filter BIO
2135          *
2136          * The client and the server each employ a "BIO pair":
2137          * client + client_io, server + server_io.
2138          * BIO pairs are symmetric.  A BIO pair behaves similar
2139          * to a non-blocking socketpair (but both endpoints must
2140          * be handled by the same thread).
2141          * [Here we could connect client and server to the ends
2142          * of a single BIO pair, but then this code would be less
2143          * suitable as an example for BIO pairs in general.]
2144          *
2145          * Useful functions for querying the state of BIO pair endpoints:
2146          *
2147          * BIO_ctrl_pending(bio)              number of bytes we can read now
2148          * BIO_ctrl_get_read_request(bio)     number of bytes needed to fulfill
2149          *                                      other side's read attempt
2150          * BIO_ctrl_get_write_guarantee(bio)   number of bytes we can write now
2151          *
2152          * ..._read_request is never more than ..._write_guarantee;
2153          * it depends on the application which one you should use.
2154          */
2155
2156         /*
2157          * We have non-blocking behaviour throughout this test program, but
2158          * can be sure that there is *some* progress in each iteration; so we
2159          * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
2160          * we just try everything in each iteration
2161          */
2162
2163         {
2164             /* CLIENT */
2165
2166             char cbuf[1024 * 8];
2167             int i, r;
2168             clock_t c_clock = clock();
2169
2170             memset(cbuf, 0, sizeof(cbuf));
2171
2172             if (debug)
2173                 if (SSL_in_init(c_ssl))
2174                     printf("client waiting in SSL_connect - %s\n",
2175                            SSL_state_string_long(c_ssl));
2176
2177             if (cw_num > 0) {
2178                 /* Write to server. */
2179
2180                 if (cw_num > (long)sizeof(cbuf))
2181                     i = sizeof(cbuf);
2182                 else
2183                     i = (int)cw_num;
2184                 r = BIO_write(c_ssl_bio, cbuf, i);
2185                 if (r < 0) {
2186                     if (!BIO_should_retry(c_ssl_bio)) {
2187                         fprintf(stderr, "ERROR in CLIENT\n");
2188                         err_in_client = 1;
2189                         goto err;
2190                     }
2191                     /*
2192                      * BIO_should_retry(...) can just be ignored here. The
2193                      * library expects us to call BIO_write with the same
2194                      * arguments again, and that's what we will do in the
2195                      * next iteration.
2196                      */
2197                 } else if (r == 0) {
2198                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2199                     goto err;
2200                 } else {
2201                     if (debug)
2202                         printf("client wrote %d\n", r);
2203                     cw_num -= r;
2204                 }
2205             }
2206
2207             if (cr_num > 0) {
2208                 /* Read from server. */
2209
2210                 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
2211                 if (r < 0) {
2212                     if (!BIO_should_retry(c_ssl_bio)) {
2213                         fprintf(stderr, "ERROR in CLIENT\n");
2214                         err_in_client = 1;
2215                         goto err;
2216                     }
2217                     /*
2218                      * Again, "BIO_should_retry" can be ignored.
2219                      */
2220                 } else if (r == 0) {
2221                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2222                     goto err;
2223                 } else {
2224                     if (debug)
2225                         printf("client read %d\n", r);
2226                     cr_num -= r;
2227                 }
2228             }
2229
2230             /*
2231              * c_time and s_time increments will typically be very small
2232              * (depending on machine speed and clock tick intervals), but
2233              * sampling over a large number of connections should result in
2234              * fairly accurate figures.  We cannot guarantee a lot, however
2235              * -- if each connection lasts for exactly one clock tick, it
2236              * will be counted only for the client or only for the server or
2237              * even not at all.
2238              */
2239             *c_time += (clock() - c_clock);
2240         }
2241
2242         {
2243             /* SERVER */
2244
2245             char sbuf[1024 * 8];
2246             int i, r;
2247             clock_t s_clock = clock();
2248
2249             memset(sbuf, 0, sizeof(sbuf));
2250
2251             if (debug)
2252                 if (SSL_in_init(s_ssl))
2253                     printf("server waiting in SSL_accept - %s\n",
2254                            SSL_state_string_long(s_ssl));
2255
2256             if (sw_num > 0) {
2257                 /* Write to client. */
2258
2259                 if (sw_num > (long)sizeof(sbuf))
2260                     i = sizeof(sbuf);
2261                 else
2262                     i = (int)sw_num;
2263                 r = BIO_write(s_ssl_bio, sbuf, i);
2264                 if (r < 0) {
2265                     if (!BIO_should_retry(s_ssl_bio)) {
2266                         fprintf(stderr, "ERROR in SERVER\n");
2267                         err_in_server = 1;
2268                         goto err;
2269                     }
2270                     /* Ignore "BIO_should_retry". */
2271                 } else if (r == 0) {
2272                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2273                     goto err;
2274                 } else {
2275                     if (debug)
2276                         printf("server wrote %d\n", r);
2277                     sw_num -= r;
2278                 }
2279             }
2280
2281             if (sr_num > 0) {
2282                 /* Read from client. */
2283
2284                 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2285                 if (r < 0) {
2286                     if (!BIO_should_retry(s_ssl_bio)) {
2287                         fprintf(stderr, "ERROR in SERVER\n");
2288                         err_in_server = 1;
2289                         goto err;
2290                     }
2291                     /* blah, blah */
2292                 } else if (r == 0) {
2293                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2294                     goto err;
2295                 } else {
2296                     if (debug)
2297                         printf("server read %d\n", r);
2298                     sr_num -= r;
2299                 }
2300             }
2301
2302             *s_time += (clock() - s_clock);
2303         }
2304
2305         {
2306             /* "I/O" BETWEEN CLIENT AND SERVER. */
2307
2308             size_t r1, r2;
2309             BIO *io1 = server_io, *io2 = client_io;
2310             /*
2311              * we use the non-copying interface for io1 and the standard
2312              * BIO_write/BIO_read interface for io2
2313              */
2314
2315             static int prev_progress = 1;
2316             int progress = 0;
2317
2318             /* io1 to io2 */
2319             do {
2320                 size_t num;
2321                 int r;
2322
2323                 r1 = BIO_ctrl_pending(io1);
2324                 r2 = BIO_ctrl_get_write_guarantee(io2);
2325
2326                 num = r1;
2327                 if (r2 < num)
2328                     num = r2;
2329                 if (num) {
2330                     char *dataptr;
2331
2332                     if (INT_MAX < num) /* yeah, right */
2333                         num = INT_MAX;
2334
2335                     r = BIO_nread(io1, &dataptr, (int)num);
2336                     assert(r > 0);
2337                     assert(r <= (int)num);
2338                     /*
2339                      * possibly r < num (non-contiguous data)
2340                      */
2341                     num = r;
2342                     r = BIO_write(io2, dataptr, (int)num);
2343                     if (r != (int)num) { /* can't happen */
2344                         fprintf(stderr, "ERROR: BIO_write could not write "
2345                                 "BIO_ctrl_get_write_guarantee() bytes");
2346                         goto err;
2347                     }
2348                     progress = 1;
2349
2350                     if (debug)
2351                         printf((io1 == client_io) ?
2352                                "C->S relaying: %d bytes\n" :
2353                                "S->C relaying: %d bytes\n", (int)num);
2354                 }
2355             }
2356             while (r1 && r2);
2357
2358             /* io2 to io1 */
2359             {
2360                 size_t num;
2361                 int r;
2362
2363                 r1 = BIO_ctrl_pending(io2);
2364                 r2 = BIO_ctrl_get_read_request(io1);
2365                 /*
2366                  * here we could use ..._get_write_guarantee instead of
2367                  * ..._get_read_request, but by using the latter we test
2368                  * restartability of the SSL implementation more thoroughly
2369                  */
2370                 num = r1;
2371                 if (r2 < num)
2372                     num = r2;
2373                 if (num) {
2374                     char *dataptr;
2375
2376                     if (INT_MAX < num)
2377                         num = INT_MAX;
2378
2379                     if (num > 1)
2380                         --num;  /* test restartability even more thoroughly */
2381
2382                     r = BIO_nwrite0(io1, &dataptr);
2383                     assert(r > 0);
2384                     if (r < (int)num)
2385                         num = r;
2386                     r = BIO_read(io2, dataptr, (int)num);
2387                     if (r != (int)num) { /* can't happen */
2388                         fprintf(stderr, "ERROR: BIO_read could not read "
2389                                 "BIO_ctrl_pending() bytes");
2390                         goto err;
2391                     }
2392                     progress = 1;
2393                     r = BIO_nwrite(io1, &dataptr, (int)num);
2394                     if (r != (int)num) { /* can't happen */
2395                         fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
2396                                 "BIO_nwrite0() bytes");
2397                         goto err;
2398                     }
2399
2400                     if (debug)
2401                         printf((io2 == client_io) ?
2402                                "C->S relaying: %d bytes\n" :
2403                                "S->C relaying: %d bytes\n", (int)num);
2404                 }
2405             }                   /* no loop, BIO_ctrl_get_read_request now
2406                                  * returns 0 anyway */
2407
2408             if (!progress && !prev_progress)
2409                 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0) {
2410                     fprintf(stderr, "ERROR: got stuck\n");
2411                     fprintf(stderr, " ERROR.\n");
2412                     goto err;
2413                 }
2414             prev_progress = progress;
2415         }
2416     }
2417     while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2418
2419     if (verbose)
2420         print_details(c_ssl, "DONE via BIO pair: ");
2421 #ifndef OPENSSL_NO_NEXTPROTONEG
2422     if (verify_npn(c_ssl, s_ssl) < 0)
2423         goto end;
2424 #endif
2425     if (verify_serverinfo() < 0) {
2426         fprintf(stderr, "Server info verify error\n");
2427         goto err;
2428     }
2429     if (verify_alpn(c_ssl, s_ssl) < 0
2430             || verify_servername(c_ssl, s_ssl) < 0)
2431         goto err;
2432
2433     if (custom_ext_error) {
2434         fprintf(stderr, "Custom extension error\n");
2435         goto err;
2436     }
2437
2438 #ifndef OPENSSL_NO_NEXTPROTONEG
2439  end:
2440 #endif
2441     ret = EXIT_SUCCESS;
2442
2443  err:
2444     ERR_print_errors(bio_err);
2445
2446     BIO_free(server);
2447     BIO_free(server_io);
2448     BIO_free(client);
2449     BIO_free(client_io);
2450     BIO_free(s_ssl_bio);
2451     BIO_free(c_ssl_bio);
2452
2453     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2454         ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2455     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2456         ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2457
2458     return ret;
2459 }
2460
2461 #define W_READ  1
2462 #define W_WRITE 2
2463 #define C_DONE  1
2464 #define S_DONE  2
2465
2466 int doit(SSL *s_ssl, SSL *c_ssl, long count)
2467 {
2468     char *cbuf = NULL, *sbuf = NULL;
2469     long bufsiz;
2470     long cw_num = count, cr_num = count;
2471     long sw_num = count, sr_num = count;
2472     int ret = EXIT_FAILURE;
2473     BIO *c_to_s = NULL;
2474     BIO *s_to_c = NULL;
2475     BIO *c_bio = NULL;
2476     BIO *s_bio = NULL;
2477     int c_r, c_w, s_r, s_w;
2478     int i, j;
2479     int done = 0;
2480     int c_write, s_write;
2481     int do_server = 0, do_client = 0;
2482     int max_frag = 5 * 1024;
2483     int err_in_client = 0;
2484     int err_in_server = 0;
2485
2486     bufsiz = count > 40 * 1024 ? 40 * 1024 : count;
2487
2488     if ((cbuf = OPENSSL_zalloc(bufsiz)) == NULL)
2489         goto err;
2490     if ((sbuf = OPENSSL_zalloc(bufsiz)) == NULL)
2491         goto err;
2492
2493     c_to_s = BIO_new(BIO_s_mem());
2494     s_to_c = BIO_new(BIO_s_mem());
2495     if ((s_to_c == NULL) || (c_to_s == NULL)) {
2496         ERR_print_errors(bio_err);
2497         goto err;
2498     }
2499
2500     c_bio = BIO_new(BIO_f_ssl());
2501     s_bio = BIO_new(BIO_f_ssl());
2502     if ((c_bio == NULL) || (s_bio == NULL)) {
2503         ERR_print_errors(bio_err);
2504         goto err;
2505     }
2506
2507     SSL_set_connect_state(c_ssl);
2508     SSL_set_bio(c_ssl, s_to_c, c_to_s);
2509     SSL_set_max_send_fragment(c_ssl, max_frag);
2510     BIO_set_ssl(c_bio, c_ssl, BIO_NOCLOSE);
2511
2512     /*
2513      * We've just given our ref to these BIOs to c_ssl. We need another one to
2514      * give to s_ssl
2515      */
2516     if (!BIO_up_ref(c_to_s)) {
2517         /* c_to_s and s_to_c will get freed when we free c_ssl */
2518         c_to_s = NULL;
2519         s_to_c = NULL;
2520         goto err;
2521     }
2522     if (!BIO_up_ref(s_to_c)) {
2523         /* s_to_c will get freed when we free c_ssl */
2524         s_to_c = NULL;
2525         goto err;
2526     }
2527
2528     SSL_set_accept_state(s_ssl);
2529     SSL_set_bio(s_ssl, c_to_s, s_to_c);
2530
2531     /* We've used up all our refs to these now */
2532     c_to_s = NULL;
2533     s_to_c = NULL;
2534
2535     SSL_set_max_send_fragment(s_ssl, max_frag);
2536     BIO_set_ssl(s_bio, s_ssl, BIO_NOCLOSE);
2537
2538     c_r = 0;
2539     s_r = 1;
2540     c_w = 1;
2541     s_w = 0;
2542     c_write = 1, s_write = 0;
2543
2544     /* We can always do writes */
2545     for (;;) {
2546         do_server = 0;
2547         do_client = 0;
2548
2549         i = (int)BIO_pending(s_bio);
2550         if ((i && s_r) || s_w)
2551             do_server = 1;
2552
2553         i = (int)BIO_pending(c_bio);
2554         if ((i && c_r) || c_w)
2555             do_client = 1;
2556
2557         if (do_server && debug) {
2558             if (SSL_in_init(s_ssl))
2559                 printf("server waiting in SSL_accept - %s\n",
2560                        SSL_state_string_long(s_ssl));
2561         }
2562
2563         if (do_client && debug) {
2564             if (SSL_in_init(c_ssl))
2565                 printf("client waiting in SSL_connect - %s\n",
2566                        SSL_state_string_long(c_ssl));
2567         }
2568
2569         if (!do_client && !do_server) {
2570             fprintf(stdout, "ERROR IN STARTUP\n");
2571             ERR_print_errors(bio_err);
2572             goto err;
2573         }
2574         if (do_client && !(done & C_DONE)) {
2575             if (c_write) {
2576                 j = (cw_num > bufsiz) ? (int)bufsiz : (int)cw_num;
2577                 i = BIO_write(c_bio, cbuf, j);
2578                 if (i < 0) {
2579                     c_r = 0;
2580                     c_w = 0;
2581                     if (BIO_should_retry(c_bio)) {
2582                         if (BIO_should_read(c_bio))
2583                             c_r = 1;
2584                         if (BIO_should_write(c_bio))
2585                             c_w = 1;
2586                     } else {
2587                         fprintf(stderr, "ERROR in CLIENT\n");
2588                         err_in_client = 1;
2589                         ERR_print_errors(bio_err);
2590                         goto err;
2591                     }
2592                 } else if (i == 0) {
2593                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2594                     goto err;
2595                 } else {
2596                     if (debug)
2597                         printf("client wrote %d\n", i);
2598                     /* ok */
2599                     s_r = 1;
2600                     c_write = 0;
2601                     cw_num -= i;
2602                     if (max_frag > 1029)
2603                         SSL_set_max_send_fragment(c_ssl, max_frag -= 5);
2604                 }
2605             } else {
2606                 i = BIO_read(c_bio, cbuf, bufsiz);
2607                 if (i < 0) {
2608                     c_r = 0;
2609                     c_w = 0;
2610                     if (BIO_should_retry(c_bio)) {
2611                         if (BIO_should_read(c_bio))
2612                             c_r = 1;
2613                         if (BIO_should_write(c_bio))
2614                             c_w = 1;
2615                     } else {
2616                         fprintf(stderr, "ERROR in CLIENT\n");
2617                         err_in_client = 1;
2618                         ERR_print_errors(bio_err);
2619                         goto err;
2620                     }
2621                 } else if (i == 0) {
2622                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2623                     goto err;
2624                 } else {
2625                     if (debug)
2626                         printf("client read %d\n", i);
2627                     cr_num -= i;
2628                     if (sw_num > 0) {
2629                         s_write = 1;
2630                         s_w = 1;
2631                     }
2632                     if (cr_num <= 0) {
2633                         s_write = 1;
2634                         s_w = 1;
2635                         done = S_DONE | C_DONE;
2636                     }
2637                 }
2638             }
2639         }
2640
2641         if (do_server && !(done & S_DONE)) {
2642             if (!s_write) {
2643                 i = BIO_read(s_bio, sbuf, bufsiz);
2644                 if (i < 0) {
2645                     s_r = 0;
2646                     s_w = 0;
2647                     if (BIO_should_retry(s_bio)) {
2648                         if (BIO_should_read(s_bio))
2649                             s_r = 1;
2650                         if (BIO_should_write(s_bio))
2651                             s_w = 1;
2652                     } else {
2653                         fprintf(stderr, "ERROR in SERVER\n");
2654                         err_in_server = 1;
2655                         ERR_print_errors(bio_err);
2656                         goto err;
2657                     }
2658                 } else if (i == 0) {
2659                     ERR_print_errors(bio_err);
2660                     fprintf(stderr,
2661                             "SSL SERVER STARTUP FAILED in SSL_read\n");
2662                     goto err;
2663                 } else {
2664                     if (debug)
2665                         printf("server read %d\n", i);
2666                     sr_num -= i;
2667                     if (cw_num > 0) {
2668                         c_write = 1;
2669                         c_w = 1;
2670                     }
2671                     if (sr_num <= 0) {
2672                         s_write = 1;
2673                         s_w = 1;
2674                         c_write = 0;
2675                     }
2676                 }
2677             } else {
2678                 j = (sw_num > bufsiz) ? (int)bufsiz : (int)sw_num;
2679                 i = BIO_write(s_bio, sbuf, j);
2680                 if (i < 0) {
2681                     s_r = 0;
2682                     s_w = 0;
2683                     if (BIO_should_retry(s_bio)) {
2684                         if (BIO_should_read(s_bio))
2685                             s_r = 1;
2686                         if (BIO_should_write(s_bio))
2687                             s_w = 1;
2688                     } else {
2689                         fprintf(stderr, "ERROR in SERVER\n");
2690                         err_in_server = 1;
2691                         ERR_print_errors(bio_err);
2692                         goto err;
2693                     }
2694                 } else if (i == 0) {
2695                     ERR_print_errors(bio_err);
2696                     fprintf(stderr,
2697                             "SSL SERVER STARTUP FAILED in SSL_write\n");
2698                     goto err;
2699                 } else {
2700                     if (debug)
2701                         printf("server wrote %d\n", i);
2702                     sw_num -= i;
2703                     s_write = 0;
2704                     c_r = 1;
2705                     if (sw_num <= 0)
2706                         done |= S_DONE;
2707                     if (max_frag > 1029)
2708                         SSL_set_max_send_fragment(s_ssl, max_frag -= 5);
2709                 }
2710             }
2711         }
2712
2713         if ((done & S_DONE) && (done & C_DONE))
2714             break;
2715     }
2716
2717     if (verbose)
2718         print_details(c_ssl, "DONE: ");
2719 #ifndef OPENSSL_NO_NEXTPROTONEG
2720     if (verify_npn(c_ssl, s_ssl) < 0)
2721         goto err;
2722 #endif
2723     if (verify_serverinfo() < 0) {
2724         fprintf(stderr, "Server info verify error\n");
2725         goto err;
2726     }
2727     if (custom_ext_error) {
2728         fprintf(stderr, "Custom extension error\n");
2729         goto err;
2730     }
2731     ret = EXIT_SUCCESS;
2732  err:
2733     BIO_free(c_to_s);
2734     BIO_free(s_to_c);
2735     BIO_free_all(c_bio);
2736     BIO_free_all(s_bio);
2737     OPENSSL_free(cbuf);
2738     OPENSSL_free(sbuf);
2739
2740     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2741         ret = (err_in_client != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2742     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2743         ret = (err_in_server != 0) ? EXIT_SUCCESS : EXIT_FAILURE;
2744
2745     return ret;
2746 }
2747
2748 static int verify_callback(int ok, X509_STORE_CTX *ctx)
2749 {
2750     char *s, buf[256];
2751
2752     s = X509_NAME_oneline(X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)),
2753                           buf, sizeof(buf));
2754     if (s != NULL) {
2755         if (ok)
2756             printf("depth=%d %s\n", X509_STORE_CTX_get_error_depth(ctx), buf);
2757         else {
2758             fprintf(stderr, "depth=%d error=%d %s\n",
2759                     X509_STORE_CTX_get_error_depth(ctx),
2760                     X509_STORE_CTX_get_error(ctx), buf);
2761         }
2762     }
2763
2764     if (ok == 0) {
2765         int i = X509_STORE_CTX_get_error(ctx);
2766
2767         switch (i) {
2768         default:
2769             fprintf(stderr, "Error string: %s\n",
2770                     X509_verify_cert_error_string(i));
2771             break;
2772         case X509_V_ERR_CERT_NOT_YET_VALID:
2773         case X509_V_ERR_CERT_HAS_EXPIRED:
2774         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
2775             ok = 1;
2776             break;
2777         }
2778     }
2779
2780     return ok;
2781 }
2782
2783 static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
2784 {
2785     int ok = 1;
2786     struct app_verify_arg *cb_arg = arg;
2787
2788     if (cb_arg->app_verify) {
2789         char *s = NULL, buf[256];
2790         X509 *c = X509_STORE_CTX_get0_cert(ctx);
2791
2792         printf("In app_verify_callback, allowing cert. ");
2793         printf("Arg is: %s\n", cb_arg->string);
2794         printf("Finished printing do we have a context? 0x%p a cert? 0x%p\n",
2795                 (void *)ctx, (void *)c);
2796         if (c)
2797             s = X509_NAME_oneline(X509_get_subject_name(c), buf, 256);
2798         if (s != NULL) {
2799             printf("cert depth=%d %s\n",
2800                     X509_STORE_CTX_get_error_depth(ctx), buf);
2801         }
2802         return 1;
2803     }
2804
2805     ok = X509_verify_cert(ctx);
2806
2807     return ok;
2808 }
2809
2810 #ifndef OPENSSL_NO_DH
2811 /*-
2812  * These DH parameters have been generated as follows:
2813  *    $ openssl dhparam -C -noout 512
2814  *    $ openssl dhparam -C -noout 1024
2815  *    $ openssl dhparam -C -noout -dsaparam 1024
2816  * (The third function has been renamed to avoid name conflicts.)
2817  */
2818 static DH *get_dh512()
2819 {
2820     static unsigned char dh512_p[] = {
2821         0xCB, 0xC8, 0xE1, 0x86, 0xD0, 0x1F, 0x94, 0x17, 0xA6, 0x99, 0xF0,
2822         0xC6,
2823         0x1F, 0x0D, 0xAC, 0xB6, 0x25, 0x3E, 0x06, 0x39, 0xCA, 0x72, 0x04,
2824         0xB0,
2825         0x6E, 0xDA, 0xC0, 0x61, 0xE6, 0x7A, 0x77, 0x25, 0xE8, 0x3B, 0xB9,
2826         0x5F,
2827         0x9A, 0xB6, 0xB5, 0xFE, 0x99, 0x0B, 0xA1, 0x93, 0x4E, 0x35, 0x33,
2828         0xB8,
2829         0xE1, 0xF1, 0x13, 0x4F, 0x59, 0x1A, 0xD2, 0x57, 0xC0, 0x26, 0x21,
2830         0x33,
2831         0x02, 0xC5, 0xAE, 0x23,
2832     };
2833     static unsigned char dh512_g[] = {
2834         0x02,
2835     };
2836     DH *dh;
2837     BIGNUM *p, *g;
2838
2839     if ((dh = DH_new()) == NULL)
2840         return NULL;
2841     p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
2842     g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
2843     if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
2844         DH_free(dh);
2845         BN_free(p);
2846         BN_free(g);
2847         return NULL;
2848     }
2849     return dh;
2850 }
2851
2852 static DH *get_dh1024()
2853 {
2854     static unsigned char dh1024_p[] = {
2855         0xF8, 0x81, 0x89, 0x7D, 0x14, 0x24, 0xC5, 0xD1, 0xE6, 0xF7, 0xBF,
2856         0x3A,
2857         0xE4, 0x90, 0xF4, 0xFC, 0x73, 0xFB, 0x34, 0xB5, 0xFA, 0x4C, 0x56,
2858         0xA2,
2859         0xEA, 0xA7, 0xE9, 0xC0, 0xC0, 0xCE, 0x89, 0xE1, 0xFA, 0x63, 0x3F,
2860         0xB0,
2861         0x6B, 0x32, 0x66, 0xF1, 0xD1, 0x7B, 0xB0, 0x00, 0x8F, 0xCA, 0x87,
2862         0xC2,
2863         0xAE, 0x98, 0x89, 0x26, 0x17, 0xC2, 0x05, 0xD2, 0xEC, 0x08, 0xD0,
2864         0x8C,
2865         0xFF, 0x17, 0x52, 0x8C, 0xC5, 0x07, 0x93, 0x03, 0xB1, 0xF6, 0x2F,
2866         0xB8,
2867         0x1C, 0x52, 0x47, 0x27, 0x1B, 0xDB, 0xD1, 0x8D, 0x9D, 0x69, 0x1D,
2868         0x52,
2869         0x4B, 0x32, 0x81, 0xAA, 0x7F, 0x00, 0xC8, 0xDC, 0xE6, 0xD9, 0xCC,
2870         0xC1,
2871         0x11, 0x2D, 0x37, 0x34, 0x6C, 0xEA, 0x02, 0x97, 0x4B, 0x0E, 0xBB,
2872         0xB1,
2873         0x71, 0x33, 0x09, 0x15, 0xFD, 0xDD, 0x23, 0x87, 0x07, 0x5E, 0x89,
2874         0xAB,
2875         0x6B, 0x7C, 0x5F, 0xEC, 0xA6, 0x24, 0xDC, 0x53,
2876     };
2877     static unsigned char dh1024_g[] = {
2878         0x02,
2879     };
2880     DH *dh;
2881     BIGNUM *p, *g;
2882
2883     if ((dh = DH_new()) == NULL)
2884         return NULL;
2885     p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
2886     g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
2887     if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
2888         DH_free(dh);
2889         BN_free(p);
2890         BN_free(g);
2891         return NULL;
2892     }
2893     return dh;
2894 }
2895
2896 static DH *get_dh1024dsa()
2897 {
2898     static unsigned char dh1024_p[] = {
2899         0xC8, 0x00, 0xF7, 0x08, 0x07, 0x89, 0x4D, 0x90, 0x53, 0xF3, 0xD5,
2900         0x00,
2901         0x21, 0x1B, 0xF7, 0x31, 0xA6, 0xA2, 0xDA, 0x23, 0x9A, 0xC7, 0x87,
2902         0x19,
2903         0x3B, 0x47, 0xB6, 0x8C, 0x04, 0x6F, 0xFF, 0xC6, 0x9B, 0xB8, 0x65,
2904         0xD2,
2905         0xC2, 0x5F, 0x31, 0x83, 0x4A, 0xA7, 0x5F, 0x2F, 0x88, 0x38, 0xB6,
2906         0x55,
2907         0xCF, 0xD9, 0x87, 0x6D, 0x6F, 0x9F, 0xDA, 0xAC, 0xA6, 0x48, 0xAF,
2908         0xFC,
2909         0x33, 0x84, 0x37, 0x5B, 0x82, 0x4A, 0x31, 0x5D, 0xE7, 0xBD, 0x52,
2910         0x97,
2911         0xA1, 0x77, 0xBF, 0x10, 0x9E, 0x37, 0xEA, 0x64, 0xFA, 0xCA, 0x28,
2912         0x8D,
2913         0x9D, 0x3B, 0xD2, 0x6E, 0x09, 0x5C, 0x68, 0xC7, 0x45, 0x90, 0xFD,
2914         0xBB,
2915         0x70, 0xC9, 0x3A, 0xBB, 0xDF, 0xD4, 0x21, 0x0F, 0xC4, 0x6A, 0x3C,
2916         0xF6,
2917         0x61, 0xCF, 0x3F, 0xD6, 0x13, 0xF1, 0x5F, 0xBC, 0xCF, 0xBC, 0x26,
2918         0x9E,
2919         0xBC, 0x0B, 0xBD, 0xAB, 0x5D, 0xC9, 0x54, 0x39,
2920     };
2921     static unsigned char dh1024_g[] = {
2922         0x3B, 0x40, 0x86, 0xE7, 0xF3, 0x6C, 0xDE, 0x67, 0x1C, 0xCC, 0x80,
2923         0x05,
2924         0x5A, 0xDF, 0xFE, 0xBD, 0x20, 0x27, 0x74, 0x6C, 0x24, 0xC9, 0x03,
2925         0xF3,
2926         0xE1, 0x8D, 0xC3, 0x7D, 0x98, 0x27, 0x40, 0x08, 0xB8, 0x8C, 0x6A,
2927         0xE9,
2928         0xBB, 0x1A, 0x3A, 0xD6, 0x86, 0x83, 0x5E, 0x72, 0x41, 0xCE, 0x85,
2929         0x3C,
2930         0xD2, 0xB3, 0xFC, 0x13, 0xCE, 0x37, 0x81, 0x9E, 0x4C, 0x1C, 0x7B,
2931         0x65,
2932         0xD3, 0xE6, 0xA6, 0x00, 0xF5, 0x5A, 0x95, 0x43, 0x5E, 0x81, 0xCF,
2933         0x60,
2934         0xA2, 0x23, 0xFC, 0x36, 0xA7, 0x5D, 0x7A, 0x4C, 0x06, 0x91, 0x6E,
2935         0xF6,
2936         0x57, 0xEE, 0x36, 0xCB, 0x06, 0xEA, 0xF5, 0x3D, 0x95, 0x49, 0xCB,
2937         0xA7,
2938         0xDD, 0x81, 0xDF, 0x80, 0x09, 0x4A, 0x97, 0x4D, 0xA8, 0x22, 0x72,
2939         0xA1,
2940         0x7F, 0xC4, 0x70, 0x56, 0x70, 0xE8, 0x20, 0x10, 0x18, 0x8F, 0x2E,
2941         0x60,
2942         0x07, 0xE7, 0x68, 0x1A, 0x82, 0x5D, 0x32, 0xA2,
2943     };
2944     DH *dh;
2945     BIGNUM *p, *g;
2946
2947     if ((dh = DH_new()) == NULL)
2948         return NULL;
2949     p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
2950     g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
2951     if ((p == NULL) || (g == NULL) || !DH_set0_pqg(dh, p, NULL, g)) {
2952         DH_free(dh);
2953         BN_free(p);
2954         BN_free(g);
2955         return NULL;
2956     }
2957     DH_set_length(dh, 160);
2958     return dh;
2959 }
2960 #endif
2961
2962 #ifndef OPENSSL_NO_PSK
2963 /* convert the PSK key (psk_key) in ascii to binary (psk) */
2964 static int psk_key2bn(const char *pskkey, unsigned char *psk,
2965                       unsigned int max_psk_len)
2966 {
2967     int ret;
2968     BIGNUM *bn = NULL;
2969
2970     ret = BN_hex2bn(&bn, pskkey);
2971     if (!ret) {
2972         BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
2973                    pskkey);
2974         BN_free(bn);
2975         return 0;
2976     }
2977     if (BN_num_bytes(bn) > (int)max_psk_len) {
2978         BIO_printf(bio_err,
2979                    "psk buffer of callback is too small (%d) for key (%d)\n",
2980                    max_psk_len, BN_num_bytes(bn));
2981         BN_free(bn);
2982         return 0;
2983     }
2984     ret = BN_bn2bin(bn, psk);
2985     BN_free(bn);
2986     return ret;
2987 }
2988
2989 static unsigned int psk_client_callback(SSL *ssl, const char *hint,
2990                                         char *identity,
2991                                         unsigned int max_identity_len,
2992                                         unsigned char *psk,
2993                                         unsigned int max_psk_len)
2994 {
2995     int ret;
2996     unsigned int psk_len = 0;
2997
2998     ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
2999     if (ret < 0)
3000         goto out_err;
3001     if (debug)
3002         fprintf(stderr, "client: created identity '%s' len=%d\n", identity,
3003                 ret);
3004     ret = psk_key2bn(psk_key, psk, max_psk_len);
3005     if (ret < 0)
3006         goto out_err;
3007     psk_len = ret;
3008  out_err:
3009     return psk_len;
3010 }
3011
3012 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
3013                                         unsigned char *psk,
3014                                         unsigned int max_psk_len)
3015 {
3016     unsigned int psk_len = 0;
3017
3018     if (strcmp(identity, "Client_identity") != 0) {
3019         BIO_printf(bio_err, "server: PSK error: client identity not found\n");
3020         return 0;
3021     }
3022     psk_len = psk_key2bn(psk_key, psk, max_psk_len);
3023     return psk_len;
3024 }
3025 #endif