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