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