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