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