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