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