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