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