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