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