blob: efcd6686b8bace67c445693c4363c45c0eb51a4c [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* ssl/ssltest.c */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
Bodo Möller3ac82fa2000-12-15 16:40:35 +000058/* ====================================================================
59 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
Bodo Möllerea262262002-08-09 08:56:08 +0000111/* ====================================================================
112 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113 * ECC cipher suite support in OpenSSL originally developed by
114 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115 */
Nils Larschddac1972006-03-10 23:06:27 +0000116/* ====================================================================
117 * Copyright 2005 Nokia. All rights reserved.
118 *
119 * The portions of the attached software ("Contribution") is developed by
120 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
121 * license.
122 *
123 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
124 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
125 * support (see RFC 4279) to OpenSSL.
126 *
127 * No patent licenses or other rights except those expressly stated in
128 * the OpenSSL open source license shall be deemed granted or received
129 * expressly, by implication, estoppel, or otherwise.
130 *
131 * No assurances are provided by Nokia that the Contribution does not
132 * infringe the patent or other intellectual property rights of any third
133 * party or that the license provides you with all the necessary rights
134 * to make use of the Contribution.
135 *
136 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
137 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
138 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
139 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
140 * OTHERWISE.
141 */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000142
Richard Levitte4fbe40c2002-12-04 22:48:01 +0000143#define _BSD_SOURCE 1 /* Or gethostname won't be declared properly
Richard Levitte37289742001-07-31 08:50:20 +0000144 on Linux and GNU platforms. */
Richard Levitte37289742001-07-31 08:50:20 +0000145
Bodo Möller6f7af151999-09-10 14:03:21 +0000146#include <assert.h>
147#include <errno.h>
148#include <limits.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000149#include <stdio.h>
150#include <stdlib.h>
151#include <string.h>
Bodo Möller563f1502000-03-13 15:06:54 +0000152#include <time.h>
Bodo Möller17e3dd11999-05-20 21:59:20 +0000153
Richard Levittee7a28562002-12-02 22:49:02 +0000154#define USE_SOCKETS
Richard Levitte41d2a332001-02-22 14:45:02 +0000155#include "e_os.h"
Bodo Möller17e3dd11999-05-20 21:59:20 +0000156
Dr. Stephen Hensonbc120a52010-01-24 16:57:20 +0000157#ifdef OPENSSL_SYS_VMS
158#define _XOPEN_SOURCE 500 /* Or isascii won't be declared properly on
159 VMS (at least with DECompHP C). */
160#endif
161
Richard Levittea9633952005-01-19 17:03:07 +0000162#include <ctype.h>
163
Bodo Möllerec577821999-04-23 22:13:45 +0000164#include <openssl/bio.h>
165#include <openssl/crypto.h>
Bodo Möller563f1502000-03-13 15:06:54 +0000166#include <openssl/evp.h>
Bodo Möllerec577821999-04-23 22:13:45 +0000167#include <openssl/x509.h>
Richard Levittea7201e92005-01-17 17:06:58 +0000168#include <openssl/x509v3.h>
Bodo Möllerec577821999-04-23 22:13:45 +0000169#include <openssl/ssl.h>
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000170#ifndef OPENSSL_NO_ENGINE
Bodo Möllerb8e2f832001-07-04 20:55:36 +0000171#include <openssl/engine.h>
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000172#endif
Bodo Möllerec577821999-04-23 22:13:45 +0000173#include <openssl/err.h>
Ulf Möllerb9d82f42000-01-16 12:21:22 +0000174#include <openssl/rand.h>
Nils Larsch3eeaab42005-07-16 12:37:36 +0000175#ifndef OPENSSL_NO_RSA
Geoff Thorpe60a938c2004-04-19 18:09:28 +0000176#include <openssl/rsa.h>
Nils Larsch3eeaab42005-07-16 12:37:36 +0000177#endif
178#ifndef OPENSSL_NO_DSA
Geoff Thorpe60a938c2004-04-19 18:09:28 +0000179#include <openssl/dsa.h>
Nils Larsch3eeaab42005-07-16 12:37:36 +0000180#endif
181#ifndef OPENSSL_NO_DH
Geoff Thorpe60a938c2004-04-19 18:09:28 +0000182#include <openssl/dh.h>
Nils Larsch3eeaab42005-07-16 12:37:36 +0000183#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000184#ifndef OPENSSL_NO_SRP
185#include <openssl/srp.h>
186#endif
Geoff Thorped095b682004-05-17 18:53:47 +0000187#include <openssl/bn.h>
Richard Levitte09867a42002-12-19 19:39:30 +0000188
189#define _XOPEN_SOURCE_EXTENDED 1 /* Or gethostname won't be declared properly
190 on Compaq platforms (at least with DEC C).
191 Do not try to put it earlier, or IPv6 includes
192 get screwed...
193 */
194
Richard Levittebc36ee62001-02-20 08:13:47 +0000195#ifdef OPENSSL_SYS_WINDOWS
Richard Levittef9b3bff2000-11-30 22:53:34 +0000196#include <winsock.h>
Richard Levitte37289742001-07-31 08:50:20 +0000197#else
198#include OPENSSL_UNISTD
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000199#endif
200
Richard Levittebc36ee62001-02-20 08:13:47 +0000201#ifdef OPENSSL_SYS_VMS
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000202# define TEST_SERVER_CERT "SYS$DISK:[-.APPS]SERVER.PEM"
203# define TEST_CLIENT_CERT "SYS$DISK:[-.APPS]CLIENT.PEM"
Richard Levitte0bf23d92002-11-15 22:37:18 +0000204#elif defined(OPENSSL_SYS_WINCE)
205# define TEST_SERVER_CERT "\\OpenSSL\\server.pem"
206# define TEST_CLIENT_CERT "\\OpenSSL\\client.pem"
Richard Levitte4d8743f2003-11-28 13:10:58 +0000207#elif defined(OPENSSL_SYS_NETWARE)
208# define TEST_SERVER_CERT "\\openssl\\apps\\server.pem"
209# define TEST_CLIENT_CERT "\\openssl\\apps\\client.pem"
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000210#else
211# define TEST_SERVER_CERT "../apps/server.pem"
212# define TEST_CLIENT_CERT "../apps/client.pem"
213#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000214
Richard Levitte23f80f42000-11-30 11:57:31 +0000215/* There is really no standard for this, so let's assign some tentative
216 numbers. In any case, these numbers are only for this test */
Richard Levitte82423542003-10-06 11:00:15 +0000217#define COMP_RLE 255
218#define COMP_ZLIB 1
Richard Levitte23f80f42000-11-30 11:57:31 +0000219
Bodo Möller396f6311999-09-08 21:58:13 +0000220static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
Richard Levittebc36ee62001-02-20 08:13:47 +0000221#ifndef OPENSSL_NO_RSA
Ulf Möllerdf63a381999-06-09 16:33:18 +0000222static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
Bodo Möller46b3bd52000-04-06 22:25:49 +0000223static void free_tmp_rsa(void);
Ulf Möller79df9d61999-04-27 03:19:12 +0000224#endif
Bodo Möller023ec152002-02-28 10:52:56 +0000225static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg);
Richard Levittea7201e92005-01-17 17:06:58 +0000226#define APP_CALLBACK_STRING "Test Callback Argument"
227struct app_verify_arg
228 {
229 char *string;
230 int app_verify;
Richard Levitted9bfe4f2005-04-09 16:07:12 +0000231 int allow_proxy_certs;
Richard Levittea7201e92005-01-17 17:06:58 +0000232 char *proxy_auth;
233 char *proxy_cond;
234 };
Bodo Möller023ec152002-02-28 10:52:56 +0000235
Richard Levittebc36ee62001-02-20 08:13:47 +0000236#ifndef OPENSSL_NO_DH
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000237static DH *get_dh512(void);
Bodo Möllere4589582000-03-10 13:23:20 +0000238static DH *get_dh1024(void);
239static DH *get_dh1024dsa(void);
Bodo Möller53002dc2000-02-04 11:21:18 +0000240#endif
241
Nils Larschddac1972006-03-10 23:06:27 +0000242
243static char *psk_key=NULL; /* by default PSK is not used */
244#ifndef OPENSSL_NO_PSK
245static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
246 unsigned int max_identity_len, unsigned char *psk,
247 unsigned int max_psk_len);
248static unsigned int psk_server_callback(SSL *ssl, const char *identity, unsigned char *psk,
249 unsigned int max_psk_len);
250#endif
251
Ben Laurieedc032b2011-03-12 17:01:19 +0000252#ifndef OPENSSL_NO_SRP
253/* SRP client */
254/* This is a context that we pass to all callbacks */
255typedef struct srp_client_arg_st
256 {
257 char *srppassin;
258 char *srplogin;
259 } SRP_CLIENT_ARG;
260
261#define PWD_STRLEN 1024
262
263static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
264 {
265 SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
266 return BUF_strdup((char *)srp_client_arg->srppassin);
267 }
268
Ben Laurieedc032b2011-03-12 17:01:19 +0000269/* SRP server */
270/* This is a context that we pass to SRP server callbacks */
271typedef struct srp_server_arg_st
272 {
273 char *expected_user;
274 char *pass;
275 } SRP_SERVER_ARG;
276
277static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
278 {
279 SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;
280
281 if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0)
282 {
283 fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s));
284 return SSL3_AL_FATAL;
285 }
286 if (SSL_set_srp_server_param_pw(s,p->expected_user,p->pass,"1024")<0)
287 {
288 *ad = SSL_AD_INTERNAL_ERROR;
289 return SSL3_AL_FATAL;
290 }
291 return SSL_ERROR_NONE;
292 }
293#endif
294
Bodo Möller396f6311999-09-08 21:58:13 +0000295static BIO *bio_err=NULL;
296static BIO *bio_stdout=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000297
Piotr Sikora29115752013-11-13 15:20:22 -0800298#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +0000299/* Note that this code assumes that this is only a one element list: */
300static const char NEXT_PROTO_STRING[] = "\x09testproto";
301int npn_client = 0;
302int npn_server = 0;
303int npn_server_reject = 0;
304
305static int cb_client_npn(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
306 {
307 /* This callback only returns the protocol string, rather than a length
308 prefixed set. We assume that NEXT_PROTO_STRING is a one element list and
309 remove the first byte to chop off the length prefix. */
310 *out = (unsigned char*) NEXT_PROTO_STRING + 1;
311 *outlen = sizeof(NEXT_PROTO_STRING) - 2;
312 return SSL_TLSEXT_ERR_OK;
313 }
314
315static int cb_server_npn(SSL *s, const unsigned char **data, unsigned int *len, void *arg)
316 {
317 *data = (const unsigned char *) NEXT_PROTO_STRING;
318 *len = sizeof(NEXT_PROTO_STRING) - 1;
319 return SSL_TLSEXT_ERR_OK;
320 }
321
322static int cb_server_rejects_npn(SSL *s, const unsigned char **data, unsigned int *len, void *arg)
323 {
324 return SSL_TLSEXT_ERR_NOACK;
325 }
326
327static int verify_npn(SSL *client, SSL *server)
328 {
329 const unsigned char *client_s;
330 unsigned client_len;
331 const unsigned char *server_s;
332 unsigned server_len;
333
334 SSL_get0_next_proto_negotiated(client, &client_s, &client_len);
335 SSL_get0_next_proto_negotiated(server, &server_s, &server_len);
336
337 if (client_len)
338 {
339 BIO_printf(bio_stdout, "Client NPN: ");
340 BIO_write(bio_stdout, client_s, client_len);
341 BIO_printf(bio_stdout, "\n");
342 }
343
344 if (server_len)
345 {
346 BIO_printf(bio_stdout, "Server NPN: ");
347 BIO_write(bio_stdout, server_s, server_len);
348 BIO_printf(bio_stdout, "\n");
349 }
350
351 /* If an NPN string was returned, it must be the protocol that we
352 * expected to negotiate. */
353 if (client_len && (client_len != sizeof(NEXT_PROTO_STRING) - 2 ||
354 memcmp(client_s, NEXT_PROTO_STRING + 1, client_len)))
355 return -1;
356 if (server_len && (server_len != sizeof(NEXT_PROTO_STRING) - 2 ||
357 memcmp(server_s, NEXT_PROTO_STRING + 1, server_len)))
358 return -1;
359
360 if (!npn_client && client_len)
361 return -1;
362 if (!npn_server && server_len)
363 return -1;
364 if (npn_server_reject && server_len)
365 return -1;
366 if (npn_client && npn_server && (!client_len || !server_len))
367 return -1;
368
369 return 0;
370 }
371#endif
372
Adam Langleya8989362013-07-15 15:57:16 -0400373static const char *alpn_client;
374static const char *alpn_server;
375static const char *alpn_expected;
376static unsigned char *alpn_selected;
377
378/* next_protos_parse parses a comma separated list of strings into a string
379 * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
380 * outlen: (output) set to the length of the resulting buffer on success.
381 * err: (maybe NULL) on failure, an error message line is written to this BIO.
382 * in: a NUL termianted string like "abc,def,ghi"
383 *
384 * returns: a malloced buffer or NULL on failure.
385 */
386static unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
387 {
388 size_t len;
389 unsigned char *out;
390 size_t i, start = 0;
391
392 len = strlen(in);
393 if (len >= 65535)
394 return NULL;
395
396 out = OPENSSL_malloc(strlen(in) + 1);
397 if (!out)
398 return NULL;
399
400 for (i = 0; i <= len; ++i)
401 {
402 if (i == len || in[i] == ',')
403 {
404 if (i - start > 255)
405 {
406 OPENSSL_free(out);
407 return NULL;
408 }
409 out[start] = i - start;
410 start = i + 1;
411 }
412 else
413 out[i+1] = in[i];
414 }
415
416 *outlen = len + 1;
417 return out;
418 }
419
420static int cb_server_alpn(SSL *s, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
421 {
422 unsigned char *protos;
423 unsigned short protos_len;
424
425 protos = next_protos_parse(&protos_len, alpn_server);
426 if (protos == NULL)
427 {
428 fprintf(stderr, "failed to parser ALPN server protocol string: %s\n", alpn_server);
429 abort();
430 }
431
432 if (SSL_select_next_proto((unsigned char**) out, outlen, protos, protos_len, in, inlen) !=
433 OPENSSL_NPN_NEGOTIATED)
434 {
435 OPENSSL_free(protos);
436 return SSL_TLSEXT_ERR_NOACK;
437 }
438
439 /* Make a copy of the selected protocol which will be freed in verify_alpn. */
440 alpn_selected = OPENSSL_malloc(*outlen);
441 memcpy(alpn_selected, *out, *outlen);
442 *out = alpn_selected;
443
444 OPENSSL_free(protos);
445 return SSL_TLSEXT_ERR_OK;
446 }
447
448static int verify_alpn(SSL *client, SSL *server)
449 {
450 const unsigned char *client_proto, *server_proto;
451 unsigned int client_proto_len = 0, server_proto_len = 0;
452 SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
453 SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
454
455 if (alpn_selected != NULL)
456 {
457 OPENSSL_free(alpn_selected);
458 alpn_selected = NULL;
459 }
460
461 if (client_proto_len != server_proto_len ||
462 memcmp(client_proto, server_proto, client_proto_len) != 0)
463 {
464 BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
465 goto err;
466 }
467
468 if (client_proto_len > 0 && alpn_expected == NULL)
469 {
470 BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
471 goto err;
472 }
473
474 if (alpn_expected != NULL &&
475 (client_proto_len != strlen(alpn_expected) ||
476 memcmp(client_proto, alpn_expected, client_proto_len) != 0))
477 {
478 BIO_printf(bio_stdout, "ALPN selected protocols not equal to expected protocol: %s\n", alpn_expected);
479 goto err;
480 }
481
482 return 0;
483
484err:
485 BIO_printf(bio_stdout, "ALPN results: client: '");
486 BIO_write(bio_stdout, client_proto, client_proto_len);
487 BIO_printf(bio_stdout, "', server: '");
488 BIO_write(bio_stdout, server_proto, server_proto_len);
489 BIO_printf(bio_stdout, "'\n");
490 BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '%s'\n", alpn_client, alpn_server);
491 return -1;
492 }
493
Trevora398f822013-05-12 18:55:27 -0700494#define SCT_EXT_TYPE 18
Trevor9cd50f72013-06-13 22:36:45 -0700495
496/* WARNING : below extension types are *NOT* IETF assigned, and
497 could conflict if these types are reassigned and handled
498 specially by OpenSSL in the future */
Trevora398f822013-05-12 18:55:27 -0700499#define TACK_EXT_TYPE 62208
Trevor9cd50f72013-06-13 22:36:45 -0700500#define CUSTOM_EXT_TYPE_0 1000
501#define CUSTOM_EXT_TYPE_1 1001
502#define CUSTOM_EXT_TYPE_2 1002
503#define CUSTOM_EXT_TYPE_3 1003
504
505const char custom_ext_cli_string[] = "abc";
506const char custom_ext_srv_string[] = "defg";
Trevora398f822013-05-12 18:55:27 -0700507
508/* These set from cmdline */
509char* serverinfo_file = NULL;
510int serverinfo_sct = 0;
511int serverinfo_tack = 0;
Trevor9cd50f72013-06-13 22:36:45 -0700512
513/* These set based on extension callbacks */
Trevora398f822013-05-12 18:55:27 -0700514int serverinfo_sct_seen = 0;
515int serverinfo_tack_seen = 0;
516int serverinfo_other_seen = 0;
517
Trevor9cd50f72013-06-13 22:36:45 -0700518/* This set from cmdline */
519int custom_ext = 0;
520
521/* This set based on extension callbacks */
522int custom_ext_error = 0;
523
Trevora398f822013-05-12 18:55:27 -0700524static int serverinfo_cli_cb(SSL* s, unsigned short ext_type,
Trevor9cd50f72013-06-13 22:36:45 -0700525 const unsigned char* in, unsigned short inlen,
526 int* al, void* arg)
Trevora398f822013-05-12 18:55:27 -0700527 {
Trevor9cd50f72013-06-13 22:36:45 -0700528 if (ext_type == SCT_EXT_TYPE)
529 serverinfo_sct_seen++;
530 else if (ext_type == TACK_EXT_TYPE)
531 serverinfo_tack_seen++;
532 else
533 serverinfo_other_seen++;
534 return 1;
Trevora398f822013-05-12 18:55:27 -0700535 }
536
537static int verify_serverinfo()
538 {
539 if (serverinfo_sct != serverinfo_sct_seen)
540 return -1;
541 if (serverinfo_tack != serverinfo_tack_seen)
542 return -1;
543 if (serverinfo_other_seen)
544 return -1;
545 return 0;
546 }
547
Trevor9cd50f72013-06-13 22:36:45 -0700548/* Four test cases for custom extensions:
549 * 0 - no ClientHello extension or ServerHello response
550 * 1 - ClientHello with "abc", no response
551 * 2 - ClientHello with "abc", empty response
552 * 3 - ClientHello with "abc", "defg" response
553 */
554
555static int custom_ext_0_cli_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000556 const unsigned char **out,
557 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700558 {
559 if (ext_type != CUSTOM_EXT_TYPE_0)
560 custom_ext_error = 1;
561 return -1; /* Don't send an extension */
562 }
563
564static int custom_ext_0_cli_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000565 const unsigned char *in,
566 unsigned short inlen, int *al,
567 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700568 {
Scott Deboy9dabfce2014-02-04 18:48:59 -0800569 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700570 }
571
572static int custom_ext_1_cli_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000573 const unsigned char **out,
574 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700575 {
576 if (ext_type != CUSTOM_EXT_TYPE_1)
577 custom_ext_error = 1;
578 *out = (const unsigned char*)custom_ext_cli_string;
579 *outlen = strlen(custom_ext_cli_string);
580 return 1; /* Send "abc" */
581 }
582
583static int custom_ext_1_cli_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000584 const unsigned char *in,
585 unsigned short inlen, int *al,
586 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700587 {
Scott Deboy9dabfce2014-02-04 18:48:59 -0800588 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700589 }
590
591static int custom_ext_2_cli_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000592 const unsigned char **out,
593 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700594 {
595 if (ext_type != CUSTOM_EXT_TYPE_2)
596 custom_ext_error = 1;
597 *out = (const unsigned char*)custom_ext_cli_string;
598 *outlen = strlen(custom_ext_cli_string);
599 return 1; /* Send "abc" */
600 }
601
602static int custom_ext_2_cli_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000603 const unsigned char *in,
604 unsigned short inlen, int *al,
605 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700606 {
607 if (ext_type != CUSTOM_EXT_TYPE_2)
608 custom_ext_error = 1;
609 if (inlen != 0)
610 custom_ext_error = 1; /* Should be empty response */
611 return 1;
612 }
613
614static int custom_ext_3_cli_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000615 const unsigned char **out,
616 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700617 {
618 if (ext_type != CUSTOM_EXT_TYPE_3)
619 custom_ext_error = 1;
620 *out = (const unsigned char*)custom_ext_cli_string;
621 *outlen = strlen(custom_ext_cli_string);
622 return 1; /* Send "abc" */
623 }
624
625static int custom_ext_3_cli_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000626 const unsigned char *in,
627 unsigned short inlen, int *al,
628 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700629 {
630 if (ext_type != CUSTOM_EXT_TYPE_3)
631 custom_ext_error = 1;
632 if (inlen != strlen(custom_ext_srv_string))
633 custom_ext_error = 1;
634 if (memcmp(custom_ext_srv_string, in, inlen) != 0)
635 custom_ext_error = 1; /* Check for "defg" */
636 return 1;
637 }
638
Ben Laurie0a602872014-02-04 23:16:46 +0000639/* custom_ext_0_cli_first_cb returns -1 - the server won't receive a callback for this extension */
Trevor9cd50f72013-06-13 22:36:45 -0700640static int custom_ext_0_srv_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000641 const unsigned char *in,
642 unsigned short inlen, int *al,
643 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700644 {
Scott Deboy9dabfce2014-02-04 18:48:59 -0800645 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700646 }
647
Ben Laurie0a602872014-02-04 23:16:46 +0000648/* 'generate' callbacks are always called, even if the 'receive' callback isn't called */
Trevor9cd50f72013-06-13 22:36:45 -0700649static int custom_ext_0_srv_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000650 const unsigned char **out,
651 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700652 {
Scott Deboyac207192013-09-12 12:03:40 -0700653 return -1; /* Don't send an extension */
Trevor9cd50f72013-06-13 22:36:45 -0700654 }
655
656static int custom_ext_1_srv_first_cb(SSL *s, unsigned short ext_type,
Scott Deboye9add062014-02-04 13:08:43 -0800657 const unsigned char *in,
658 unsigned short inlen, int *al,
659 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700660 {
661 if (ext_type != CUSTOM_EXT_TYPE_1)
662 custom_ext_error = 1;
663 /* Check for "abc" */
664 if (inlen != strlen(custom_ext_cli_string))
665 custom_ext_error = 1;
666 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
667 custom_ext_error = 1;
668 return 1;
669 }
670
671static int custom_ext_1_srv_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000672 const unsigned char **out,
673 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700674 {
675 return -1; /* Don't send an extension */
676 }
677
678static int custom_ext_2_srv_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000679 const unsigned char *in,
680 unsigned short inlen, int *al,
681 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700682 {
683 if (ext_type != CUSTOM_EXT_TYPE_2)
684 custom_ext_error = 1;
685 /* Check for "abc" */
686 if (inlen != strlen(custom_ext_cli_string))
687 custom_ext_error = 1;
688 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
689 custom_ext_error = 1;
690 return 1;
691 }
692
693static int custom_ext_2_srv_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000694 const unsigned char **out,
695 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700696 {
697 *out = NULL;
698 *outlen = 0;
699 return 1; /* Send empty extension */
700 }
701
702static int custom_ext_3_srv_first_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000703 const unsigned char *in,
704 unsigned short inlen, int *al,
705 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700706 {
707 if (ext_type != CUSTOM_EXT_TYPE_3)
708 custom_ext_error = 1;
709 /* Check for "abc" */
710 if (inlen != strlen(custom_ext_cli_string))
711 custom_ext_error = 1;
712 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
713 custom_ext_error = 1;
714 return 1;
715 }
716
717static int custom_ext_3_srv_second_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000718 const unsigned char **out,
719 unsigned short *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700720 {
721 *out = (const unsigned char*)custom_ext_srv_string;
722 *outlen = strlen(custom_ext_srv_string);
723 return 1; /* Send "defg" */
724 }
725
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000726static char *cipher=NULL;
Bodo Möller79875771999-10-25 19:36:01 +0000727static int verbose=0;
728static int debug=0;
Bodo Möllerd58d0921999-06-10 16:29:32 +0000729#if 0
730/* Not used yet. */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000731#ifdef FIONBIO
732static int s_nbio=0;
733#endif
Bodo Möllerd58d0921999-06-10 16:29:32 +0000734#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000735
Ulf Möllerb9d82f42000-01-16 12:21:22 +0000736static const char rnd_seed[] = "string to make the random number generator think it has entropy";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000737
Bodo Möller563f1502000-03-13 15:06:54 +0000738int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000739int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
Nils Larsch6e119bb2005-08-25 07:29:54 +0000740static int do_test_cipherlist(void);
Ulf Möller6b691a51999-04-19 21:31:43 +0000741static void sv_usage(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000742 {
743 fprintf(stderr,"usage: ssltest [args ...]\n");
744 fprintf(stderr,"\n");
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +0000745#ifdef OPENSSL_FIPS
746 fprintf(stderr,"-F - run test in FIPS mode\n");
747#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000748 fprintf(stderr," -server_auth - check server certificate\n");
749 fprintf(stderr," -client_auth - do client authentication\n");
Richard Levitted9bfe4f2005-04-09 16:07:12 +0000750 fprintf(stderr," -proxy - allow proxy certificates\n");
Richard Levittea7201e92005-01-17 17:06:58 +0000751 fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
752 fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000753 fprintf(stderr," -v - more output\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000754 fprintf(stderr," -d - debug output\n");
755 fprintf(stderr," -reuse - use session-id reuse\n");
756 fprintf(stderr," -num <val> - number of connections to perform\n");
757 fprintf(stderr," -bytes <val> - number of bytes to swap between client/server\n");
Richard Levittebc36ee62001-02-20 08:13:47 +0000758#ifndef OPENSSL_NO_DH
Bodo Möllere4589582000-03-10 13:23:20 +0000759 fprintf(stderr," -dhe1024 - use 1024 bit key (safe prime) for DHE\n");
760 fprintf(stderr," -dhe1024dsa - use 1024 bit key (with 160-bit subprime) for DHE\n");
Bodo Möller77fa04a1999-09-03 16:31:36 +0000761 fprintf(stderr," -no_dhe - disable DHE\n");
762#endif
Bodo Möllerea262262002-08-09 08:56:08 +0000763#ifndef OPENSSL_NO_ECDH
764 fprintf(stderr," -no_ecdhe - disable ECDHE\n");
765#endif
Nils Larschddac1972006-03-10 23:06:27 +0000766#ifndef OPENSSL_NO_PSK
767 fprintf(stderr," -psk arg - PSK in hex (without 0x)\n");
768#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000769#ifndef OPENSSL_NO_SRP
770 fprintf(stderr," -srpuser user - SRP username to use\n");
771 fprintf(stderr," -srppass arg - password for 'user'\n");
772#endif
Richard Levittebc36ee62001-02-20 08:13:47 +0000773#ifndef OPENSSL_NO_SSL2
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000774 fprintf(stderr," -ssl2 - use SSLv2\n");
775#endif
Richard Levittebc36ee62001-02-20 08:13:47 +0000776#ifndef OPENSSL_NO_SSL3
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000777 fprintf(stderr," -ssl3 - use SSLv3\n");
778#endif
Richard Levittebc36ee62001-02-20 08:13:47 +0000779#ifndef OPENSSL_NO_TLS1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000780 fprintf(stderr," -tls1 - use TLSv1\n");
781#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000782 fprintf(stderr," -CApath arg - PEM format directory of CA's\n");
783 fprintf(stderr," -CAfile arg - PEM format file of CA's\n");
Bodo Möller7d2509b2000-03-13 19:30:59 +0000784 fprintf(stderr," -cert arg - Server certificate file\n");
785 fprintf(stderr," -key arg - Server key file (default: same as -cert)\n");
786 fprintf(stderr," -c_cert arg - Client certificate file\n");
787 fprintf(stderr," -c_key arg - Client key file (default: same as -c_cert)\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000788 fprintf(stderr," -cipher arg - The cipher list\n");
Bodo Möller95d29591999-06-12 01:03:40 +0000789 fprintf(stderr," -bio_pair - Use BIO pairs\n");
790 fprintf(stderr," -f - Test even cases that can't work\n");
Bodo Möller563f1502000-03-13 15:06:54 +0000791 fprintf(stderr," -time - measure processor time used by client and server\n");
Richard Levitte23f80f42000-11-30 11:57:31 +0000792 fprintf(stderr," -zlib - use zlib compression\n");
Bodo Möllerea262262002-08-09 08:56:08 +0000793 fprintf(stderr," -rle - use rle compression\n");
794#ifndef OPENSSL_NO_ECDH
795 fprintf(stderr," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
796 " Use \"openssl ecparam -list_curves\" for all names\n" \
797 " (default is sect163r2).\n");
798#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +0000799 fprintf(stderr," -test_cipherlist - verifies the order of the ssl cipher lists\n");
Piotr Sikora29115752013-11-13 15:20:22 -0800800#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +0000801 fprintf(stderr," -npn_client - have client side offer NPN\n");
802 fprintf(stderr," -npn_server - have server side offer NPN\n");
803 fprintf(stderr," -npn_server_reject - have server reject NPN\n");
804#endif
Trevor9cd50f72013-06-13 22:36:45 -0700805 fprintf(stderr," -serverinfo_file file - have server use this file\n");
Trevora398f822013-05-12 18:55:27 -0700806 fprintf(stderr," -serverinfo_sct - have client offer and expect SCT\n");
807 fprintf(stderr," -serverinfo_tack - have client offer and expect TACK\n");
Trevor9cd50f72013-06-13 22:36:45 -0700808 fprintf(stderr," -custom_ext - try various custom extension callbacks\n");
Adam Langleya8989362013-07-15 15:57:16 -0400809 fprintf(stderr," -alpn_client <string> - have client side offer ALPN\n");
810 fprintf(stderr," -alpn_server <string> - have server side offer ALPN\n");
811 fprintf(stderr," -alpn_expected <string> - the ALPN protocol that should be negotiated\n");
Bodo Möller563f1502000-03-13 15:06:54 +0000812 }
813
814static void print_details(SSL *c_ssl, const char *prefix)
815 {
Ben Lauriebabb3792008-10-12 14:32:47 +0000816 const SSL_CIPHER *ciph;
Bodo Möller563f1502000-03-13 15:06:54 +0000817 X509 *cert;
818
819 ciph=SSL_get_current_cipher(c_ssl);
820 BIO_printf(bio_stdout,"%s%s, cipher %s %s",
821 prefix,
822 SSL_get_version(c_ssl),
823 SSL_CIPHER_get_version(ciph),
824 SSL_CIPHER_get_name(ciph));
825 cert=SSL_get_peer_certificate(c_ssl);
826 if (cert != NULL)
827 {
828 EVP_PKEY *pkey = X509_get_pubkey(cert);
829 if (pkey != NULL)
830 {
831 if (0)
832 ;
Richard Levittebc36ee62001-02-20 08:13:47 +0000833#ifndef OPENSSL_NO_RSA
Bodo Möller563f1502000-03-13 15:06:54 +0000834 else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
835 && pkey->pkey.rsa->n != NULL)
836 {
837 BIO_printf(bio_stdout, ", %d bit RSA",
838 BN_num_bits(pkey->pkey.rsa->n));
839 }
840#endif
Richard Levittebc36ee62001-02-20 08:13:47 +0000841#ifndef OPENSSL_NO_DSA
Bodo Möller563f1502000-03-13 15:06:54 +0000842 else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
843 && pkey->pkey.dsa->p != NULL)
844 {
845 BIO_printf(bio_stdout, ", %d bit DSA",
846 BN_num_bits(pkey->pkey.dsa->p));
847 }
848#endif
849 EVP_PKEY_free(pkey);
850 }
851 X509_free(cert);
852 }
853 /* The SSL API does not allow us to look at temporary RSA/DH keys,
854 * otherwise we should print their lengths too */
855 BIO_printf(bio_stdout,"\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000856 }
857
Bodo Möller3ac82fa2000-12-15 16:40:35 +0000858static void lock_dbg_cb(int mode, int type, const char *file, int line)
859 {
860 static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
861 const char *errstr = NULL;
862 int rw;
863
864 rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
865 if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
866 {
867 errstr = "invalid mode";
868 goto err;
869 }
870
Bodo Möller563c05e2003-08-14 10:33:56 +0000871 if (type < 0 || type >= CRYPTO_NUM_LOCKS)
Bodo Möller3ac82fa2000-12-15 16:40:35 +0000872 {
873 errstr = "type out of bounds";
874 goto err;
875 }
876
877 if (mode & CRYPTO_LOCK)
878 {
879 if (modes[type])
880 {
881 errstr = "already locked";
882 /* must not happen in a single-threaded program
883 * (would deadlock) */
884 goto err;
885 }
886
887 modes[type] = rw;
888 }
889 else if (mode & CRYPTO_UNLOCK)
890 {
891 if (!modes[type])
892 {
893 errstr = "not locked";
894 goto err;
895 }
896
897 if (modes[type] != rw)
898 {
899 errstr = (rw == CRYPTO_READ) ?
900 "CRYPTO_r_unlock on write lock" :
901 "CRYPTO_w_unlock on read lock";
902 }
903
904 modes[type] = 0;
905 }
906 else
907 {
908 errstr = "invalid mode";
909 goto err;
910 }
911
912 err:
913 if (errstr)
914 {
915 /* we cannot use bio_err here */
916 fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
917 errstr, mode, type, file, line);
918 }
919 }
920
Bodo Möller761772d2007-09-21 06:54:24 +0000921#ifdef TLSEXT_TYPE_opaque_prf_input
922struct cb_info_st { void *input; size_t len; int ret; };
923struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
924struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
925struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
926struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
927
928int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
929 {
930 struct cb_info_st *arg = arg_;
931
932 if (arg == NULL)
933 return 1;
934
935 if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
936 return 0;
937 return arg->ret;
938 }
939#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +0000940
Ulf Möller6b691a51999-04-19 21:31:43 +0000941int main(int argc, char *argv[])
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000942 {
943 char *CApath=NULL,*CAfile=NULL;
944 int badop=0;
Bodo Möller95d29591999-06-12 01:03:40 +0000945 int bio_pair=0;
946 int force=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000947 int tls1=0,ssl2=0,ssl3=0,ret=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000948 int client_auth=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000949 int server_auth=0,i;
Richard Levittea7201e92005-01-17 17:06:58 +0000950 struct app_verify_arg app_verify_arg =
Richard Levitted9bfe4f2005-04-09 16:07:12 +0000951 { APP_CALLBACK_STRING, 0, 0, NULL, NULL };
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000952 char *server_cert=TEST_SERVER_CERT;
Bodo Möller65b002f2000-03-13 19:24:39 +0000953 char *server_key=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000954 char *client_cert=TEST_CLIENT_CERT;
Bodo Möller65b002f2000-03-13 19:24:39 +0000955 char *client_key=NULL;
Nils Larsch3eeaab42005-07-16 12:37:36 +0000956#ifndef OPENSSL_NO_ECDH
Bodo Möllerea262262002-08-09 08:56:08 +0000957 char *named_curve = NULL;
Nils Larsch3eeaab42005-07-16 12:37:36 +0000958#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000959 SSL_CTX *s_ctx=NULL;
960 SSL_CTX *c_ctx=NULL;
Nils Larsch4ebb3422005-08-14 21:48:33 +0000961 const SSL_METHOD *meth=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000962 SSL *c_ssl,*s_ssl;
963 int number=1,reuse=0;
Richard Levitte82423542003-10-06 11:00:15 +0000964 long bytes=256L;
Richard Levittebc36ee62001-02-20 08:13:47 +0000965#ifndef OPENSSL_NO_DH
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000966 DH *dh;
Bodo Möllere4589582000-03-10 13:23:20 +0000967 int dhe1024 = 0, dhe1024dsa = 0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000968#endif
Bodo Möllerea262262002-08-09 08:56:08 +0000969#ifndef OPENSSL_NO_ECDH
970 EC_KEY *ecdh = NULL;
971#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000972#ifndef OPENSSL_NO_SRP
973 /* client */
Ben Laurieedc032b2011-03-12 17:01:19 +0000974 SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
975 /* server */
976 SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
977#endif
Bodo Möllere4589582000-03-10 13:23:20 +0000978 int no_dhe = 0;
Bodo Möllerea262262002-08-09 08:56:08 +0000979 int no_ecdhe = 0;
Nils Larschddac1972006-03-10 23:06:27 +0000980 int no_psk = 0;
Bodo Möller563f1502000-03-13 15:06:54 +0000981 int print_time = 0;
982 clock_t s_time = 0, c_time = 0;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +0000983#ifndef OPENSSL_NO_COMP
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +0000984 int comp = 0;
Bodo Möller8df788c2000-11-30 23:41:58 +0000985 COMP_METHOD *cm = NULL;
Richard Levitte82423542003-10-06 11:00:15 +0000986 STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
Dr. Stephen Henson00a37b52010-04-06 11:18:59 +0000987#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +0000988 int test_cipherlist = 0;
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +0000989#ifdef OPENSSL_FIPS
990 int fips_mode=0;
991#endif
Bodo Möller563f1502000-03-13 15:06:54 +0000992
Bodo Möller79875771999-10-25 19:36:01 +0000993 verbose = 0;
994 debug = 0;
995 cipher = 0;
Bodo Möller1e3a9b62002-11-19 11:56:05 +0000996
Nils Larsche9680892006-03-12 22:16:57 +0000997 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);
Bodo Möller1e3a9b62002-11-19 11:56:05 +0000998
Bodo Möller3ac82fa2000-12-15 16:40:35 +0000999 CRYPTO_set_locking_callback(lock_dbg_cb);
1000
Bodo Möller10654d32001-03-11 14:49:46 +00001001 /* enable memory leak checking unless explicitly disabled */
1002 if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
1003 {
1004 CRYPTO_malloc_debug_init();
Bodo Möller384eff82001-09-10 09:50:30 +00001005 CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
1006 }
1007 else
1008 {
1009 /* OPENSSL_DEBUG_MEMORY=off */
1010 CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
Bodo Möller10654d32001-03-11 14:49:46 +00001011 }
Bodo Möller79875771999-10-25 19:36:01 +00001012 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001013
Ulf Möllerb9d82f42000-01-16 12:21:22 +00001014 RAND_seed(rnd_seed, sizeof rnd_seed);
1015
Nils Larsche9680892006-03-12 22:16:57 +00001016 bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001017
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001018 argc--;
1019 argv++;
1020
1021 while (argc >= 1)
1022 {
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001023 if(!strcmp(*argv,"-F"))
1024 {
1025#ifdef OPENSSL_FIPS
1026 fips_mode=1;
1027#else
1028 fprintf(stderr,"not compiled with FIPS support, so exitting without running.\n");
1029 EXIT(0);
1030#endif
1031 }
1032 else if (strcmp(*argv,"-server_auth") == 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001033 server_auth=1;
1034 else if (strcmp(*argv,"-client_auth") == 0)
1035 client_auth=1;
Richard Levittea7201e92005-01-17 17:06:58 +00001036 else if (strcmp(*argv,"-proxy_auth") == 0)
1037 {
1038 if (--argc < 1) goto bad;
1039 app_verify_arg.proxy_auth= *(++argv);
1040 }
1041 else if (strcmp(*argv,"-proxy_cond") == 0)
1042 {
1043 if (--argc < 1) goto bad;
1044 app_verify_arg.proxy_cond= *(++argv);
1045 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001046 else if (strcmp(*argv,"-v") == 0)
1047 verbose=1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001048 else if (strcmp(*argv,"-d") == 0)
1049 debug=1;
1050 else if (strcmp(*argv,"-reuse") == 0)
1051 reuse=1;
Bodo Möller48c843c1999-08-05 11:50:18 +00001052 else if (strcmp(*argv,"-dhe1024") == 0)
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001053 {
1054#ifndef OPENSSL_NO_DH
Bodo Möller48c843c1999-08-05 11:50:18 +00001055 dhe1024=1;
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001056#else
Lutz Jänickeba5ba542002-09-25 20:19:04 +00001057 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
Bodo Möllere4589582000-03-10 13:23:20 +00001058#endif
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001059 }
1060 else if (strcmp(*argv,"-dhe1024dsa") == 0)
1061 {
1062#ifndef OPENSSL_NO_DH
1063 dhe1024dsa=1;
1064#else
Lutz Jänickeba5ba542002-09-25 20:19:04 +00001065 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001066#endif
1067 }
Bodo Möller77fa04a1999-09-03 16:31:36 +00001068 else if (strcmp(*argv,"-no_dhe") == 0)
1069 no_dhe=1;
Bodo Möllerea262262002-08-09 08:56:08 +00001070 else if (strcmp(*argv,"-no_ecdhe") == 0)
1071 no_ecdhe=1;
Nils Larschddac1972006-03-10 23:06:27 +00001072 else if (strcmp(*argv,"-psk") == 0)
1073 {
1074 if (--argc < 1) goto bad;
1075 psk_key=*(++argv);
1076#ifndef OPENSSL_NO_PSK
1077 if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
1078 {
1079 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
1080 goto bad;
1081 }
1082#else
1083 no_psk=1;
1084#endif
1085 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001086#ifndef OPENSSL_NO_SRP
1087 else if (strcmp(*argv,"-srpuser") == 0)
1088 {
1089 if (--argc < 1) goto bad;
1090 srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
1091 tls1=1;
1092 }
1093 else if (strcmp(*argv,"-srppass") == 0)
1094 {
1095 if (--argc < 1) goto bad;
1096 srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
1097 tls1=1;
1098 }
1099#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001100 else if (strcmp(*argv,"-ssl2") == 0)
1101 ssl2=1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001102 else if (strcmp(*argv,"-tls1") == 0)
1103 tls1=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001104 else if (strcmp(*argv,"-ssl3") == 0)
1105 ssl3=1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001106 else if (strncmp(*argv,"-num",4) == 0)
1107 {
1108 if (--argc < 1) goto bad;
1109 number= atoi(*(++argv));
1110 if (number == 0) number=1;
1111 }
1112 else if (strcmp(*argv,"-bytes") == 0)
1113 {
1114 if (--argc < 1) goto bad;
1115 bytes= atol(*(++argv));
1116 if (bytes == 0L) bytes=1L;
1117 i=strlen(argv[0]);
1118 if (argv[0][i-1] == 'k') bytes*=1024L;
1119 if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
1120 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001121 else if (strcmp(*argv,"-cert") == 0)
1122 {
1123 if (--argc < 1) goto bad;
1124 server_cert= *(++argv);
1125 }
1126 else if (strcmp(*argv,"-s_cert") == 0)
1127 {
1128 if (--argc < 1) goto bad;
1129 server_cert= *(++argv);
1130 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001131 else if (strcmp(*argv,"-key") == 0)
1132 {
1133 if (--argc < 1) goto bad;
1134 server_key= *(++argv);
1135 }
1136 else if (strcmp(*argv,"-s_key") == 0)
1137 {
1138 if (--argc < 1) goto bad;
1139 server_key= *(++argv);
1140 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001141 else if (strcmp(*argv,"-c_cert") == 0)
1142 {
1143 if (--argc < 1) goto bad;
1144 client_cert= *(++argv);
1145 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001146 else if (strcmp(*argv,"-c_key") == 0)
1147 {
1148 if (--argc < 1) goto bad;
1149 client_key= *(++argv);
1150 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001151 else if (strcmp(*argv,"-cipher") == 0)
1152 {
1153 if (--argc < 1) goto bad;
1154 cipher= *(++argv);
1155 }
1156 else if (strcmp(*argv,"-CApath") == 0)
1157 {
1158 if (--argc < 1) goto bad;
1159 CApath= *(++argv);
1160 }
1161 else if (strcmp(*argv,"-CAfile") == 0)
1162 {
1163 if (--argc < 1) goto bad;
1164 CAfile= *(++argv);
1165 }
Bodo Möller95d29591999-06-12 01:03:40 +00001166 else if (strcmp(*argv,"-bio_pair") == 0)
1167 {
1168 bio_pair = 1;
1169 }
1170 else if (strcmp(*argv,"-f") == 0)
1171 {
1172 force = 1;
1173 }
Bodo Möller563f1502000-03-13 15:06:54 +00001174 else if (strcmp(*argv,"-time") == 0)
1175 {
1176 print_time = 1;
1177 }
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +00001178#ifndef OPENSSL_NO_COMP
Richard Levitte23f80f42000-11-30 11:57:31 +00001179 else if (strcmp(*argv,"-zlib") == 0)
1180 {
1181 comp = COMP_ZLIB;
1182 }
1183 else if (strcmp(*argv,"-rle") == 0)
1184 {
1185 comp = COMP_RLE;
1186 }
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +00001187#endif
Bodo Möllerea262262002-08-09 08:56:08 +00001188 else if (strcmp(*argv,"-named_curve") == 0)
1189 {
1190 if (--argc < 1) goto bad;
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001191#ifndef OPENSSL_NO_ECDH
Bodo Möllerea262262002-08-09 08:56:08 +00001192 named_curve = *(++argv);
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001193#else
Bodo Möller5e3247d2002-11-05 10:54:40 +00001194 fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001195 ++argv;
Bodo Möllerea262262002-08-09 08:56:08 +00001196#endif
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001197 }
Bodo Möller023ec152002-02-28 10:52:56 +00001198 else if (strcmp(*argv,"-app_verify") == 0)
1199 {
Richard Levittea7201e92005-01-17 17:06:58 +00001200 app_verify_arg.app_verify = 1;
Bodo Möller023ec152002-02-28 10:52:56 +00001201 }
Richard Levitted9bfe4f2005-04-09 16:07:12 +00001202 else if (strcmp(*argv,"-proxy") == 0)
1203 {
1204 app_verify_arg.allow_proxy_certs = 1;
1205 }
Nils Larsch6e119bb2005-08-25 07:29:54 +00001206 else if (strcmp(*argv,"-test_cipherlist") == 0)
1207 {
1208 test_cipherlist = 1;
1209 }
Piotr Sikora29115752013-11-13 15:20:22 -08001210#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00001211 else if (strcmp(*argv,"-npn_client") == 0)
1212 {
1213 npn_client = 1;
1214 }
1215 else if (strcmp(*argv,"-npn_server") == 0)
1216 {
1217 npn_server = 1;
1218 }
1219 else if (strcmp(*argv,"-npn_server_reject") == 0)
1220 {
1221 npn_server_reject = 1;
1222 }
1223#endif
Trevora398f822013-05-12 18:55:27 -07001224 else if (strcmp(*argv,"-serverinfo_sct") == 0)
1225 {
1226 serverinfo_sct = 1;
1227 }
1228 else if (strcmp(*argv,"-serverinfo_tack") == 0)
1229 {
1230 serverinfo_tack = 1;
1231 }
1232 else if (strcmp(*argv,"-serverinfo_file") == 0)
1233 {
1234 if (--argc < 1) goto bad;
1235 serverinfo_file = *(++argv);
1236 }
Trevor9cd50f72013-06-13 22:36:45 -07001237 else if (strcmp(*argv,"-custom_ext") == 0)
1238 {
1239 custom_ext = 1;
1240 }
Adam Langleya8989362013-07-15 15:57:16 -04001241 else if (strcmp(*argv,"-alpn_client") == 0)
1242 {
1243 if (--argc < 1) goto bad;
1244 alpn_client = *(++argv);
1245 }
1246 else if (strcmp(*argv,"-alpn_server") == 0)
1247 {
1248 if (--argc < 1) goto bad;
1249 alpn_server = *(++argv);
1250 }
1251 else if (strcmp(*argv,"-alpn_expected") == 0)
1252 {
1253 if (--argc < 1) goto bad;
1254 alpn_expected = *(++argv);
1255 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001256 else
1257 {
1258 fprintf(stderr,"unknown option %s\n",*argv);
1259 badop=1;
1260 break;
1261 }
1262 argc--;
1263 argv++;
1264 }
1265 if (badop)
1266 {
1267bad:
1268 sv_usage();
1269 goto end;
1270 }
1271
Nils Larsch6e119bb2005-08-25 07:29:54 +00001272 if (test_cipherlist == 1)
1273 {
1274 /* ensure that the cipher list are correctly sorted and exit */
1275 if (do_test_cipherlist() == 0)
1276 EXIT(1);
1277 ret = 0;
1278 goto end;
1279 }
1280
Bodo Möller95d29591999-06-12 01:03:40 +00001281 if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
1282 {
Bodo Möller563f1502000-03-13 15:06:54 +00001283 fprintf(stderr, "This case cannot work. Use -f to perform "
1284 "the test anyway (and\n-d to see what happens), "
1285 "or add one of -ssl2, -ssl3, -tls1, -reuse\n"
1286 "to avoid protocol mismatch.\n");
Richard Levitte55f78ba2002-11-28 18:54:30 +00001287 EXIT(1);
Bodo Möller95d29591999-06-12 01:03:40 +00001288 }
1289
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001290#ifdef OPENSSL_FIPS
1291 if(fips_mode)
1292 {
1293 if(!FIPS_mode_set(1))
1294 {
1295 ERR_load_crypto_strings();
1296 ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
1297 EXIT(1);
1298 }
1299 else
1300 fprintf(stderr,"*** IN FIPS MODE ***\n");
1301 }
1302#endif
1303
Bodo Möller563f1502000-03-13 15:06:54 +00001304 if (print_time)
1305 {
1306 if (!bio_pair)
1307 {
1308 fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1309 bio_pair = 1;
1310 }
1311 if (number < 50 && !force)
1312 fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1313 }
1314
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001315/* if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
1316
Mark J. Cox413c4f41999-02-16 09:22:21 +00001317 SSL_library_init();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001318 SSL_load_error_strings();
1319
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00001320#ifndef OPENSSL_NO_COMP
Richard Levittebd68b6b2000-11-30 12:22:35 +00001321 if (comp == COMP_ZLIB) cm = COMP_zlib();
1322 if (comp == COMP_RLE) cm = COMP_rle();
1323 if (cm != NULL)
Richard Levitte23f80f42000-11-30 11:57:31 +00001324 {
Richard Levitte23f80f42000-11-30 11:57:31 +00001325 if (cm->type != NID_undef)
Richard Levittef82ab532003-10-02 10:41:48 +00001326 {
1327 if (SSL_COMP_add_compression_method(comp, cm) != 0)
1328 {
1329 fprintf(stderr,
1330 "Failed to add compression method\n");
1331 ERR_print_errors_fp(stderr);
1332 }
1333 }
Richard Levitte23f80f42000-11-30 11:57:31 +00001334 else
Richard Levitte47517172000-11-30 12:53:15 +00001335 {
Richard Levittebd68b6b2000-11-30 12:22:35 +00001336 fprintf(stderr,
1337 "Warning: %s compression not supported\n",
1338 (comp == COMP_RLE ? "rle" :
1339 (comp == COMP_ZLIB ? "zlib" :
1340 "unknown")));
Richard Levitte47517172000-11-30 12:53:15 +00001341 ERR_print_errors_fp(stderr);
1342 }
Richard Levitte23f80f42000-11-30 11:57:31 +00001343 }
Richard Levitte82423542003-10-06 11:00:15 +00001344 ssl_comp_methods = SSL_COMP_get_compression_methods();
1345 fprintf(stderr, "Available compression methods:\n");
1346 {
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001347 int j, n = sk_SSL_COMP_num(ssl_comp_methods);
Richard Levitte82423542003-10-06 11:00:15 +00001348 if (n == 0)
1349 fprintf(stderr, " NONE\n");
1350 else
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001351 for (j = 0; j < n; j++)
Richard Levitte82423542003-10-06 11:00:15 +00001352 {
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001353 SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
Richard Levitte82423542003-10-06 11:00:15 +00001354 fprintf(stderr, " %d: %s\n", c->id, c->name);
1355 }
1356 }
Dr. Stephen Henson231b98a2005-10-02 12:28:40 +00001357#endif
Richard Levitte23f80f42000-11-30 11:57:31 +00001358
Richard Levittebc36ee62001-02-20 08:13:47 +00001359#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001360 if (ssl2)
1361 meth=SSLv2_method();
1362 else
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001363 if (tls1)
1364 meth=TLSv1_method();
1365 else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001366 if (ssl3)
1367 meth=SSLv3_method();
1368 else
1369 meth=SSLv23_method();
1370#else
Richard Levittebc36ee62001-02-20 08:13:47 +00001371#ifdef OPENSSL_NO_SSL2
Dr. Stephen Hensonb7c37f22013-02-11 18:17:50 +00001372 if (tls1)
1373 meth=TLSv1_method();
1374 else
1375 if (ssl3)
1376 meth=SSLv3_method();
1377 else
1378 meth=SSLv23_method();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001379#else
1380 meth=SSLv2_method();
1381#endif
1382#endif
1383
1384 c_ctx=SSL_CTX_new(meth);
1385 s_ctx=SSL_CTX_new(meth);
1386 if ((c_ctx == NULL) || (s_ctx == NULL))
1387 {
1388 ERR_print_errors(bio_err);
1389 goto end;
1390 }
Dr. Stephen Henson77a926e2014-02-16 12:50:18 +00001391 /* Since we will use low security ciphersuites and keys for
1392 * testing set security level to zero.
1393 */
1394 SSL_CTX_set_security_level(c_ctx, 0);
1395 SSL_CTX_set_security_level(s_ctx, 0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001396
1397 if (cipher != NULL)
1398 {
1399 SSL_CTX_set_cipher_list(c_ctx,cipher);
1400 SSL_CTX_set_cipher_list(s_ctx,cipher);
1401 }
1402
Richard Levittebc36ee62001-02-20 08:13:47 +00001403#ifndef OPENSSL_NO_DH
Bodo Möller77fa04a1999-09-03 16:31:36 +00001404 if (!no_dhe)
Bodo Möller48c843c1999-08-05 11:50:18 +00001405 {
Bodo Möllere4589582000-03-10 13:23:20 +00001406 if (dhe1024dsa)
Bodo Möller48c843c1999-08-05 11:50:18 +00001407 {
Bodo Möllere4589582000-03-10 13:23:20 +00001408 /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
Bodo Möller77fa04a1999-09-03 16:31:36 +00001409 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
Bodo Möllere4589582000-03-10 13:23:20 +00001410 dh=get_dh1024dsa();
Bodo Möller48c843c1999-08-05 11:50:18 +00001411 }
Bodo Möllere4589582000-03-10 13:23:20 +00001412 else if (dhe1024)
1413 dh=get_dh1024();
Bodo Möller77fa04a1999-09-03 16:31:36 +00001414 else
Bodo Möller77fa04a1999-09-03 16:31:36 +00001415 dh=get_dh512();
1416 SSL_CTX_set_tmp_dh(s_ctx,dh);
1417 DH_free(dh);
1418 }
Bodo Möllere4589582000-03-10 13:23:20 +00001419#else
1420 (void)no_dhe;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001421#endif
1422
Bodo Möllerea262262002-08-09 08:56:08 +00001423#ifndef OPENSSL_NO_ECDH
1424 if (!no_ecdhe)
1425 {
Nils Larsch9dd84052005-05-16 10:11:04 +00001426 int nid;
1427
1428 if (named_curve != NULL)
Bodo Möllerea262262002-08-09 08:56:08 +00001429 {
Nils Larsch9dd84052005-05-16 10:11:04 +00001430 nid = OBJ_sn2nid(named_curve);
1431 if (nid == 0)
1432 {
1433 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1434 goto end;
Bodo Möllerea262262002-08-09 08:56:08 +00001435 }
Bodo Möllerea262262002-08-09 08:56:08 +00001436 }
Nils Larsch9dd84052005-05-16 10:11:04 +00001437 else
Dr. Stephen Hensonb3310162011-02-12 17:23:32 +00001438#ifdef OPENSSL_NO_EC2M
1439 nid = NID_X9_62_prime256v1;
1440#else
Nils Larsch9dd84052005-05-16 10:11:04 +00001441 nid = NID_sect163r2;
Dr. Stephen Hensonb3310162011-02-12 17:23:32 +00001442#endif
Nils Larsch9dd84052005-05-16 10:11:04 +00001443
1444 ecdh = EC_KEY_new_by_curve_name(nid);
1445 if (ecdh == NULL)
1446 {
1447 BIO_printf(bio_err, "unable to create curve\n");
1448 goto end;
1449 }
1450
1451 SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
1452 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
1453 EC_KEY_free(ecdh);
Bodo Möllerea262262002-08-09 08:56:08 +00001454 }
1455#else
1456 (void)no_ecdhe;
1457#endif
1458
Richard Levittebc36ee62001-02-20 08:13:47 +00001459#ifndef OPENSSL_NO_RSA
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001460 SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001461#endif
1462
Bodo Möller761772d2007-09-21 06:54:24 +00001463#ifdef TLSEXT_TYPE_opaque_prf_input
1464 SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
1465 SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
1466 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
1467 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
1468#endif
1469
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001470 if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
1471 {
1472 ERR_print_errors(bio_err);
1473 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001474 else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
1475 (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001476 {
1477 ERR_print_errors(bio_err);
1478 goto end;
1479 }
1480
1481 if (client_auth)
1482 {
1483 SSL_CTX_use_certificate_file(c_ctx,client_cert,
1484 SSL_FILETYPE_PEM);
Bodo Möller65b002f2000-03-13 19:24:39 +00001485 SSL_CTX_use_PrivateKey_file(c_ctx,
1486 (client_key?client_key:client_cert),
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001487 SSL_FILETYPE_PEM);
1488 }
1489
1490 if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
1491 (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1492 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
1493 (!SSL_CTX_set_default_verify_paths(c_ctx)))
1494 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001495 /* fprintf(stderr,"SSL_load_verify_locations\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001496 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001497 /* goto end; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001498 }
1499
1500 if (client_auth)
1501 {
Bodo Möller53002dc2000-02-04 11:21:18 +00001502 BIO_printf(bio_err,"client authentication\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001503 SSL_CTX_set_verify(s_ctx,
1504 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1505 verify_callback);
Richard Levittea7201e92005-01-17 17:06:58 +00001506 SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001507 }
1508 if (server_auth)
1509 {
Bodo Möller53002dc2000-02-04 11:21:18 +00001510 BIO_printf(bio_err,"server authentication\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001511 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
1512 verify_callback);
Richard Levittea7201e92005-01-17 17:06:58 +00001513 SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001514 }
Bodo Möllerb1fe6ca1999-11-16 23:15:41 +00001515
1516 {
1517 int session_id_context = 0;
1518 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
1519 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001520
Nils Larschddac1972006-03-10 23:06:27 +00001521 /* Use PSK only if PSK key is given */
1522 if (psk_key != NULL)
1523 {
1524 /* no_psk is used to avoid putting psk command to openssl tool */
1525 if (no_psk)
1526 {
1527 /* if PSK is not compiled in and psk key is
1528 * given, do nothing and exit successfully */
1529 ret=0;
1530 goto end;
1531 }
1532#ifndef OPENSSL_NO_PSK
1533 SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1534 SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1535 if (debug)
1536 BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
1537 if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
1538 {
1539 BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
1540 ERR_print_errors(bio_err);
1541 goto end;
1542 }
1543#endif
1544 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001545#ifndef OPENSSL_NO_SRP
1546 if (srp_client_arg.srplogin)
1547 {
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +00001548 if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
Ben Laurieedc032b2011-03-12 17:01:19 +00001549 {
1550 BIO_printf(bio_err,"Unable to set SRP username\n");
1551 goto end;
1552 }
1553 SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
1554 SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
1555 /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
1556 }
1557
1558 if (srp_server_arg.expected_user != NULL)
1559 {
1560 SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
1561 SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1562 SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1563 }
1564#endif
Nils Larschddac1972006-03-10 23:06:27 +00001565
Piotr Sikora29115752013-11-13 15:20:22 -08001566#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00001567 if (npn_client)
1568 {
1569 SSL_CTX_set_next_proto_select_cb(c_ctx, cb_client_npn, NULL);
1570 }
1571 if (npn_server)
1572 {
1573 if (npn_server_reject)
1574 {
1575 BIO_printf(bio_err, "Can't have both -npn_server and -npn_server_reject\n");
1576 goto end;
1577 }
1578 SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_npn, NULL);
1579 }
1580 if (npn_server_reject)
1581 {
1582 SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_rejects_npn, NULL);
1583 }
1584#endif
1585
Trevora398f822013-05-12 18:55:27 -07001586 if (serverinfo_sct)
Trevor9cd50f72013-06-13 22:36:45 -07001587 SSL_CTX_set_custom_cli_ext(c_ctx, SCT_EXT_TYPE, NULL,
1588 serverinfo_cli_cb, NULL);
Trevora398f822013-05-12 18:55:27 -07001589 if (serverinfo_tack)
Trevor9cd50f72013-06-13 22:36:45 -07001590 SSL_CTX_set_custom_cli_ext(c_ctx, TACK_EXT_TYPE, NULL,
1591 serverinfo_cli_cb, NULL);
Trevora398f822013-05-12 18:55:27 -07001592
1593 if (serverinfo_file)
1594 if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file))
1595 {
1596 BIO_printf(bio_err, "missing serverinfo file\n");
1597 goto end;
1598 }
1599
Trevor9cd50f72013-06-13 22:36:45 -07001600 if (custom_ext)
1601 {
1602 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_0,
1603 custom_ext_0_cli_first_cb,
1604 custom_ext_0_cli_second_cb, NULL);
1605 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_1,
1606 custom_ext_1_cli_first_cb,
1607 custom_ext_1_cli_second_cb, NULL);
1608 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_2,
1609 custom_ext_2_cli_first_cb,
1610 custom_ext_2_cli_second_cb, NULL);
1611 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_3,
1612 custom_ext_3_cli_first_cb,
1613 custom_ext_3_cli_second_cb, NULL);
1614
1615
1616 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_0,
1617 custom_ext_0_srv_first_cb,
1618 custom_ext_0_srv_second_cb, NULL);
1619 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_1,
1620 custom_ext_1_srv_first_cb,
1621 custom_ext_1_srv_second_cb, NULL);
1622 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_2,
1623 custom_ext_2_srv_first_cb,
1624 custom_ext_2_srv_second_cb, NULL);
1625 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_3,
1626 custom_ext_3_srv_first_cb,
1627 custom_ext_3_srv_second_cb, NULL);
1628 }
1629
Adam Langleya8989362013-07-15 15:57:16 -04001630 if (alpn_server)
1631 SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, NULL);
1632
1633 if (alpn_client)
1634 {
1635 unsigned short alpn_len;
1636 unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
1637
1638 if (alpn == NULL)
1639 {
1640 BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
1641 goto end;
1642 }
1643 SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len);
1644 OPENSSL_free(alpn);
1645 }
1646
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001647 c_ssl=SSL_new(c_ctx);
1648 s_ssl=SSL_new(s_ctx);
1649
Richard Levittebc36ee62001-02-20 08:13:47 +00001650#ifndef OPENSSL_NO_KRB5
Richard Levittef9b3bff2000-11-30 22:53:34 +00001651 if (c_ssl && c_ssl->kssl_ctx)
1652 {
Ben Laurie54a656e2002-11-13 15:43:43 +00001653 char localhost[MAXHOSTNAMELEN+2];
Richard Levittef9b3bff2000-11-30 22:53:34 +00001654
Ben Laurie54a656e2002-11-13 15:43:43 +00001655 if (gethostname(localhost, sizeof localhost-1) == 0)
Richard Levittef9b3bff2000-11-30 22:53:34 +00001656 {
Ben Laurie54a656e2002-11-13 15:43:43 +00001657 localhost[sizeof localhost-1]='\0';
1658 if(strlen(localhost) == sizeof localhost-1)
1659 {
1660 BIO_printf(bio_err,"localhost name too long\n");
Richard Levitte31be2da2002-11-26 10:09:36 +00001661 goto end;
Ben Laurie54a656e2002-11-13 15:43:43 +00001662 }
Richard Levittef9b3bff2000-11-30 22:53:34 +00001663 kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
1664 localhost);
1665 }
1666 }
Richard Levittebc36ee62001-02-20 08:13:47 +00001667#endif /* OPENSSL_NO_KRB5 */
Richard Levittef9b3bff2000-11-30 22:53:34 +00001668
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001669 for (i=0; i<number; i++)
1670 {
1671 if (!reuse) SSL_set_session(c_ssl,NULL);
Bodo Möller95d29591999-06-12 01:03:40 +00001672 if (bio_pair)
Bodo Möller563f1502000-03-13 15:06:54 +00001673 ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
Bodo Möller95d29591999-06-12 01:03:40 +00001674 else
1675 ret=doit(s_ssl,c_ssl,bytes);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001676 }
1677
1678 if (!verbose)
1679 {
Bodo Möller563f1502000-03-13 15:06:54 +00001680 print_details(c_ssl, "");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001681 }
1682 if ((number > 1) || (bytes > 1L))
Bodo Möller53002dc2000-02-04 11:21:18 +00001683 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
Bodo Möller563f1502000-03-13 15:06:54 +00001684 if (print_time)
1685 {
Bodo Möller617d71b2000-03-26 12:27:30 +00001686#ifdef CLOCKS_PER_SEC
1687 /* "To determine the time in seconds, the value returned
1688 * by the clock function should be divided by the value
1689 * of the macro CLOCKS_PER_SEC."
1690 * -- ISO/IEC 9899 */
Bodo Möller563f1502000-03-13 15:06:54 +00001691 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1692 "Approximate total client time: %6.2f s\n",
1693 (double)s_time/CLOCKS_PER_SEC,
1694 (double)c_time/CLOCKS_PER_SEC);
Bodo Möller617d71b2000-03-26 12:27:30 +00001695#else
1696 /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
1697 * -- cc on NeXTstep/OpenStep */
1698 BIO_printf(bio_stdout,
1699 "Approximate total server time: %6.2f units\n"
1700 "Approximate total client time: %6.2f units\n",
1701 (double)s_time,
1702 (double)c_time);
1703#endif
Bodo Möller563f1502000-03-13 15:06:54 +00001704 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001705
1706 SSL_free(s_ssl);
1707 SSL_free(c_ssl);
1708
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001709end:
1710 if (s_ctx != NULL) SSL_CTX_free(s_ctx);
1711 if (c_ctx != NULL) SSL_CTX_free(c_ctx);
1712
1713 if (bio_stdout != NULL) BIO_free(bio_stdout);
1714
Richard Levittebc36ee62001-02-20 08:13:47 +00001715#ifndef OPENSSL_NO_RSA
Bodo Möller46b3bd52000-04-06 22:25:49 +00001716 free_tmp_rsa();
1717#endif
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001718#ifndef OPENSSL_NO_ENGINE
Bodo Möllerb8e2f832001-07-04 20:55:36 +00001719 ENGINE_cleanup();
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001720#endif
Geoff Thorpe79aa04e2001-09-01 20:02:13 +00001721 CRYPTO_cleanup_all_ex_data();
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001722 ERR_free_strings();
Geoff Thorpe4c329692008-08-06 15:54:15 +00001723 ERR_remove_thread_state(NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001724 EVP_cleanup();
1725 CRYPTO_mem_leaks(bio_err);
Bodo Möller79875771999-10-25 19:36:01 +00001726 if (bio_err != NULL) BIO_free(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001727 EXIT(ret);
Andy Polyakov19bd66f2005-08-03 19:56:36 +00001728 return ret;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001729 }
1730
Bodo Möller563f1502000-03-13 15:06:54 +00001731int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
1732 clock_t *s_time, clock_t *c_time)
Bodo Möller95d29591999-06-12 01:03:40 +00001733 {
1734 long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1735 BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1736 BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
Bodo Möller95d29591999-06-12 01:03:40 +00001737 int ret = 1;
1738
1739 size_t bufsiz = 256; /* small buffer for testing */
1740
1741 if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
1742 goto err;
1743 if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
1744 goto err;
1745
1746 s_ssl_bio = BIO_new(BIO_f_ssl());
1747 if (!s_ssl_bio)
1748 goto err;
1749
1750 c_ssl_bio = BIO_new(BIO_f_ssl());
1751 if (!c_ssl_bio)
1752 goto err;
1753
1754 SSL_set_connect_state(c_ssl);
1755 SSL_set_bio(c_ssl, client, client);
1756 (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1757
1758 SSL_set_accept_state(s_ssl);
1759 SSL_set_bio(s_ssl, server, server);
1760 (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1761
1762 do
1763 {
1764 /* c_ssl_bio: SSL filter BIO
1765 *
1766 * client: pseudo-I/O for SSL library
1767 *
1768 * client_io: client's SSL communication; usually to be
1769 * relayed over some I/O facility, but in this
1770 * test program, we're the server, too:
1771 *
1772 * server_io: server's SSL communication
1773 *
1774 * server: pseudo-I/O for SSL library
1775 *
1776 * s_ssl_bio: SSL filter BIO
1777 *
1778 * The client and the server each employ a "BIO pair":
1779 * client + client_io, server + server_io.
1780 * BIO pairs are symmetric. A BIO pair behaves similar
1781 * to a non-blocking socketpair (but both endpoints must
1782 * be handled by the same thread).
Bodo Möller7eea36b1999-07-12 18:50:34 +00001783 * [Here we could connect client and server to the ends
1784 * of a single BIO pair, but then this code would be less
1785 * suitable as an example for BIO pairs in general.]
Bodo Möller95d29591999-06-12 01:03:40 +00001786 *
1787 * Useful functions for querying the state of BIO pair endpoints:
1788 *
1789 * BIO_ctrl_pending(bio) number of bytes we can read now
Bodo Möllerf50c0492000-02-04 00:56:09 +00001790 * BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil
Bodo Möller95d29591999-06-12 01:03:40 +00001791 * other side's read attempt
Ulf Möller657e60f2000-02-03 23:23:24 +00001792 * BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now
Bodo Möller95d29591999-06-12 01:03:40 +00001793 *
1794 * ..._read_request is never more than ..._write_guarantee;
1795 * it depends on the application which one you should use.
1796 */
1797
1798 /* We have non-blocking behaviour throughout this test program, but
1799 * can be sure that there is *some* progress in each iteration; so
1800 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
1801 * -- we just try everything in each iteration
1802 */
1803
1804 {
1805 /* CLIENT */
1806
1807 MS_STATIC char cbuf[1024*8];
1808 int i, r;
Bodo Möller563f1502000-03-13 15:06:54 +00001809 clock_t c_clock = clock();
Bodo Möller95d29591999-06-12 01:03:40 +00001810
Bodo Möller896e4fe2002-11-05 13:54:41 +00001811 memset(cbuf, 0, sizeof(cbuf));
1812
Bodo Möller95d29591999-06-12 01:03:40 +00001813 if (debug)
1814 if (SSL_in_init(c_ssl))
1815 printf("client waiting in SSL_connect - %s\n",
1816 SSL_state_string_long(c_ssl));
1817
1818 if (cw_num > 0)
1819 {
1820 /* Write to server. */
1821
1822 if (cw_num > (long)sizeof cbuf)
1823 i = sizeof cbuf;
1824 else
1825 i = (int)cw_num;
1826 r = BIO_write(c_ssl_bio, cbuf, i);
Bodo Möller29159a41999-08-09 16:33:34 +00001827 if (r < 0)
Bodo Möller95d29591999-06-12 01:03:40 +00001828 {
1829 if (!BIO_should_retry(c_ssl_bio))
1830 {
1831 fprintf(stderr,"ERROR in CLIENT\n");
1832 goto err;
1833 }
1834 /* BIO_should_retry(...) can just be ignored here.
1835 * The library expects us to call BIO_write with
1836 * the same arguments again, and that's what we will
1837 * do in the next iteration. */
1838 }
1839 else if (r == 0)
1840 {
1841 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1842 goto err;
1843 }
1844 else
1845 {
1846 if (debug)
1847 printf("client wrote %d\n", r);
1848 cw_num -= r;
1849 }
1850 }
1851
1852 if (cr_num > 0)
1853 {
1854 /* Read from server. */
1855
1856 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
1857 if (r < 0)
1858 {
1859 if (!BIO_should_retry(c_ssl_bio))
1860 {
1861 fprintf(stderr,"ERROR in CLIENT\n");
1862 goto err;
1863 }
1864 /* Again, "BIO_should_retry" can be ignored. */
1865 }
1866 else if (r == 0)
1867 {
1868 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1869 goto err;
1870 }
1871 else
1872 {
1873 if (debug)
1874 printf("client read %d\n", r);
1875 cr_num -= r;
1876 }
1877 }
Bodo Möller563f1502000-03-13 15:06:54 +00001878
1879 /* c_time and s_time increments will typically be very small
1880 * (depending on machine speed and clock tick intervals),
1881 * but sampling over a large number of connections should
1882 * result in fairly accurate figures. We cannot guarantee
1883 * a lot, however -- if each connection lasts for exactly
1884 * one clock tick, it will be counted only for the client
1885 * or only for the server or even not at all.
1886 */
1887 *c_time += (clock() - c_clock);
Bodo Möller95d29591999-06-12 01:03:40 +00001888 }
1889
1890 {
1891 /* SERVER */
1892
1893 MS_STATIC char sbuf[1024*8];
1894 int i, r;
Bodo Möller563f1502000-03-13 15:06:54 +00001895 clock_t s_clock = clock();
Bodo Möller95d29591999-06-12 01:03:40 +00001896
Bodo Möller896e4fe2002-11-05 13:54:41 +00001897 memset(sbuf, 0, sizeof(sbuf));
1898
Bodo Möller95d29591999-06-12 01:03:40 +00001899 if (debug)
1900 if (SSL_in_init(s_ssl))
1901 printf("server waiting in SSL_accept - %s\n",
1902 SSL_state_string_long(s_ssl));
1903
1904 if (sw_num > 0)
1905 {
1906 /* Write to client. */
1907
1908 if (sw_num > (long)sizeof sbuf)
1909 i = sizeof sbuf;
1910 else
1911 i = (int)sw_num;
1912 r = BIO_write(s_ssl_bio, sbuf, i);
Bodo Möller29159a41999-08-09 16:33:34 +00001913 if (r < 0)
Bodo Möller95d29591999-06-12 01:03:40 +00001914 {
1915 if (!BIO_should_retry(s_ssl_bio))
1916 {
1917 fprintf(stderr,"ERROR in SERVER\n");
1918 goto err;
1919 }
1920 /* Ignore "BIO_should_retry". */
1921 }
1922 else if (r == 0)
1923 {
1924 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1925 goto err;
1926 }
1927 else
1928 {
1929 if (debug)
1930 printf("server wrote %d\n", r);
1931 sw_num -= r;
1932 }
1933 }
1934
1935 if (sr_num > 0)
1936 {
1937 /* Read from client. */
1938
1939 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
1940 if (r < 0)
1941 {
1942 if (!BIO_should_retry(s_ssl_bio))
1943 {
1944 fprintf(stderr,"ERROR in SERVER\n");
1945 goto err;
1946 }
1947 /* blah, blah */
1948 }
1949 else if (r == 0)
1950 {
1951 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1952 goto err;
1953 }
1954 else
1955 {
1956 if (debug)
1957 printf("server read %d\n", r);
1958 sr_num -= r;
1959 }
1960 }
Bodo Möller563f1502000-03-13 15:06:54 +00001961
1962 *s_time += (clock() - s_clock);
Bodo Möller95d29591999-06-12 01:03:40 +00001963 }
1964
1965 {
1966 /* "I/O" BETWEEN CLIENT AND SERVER. */
1967
Bodo Möller95d29591999-06-12 01:03:40 +00001968 size_t r1, r2;
Bodo Möller6f7af151999-09-10 14:03:21 +00001969 BIO *io1 = server_io, *io2 = client_io;
1970 /* we use the non-copying interface for io1
1971 * and the standard BIO_write/BIO_read interface for io2
1972 */
1973
Bodo Möller95d29591999-06-12 01:03:40 +00001974 static int prev_progress = 1;
1975 int progress = 0;
1976
Bodo Möller6f7af151999-09-10 14:03:21 +00001977 /* io1 to io2 */
Bodo Möller95d29591999-06-12 01:03:40 +00001978 do
1979 {
Bodo Möller6f7af151999-09-10 14:03:21 +00001980 size_t num;
Bodo Möllerb52f3812002-04-29 11:03:06 +00001981 int r;
Bodo Möller6f7af151999-09-10 14:03:21 +00001982
1983 r1 = BIO_ctrl_pending(io1);
1984 r2 = BIO_ctrl_get_write_guarantee(io2);
Bodo Möller95d29591999-06-12 01:03:40 +00001985
1986 num = r1;
1987 if (r2 < num)
1988 num = r2;
1989 if (num)
1990 {
Bodo Möller6f7af151999-09-10 14:03:21 +00001991 char *dataptr;
1992
Bodo Möller95d29591999-06-12 01:03:40 +00001993 if (INT_MAX < num) /* yeah, right */
1994 num = INT_MAX;
1995
Bodo Möller6f7af151999-09-10 14:03:21 +00001996 r = BIO_nread(io1, &dataptr, (int)num);
1997 assert(r > 0);
1998 assert(r <= (int)num);
1999 /* possibly r < num (non-contiguous data) */
2000 num = r;
2001 r = BIO_write(io2, dataptr, (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002002 if (r != (int)num) /* can't happen */
2003 {
2004 fprintf(stderr, "ERROR: BIO_write could not write "
2005 "BIO_ctrl_get_write_guarantee() bytes");
2006 goto err;
2007 }
2008 progress = 1;
2009
2010 if (debug)
Bodo Möller6f7af151999-09-10 14:03:21 +00002011 printf((io1 == client_io) ?
2012 "C->S relaying: %d bytes\n" :
2013 "S->C relaying: %d bytes\n",
2014 (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002015 }
2016 }
2017 while (r1 && r2);
2018
Bodo Möller6f7af151999-09-10 14:03:21 +00002019 /* io2 to io1 */
2020 {
2021 size_t num;
2022 int r;
Bodo Möller95d29591999-06-12 01:03:40 +00002023
Bodo Möller6f7af151999-09-10 14:03:21 +00002024 r1 = BIO_ctrl_pending(io2);
2025 r2 = BIO_ctrl_get_read_request(io1);
2026 /* here we could use ..._get_write_guarantee instead of
2027 * ..._get_read_request, but by using the latter
2028 * we test restartability of the SSL implementation
2029 * more thoroughly */
Bodo Möller95d29591999-06-12 01:03:40 +00002030 num = r1;
2031 if (r2 < num)
2032 num = r2;
2033 if (num)
2034 {
Bodo Möller6f7af151999-09-10 14:03:21 +00002035 char *dataptr;
2036
Bodo Möller95d29591999-06-12 01:03:40 +00002037 if (INT_MAX < num)
2038 num = INT_MAX;
Bodo Möller6f7af151999-09-10 14:03:21 +00002039
2040 if (num > 1)
Bodo Möllercb0369d1999-09-10 16:41:01 +00002041 --num; /* test restartability even more thoroughly */
Bodo Möller95d29591999-06-12 01:03:40 +00002042
Bodo Möller234c7372002-03-14 09:48:54 +00002043 r = BIO_nwrite0(io1, &dataptr);
Bodo Möller6f7af151999-09-10 14:03:21 +00002044 assert(r > 0);
Richard Levittecc129752002-04-29 10:29:38 +00002045 if (r < (int)num)
Bodo Möller234c7372002-03-14 09:48:54 +00002046 num = r;
Bodo Möller6f7af151999-09-10 14:03:21 +00002047 r = BIO_read(io2, dataptr, (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002048 if (r != (int)num) /* can't happen */
2049 {
2050 fprintf(stderr, "ERROR: BIO_read could not read "
2051 "BIO_ctrl_pending() bytes");
2052 goto err;
2053 }
Bodo Möller95d29591999-06-12 01:03:40 +00002054 progress = 1;
Bodo Möller234c7372002-03-14 09:48:54 +00002055 r = BIO_nwrite(io1, &dataptr, (int)num);
2056 if (r != (int)num) /* can't happen */
2057 {
2058 fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
2059 "BIO_nwrite0() bytes");
2060 goto err;
2061 }
Bodo Möller6f7af151999-09-10 14:03:21 +00002062
Bodo Möller95d29591999-06-12 01:03:40 +00002063 if (debug)
Bodo Möller6f7af151999-09-10 14:03:21 +00002064 printf((io2 == client_io) ?
2065 "C->S relaying: %d bytes\n" :
2066 "S->C relaying: %d bytes\n",
2067 (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002068 }
Bodo Möller6f7af151999-09-10 14:03:21 +00002069 } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
Bodo Möller95d29591999-06-12 01:03:40 +00002070
2071 if (!progress && !prev_progress)
2072 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
Bodo Möller95d29591999-06-12 01:03:40 +00002073 {
2074 fprintf(stderr, "ERROR: got stuck\n");
Bodo Möllerd7fcc7f1999-06-12 11:07:52 +00002075 if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
2076 {
2077 fprintf(stderr, "This can happen for SSL2 because "
2078 "CLIENT-FINISHED and SERVER-VERIFY are written \n"
2079 "concurrently ...");
2080 if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
2081 && strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
2082 {
2083 fprintf(stderr, " ok.\n");
2084 goto end;
2085 }
2086 }
2087 fprintf(stderr, " ERROR.\n");
Bodo Möller95d29591999-06-12 01:03:40 +00002088 goto err;
2089 }
2090 prev_progress = progress;
2091 }
2092 }
2093 while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2094
Bodo Möller95d29591999-06-12 01:03:40 +00002095 if (verbose)
Bodo Möller563f1502000-03-13 15:06:54 +00002096 print_details(c_ssl, "DONE via BIO pair: ");
Piotr Sikora29115752013-11-13 15:20:22 -08002097#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00002098 if (verify_npn(c_ssl, s_ssl) < 0)
2099 {
2100 ret = 1;
2101 goto end;
2102 }
2103#endif
Trevora398f822013-05-12 18:55:27 -07002104 if (verify_serverinfo() < 0)
2105 {
2106 ret = 1;
2107 goto err;
2108 }
Adam Langleya8989362013-07-15 15:57:16 -04002109 if (verify_alpn(c_ssl, s_ssl) < 0)
2110 {
2111 ret = 1;
2112 goto err;
2113 }
Trevora398f822013-05-12 18:55:27 -07002114
Trevor9cd50f72013-06-13 22:36:45 -07002115 if (custom_ext_error)
2116 {
2117 ret = 1;
2118 goto err;
2119 }
2120
Bodo Möller563f1502000-03-13 15:06:54 +00002121end:
Bodo Möller95d29591999-06-12 01:03:40 +00002122 ret = 0;
2123
2124 err:
2125 ERR_print_errors(bio_err);
2126
2127 if (server)
2128 BIO_free(server);
2129 if (server_io)
2130 BIO_free(server_io);
2131 if (client)
2132 BIO_free(client);
2133 if (client_io)
2134 BIO_free(client_io);
2135 if (s_ssl_bio)
2136 BIO_free(s_ssl_bio);
2137 if (c_ssl_bio)
2138 BIO_free(c_ssl_bio);
2139
2140 return ret;
2141 }
2142
2143
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002144#define W_READ 1
2145#define W_WRITE 2
2146#define C_DONE 1
2147#define S_DONE 2
2148
Ulf Möller6b691a51999-04-19 21:31:43 +00002149int doit(SSL *s_ssl, SSL *c_ssl, long count)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002150 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002151 char *cbuf=NULL,*sbuf=NULL;
2152 long bufsiz;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002153 long cw_num=count,cr_num=count;
2154 long sw_num=count,sr_num=count;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002155 int ret=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002156 BIO *c_to_s=NULL;
2157 BIO *s_to_c=NULL;
2158 BIO *c_bio=NULL;
2159 BIO *s_bio=NULL;
2160 int c_r,c_w,s_r,s_w;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002161 int i,j;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002162 int done=0;
2163 int c_write,s_write;
2164 int do_server=0,do_client=0;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002165 int max_frag = 5*1024;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002166
Andy Polyakov77a27a52014-06-11 20:40:51 +02002167 bufsiz = count>40*1024 ? 40*1024 : count;
2168
2169 if ((cbuf = OPENSSL_malloc(bufsiz))==NULL) goto err;
2170 if ((sbuf = OPENSSL_malloc(bufsiz))==NULL) goto err;
2171
2172 memset(cbuf,0,bufsiz);
2173 memset(sbuf,0,bufsiz);
Bodo Möller896e4fe2002-11-05 13:54:41 +00002174
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002175 c_to_s=BIO_new(BIO_s_mem());
2176 s_to_c=BIO_new(BIO_s_mem());
2177 if ((s_to_c == NULL) || (c_to_s == NULL))
2178 {
2179 ERR_print_errors(bio_err);
2180 goto err;
2181 }
2182
2183 c_bio=BIO_new(BIO_f_ssl());
2184 s_bio=BIO_new(BIO_f_ssl());
2185 if ((c_bio == NULL) || (s_bio == NULL))
2186 {
2187 ERR_print_errors(bio_err);
2188 goto err;
2189 }
2190
2191 SSL_set_connect_state(c_ssl);
2192 SSL_set_bio(c_ssl,s_to_c,c_to_s);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002193 SSL_set_max_send_fragment(c_ssl,max_frag);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002194 BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002195
2196 SSL_set_accept_state(s_ssl);
2197 SSL_set_bio(s_ssl,c_to_s,s_to_c);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002198 SSL_set_max_send_fragment(s_ssl,max_frag);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002199 BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002200
2201 c_r=0; s_r=1;
2202 c_w=1; s_w=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002203 c_write=1,s_write=0;
2204
2205 /* We can always do writes */
2206 for (;;)
2207 {
2208 do_server=0;
2209 do_client=0;
2210
2211 i=(int)BIO_pending(s_bio);
2212 if ((i && s_r) || s_w) do_server=1;
2213
2214 i=(int)BIO_pending(c_bio);
2215 if ((i && c_r) || c_w) do_client=1;
2216
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002217 if (do_server && debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002218 {
2219 if (SSL_in_init(s_ssl))
2220 printf("server waiting in SSL_accept - %s\n",
2221 SSL_state_string_long(s_ssl));
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002222/* else if (s_write)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002223 printf("server:SSL_write()\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002224 else
2225 printf("server:SSL_read()\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002226 }
2227
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002228 if (do_client && debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002229 {
2230 if (SSL_in_init(c_ssl))
2231 printf("client waiting in SSL_connect - %s\n",
2232 SSL_state_string_long(c_ssl));
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002233/* else if (c_write)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002234 printf("client:SSL_write()\n");
2235 else
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002236 printf("client:SSL_read()\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002237 }
2238
2239 if (!do_client && !do_server)
2240 {
2241 fprintf(stdout,"ERROR IN STARTUP\n");
2242 ERR_print_errors(bio_err);
2243 break;
2244 }
2245 if (do_client && !(done & C_DONE))
2246 {
2247 if (c_write)
2248 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002249 j = (cw_num > bufsiz) ?
2250 (int)bufsiz : (int)cw_num;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002251 i=BIO_write(c_bio,cbuf,j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002252 if (i < 0)
2253 {
2254 c_r=0;
2255 c_w=0;
2256 if (BIO_should_retry(c_bio))
2257 {
2258 if (BIO_should_read(c_bio))
2259 c_r=1;
2260 if (BIO_should_write(c_bio))
2261 c_w=1;
2262 }
2263 else
2264 {
2265 fprintf(stderr,"ERROR in CLIENT\n");
2266 ERR_print_errors(bio_err);
2267 goto err;
2268 }
2269 }
2270 else if (i == 0)
2271 {
2272 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2273 goto err;
2274 }
2275 else
2276 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002277 if (debug)
2278 printf("client wrote %d\n",i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002279 /* ok */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002280 s_r=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002281 c_write=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002282 cw_num-=i;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002283 if (max_frag>1029)
2284 SSL_set_max_send_fragment(c_ssl,max_frag-=5);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002285 }
2286 }
2287 else
2288 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002289 i=BIO_read(c_bio,cbuf,bufsiz);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002290 if (i < 0)
2291 {
2292 c_r=0;
2293 c_w=0;
2294 if (BIO_should_retry(c_bio))
2295 {
2296 if (BIO_should_read(c_bio))
2297 c_r=1;
2298 if (BIO_should_write(c_bio))
2299 c_w=1;
2300 }
2301 else
2302 {
2303 fprintf(stderr,"ERROR in CLIENT\n");
2304 ERR_print_errors(bio_err);
2305 goto err;
2306 }
2307 }
2308 else if (i == 0)
2309 {
2310 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2311 goto err;
2312 }
2313 else
2314 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002315 if (debug)
2316 printf("client read %d\n",i);
2317 cr_num-=i;
2318 if (sw_num > 0)
2319 {
2320 s_write=1;
2321 s_w=1;
2322 }
2323 if (cr_num <= 0)
2324 {
2325 s_write=1;
2326 s_w=1;
2327 done=S_DONE|C_DONE;
2328 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002329 }
2330 }
2331 }
2332
2333 if (do_server && !(done & S_DONE))
2334 {
2335 if (!s_write)
2336 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002337 i=BIO_read(s_bio,sbuf,bufsiz);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002338 if (i < 0)
2339 {
2340 s_r=0;
2341 s_w=0;
2342 if (BIO_should_retry(s_bio))
2343 {
2344 if (BIO_should_read(s_bio))
2345 s_r=1;
2346 if (BIO_should_write(s_bio))
2347 s_w=1;
2348 }
2349 else
2350 {
2351 fprintf(stderr,"ERROR in SERVER\n");
2352 ERR_print_errors(bio_err);
2353 goto err;
2354 }
2355 }
2356 else if (i == 0)
2357 {
2358 ERR_print_errors(bio_err);
2359 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
2360 goto err;
2361 }
2362 else
2363 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002364 if (debug)
2365 printf("server read %d\n",i);
2366 sr_num-=i;
2367 if (cw_num > 0)
2368 {
2369 c_write=1;
2370 c_w=1;
2371 }
2372 if (sr_num <= 0)
2373 {
2374 s_write=1;
2375 s_w=1;
2376 c_write=0;
2377 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002378 }
2379 }
2380 else
2381 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002382 j = (sw_num > bufsiz) ?
2383 (int)bufsiz : (int)sw_num;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002384 i=BIO_write(s_bio,sbuf,j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002385 if (i < 0)
2386 {
2387 s_r=0;
2388 s_w=0;
2389 if (BIO_should_retry(s_bio))
2390 {
2391 if (BIO_should_read(s_bio))
2392 s_r=1;
2393 if (BIO_should_write(s_bio))
2394 s_w=1;
2395 }
2396 else
2397 {
2398 fprintf(stderr,"ERROR in SERVER\n");
2399 ERR_print_errors(bio_err);
2400 goto err;
2401 }
2402 }
2403 else if (i == 0)
2404 {
2405 ERR_print_errors(bio_err);
2406 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
2407 goto err;
2408 }
2409 else
2410 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002411 if (debug)
2412 printf("server wrote %d\n",i);
2413 sw_num-=i;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002414 s_write=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002415 c_r=1;
2416 if (sw_num <= 0)
2417 done|=S_DONE;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002418 if (max_frag>1029)
2419 SSL_set_max_send_fragment(s_ssl,max_frag-=5);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002420 }
2421 }
2422 }
2423
2424 if ((done & S_DONE) && (done & C_DONE)) break;
2425 }
2426
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002427 if (verbose)
Bodo Möller563f1502000-03-13 15:06:54 +00002428 print_details(c_ssl, "DONE: ");
Piotr Sikora29115752013-11-13 15:20:22 -08002429#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00002430 if (verify_npn(c_ssl, s_ssl) < 0)
2431 {
2432 ret = 1;
2433 goto err;
2434 }
2435#endif
Trevora398f822013-05-12 18:55:27 -07002436 if (verify_serverinfo() < 0)
2437 {
2438 ret = 1;
2439 goto err;
2440 }
Trevor9cd50f72013-06-13 22:36:45 -07002441 if (custom_ext_error)
2442 {
2443 ret = 1;
2444 goto err;
2445 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002446 ret=0;
2447err:
2448 /* We have to set the BIO's to NULL otherwise they will be
Richard Levitte26a3a482000-06-01 22:19:21 +00002449 * OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002450 * again when c_ssl is SSL_free()ed.
2451 * This is a hack required because s_ssl and c_ssl are sharing the same
2452 * BIO structure and SSL_set_bio() and SSL_free() automatically
2453 * BIO_free non NULL entries.
2454 * You should not normally do this or be required to do this */
2455 if (s_ssl != NULL)
2456 {
2457 s_ssl->rbio=NULL;
2458 s_ssl->wbio=NULL;
2459 }
2460 if (c_ssl != NULL)
2461 {
2462 c_ssl->rbio=NULL;
2463 c_ssl->wbio=NULL;
2464 }
2465
2466 if (c_to_s != NULL) BIO_free(c_to_s);
2467 if (s_to_c != NULL) BIO_free(s_to_c);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002468 if (c_bio != NULL) BIO_free_all(c_bio);
2469 if (s_bio != NULL) BIO_free_all(s_bio);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002470
2471 if (cbuf) OPENSSL_free(cbuf);
2472 if (sbuf) OPENSSL_free(sbuf);
2473
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002474 return(ret);
2475 }
2476
Richard Levittea7201e92005-01-17 17:06:58 +00002477static int get_proxy_auth_ex_data_idx(void)
2478 {
2479 static volatile int idx = -1;
2480 if (idx < 0)
2481 {
2482 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
2483 if (idx < 0)
2484 {
2485 idx = X509_STORE_CTX_get_ex_new_index(0,
2486 "SSLtest for verify callback", NULL,NULL,NULL);
2487 }
2488 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
2489 }
2490 return idx;
2491 }
2492
Bodo Möller396f6311999-09-08 21:58:13 +00002493static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002494 {
2495 char *s,buf[256];
2496
Ben Laurie54a656e2002-11-13 15:43:43 +00002497 s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
2498 sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002499 if (s != NULL)
2500 {
2501 if (ok)
Richard Levittea7201e92005-01-17 17:06:58 +00002502 fprintf(stderr,"depth=%d %s\n",
2503 ctx->error_depth,buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002504 else
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002505 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002506 fprintf(stderr,"depth=%d error=%d %s\n",
2507 ctx->error_depth,ctx->error,buf);
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002508 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002509 }
2510
2511 if (ok == 0)
2512 {
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002513 fprintf(stderr,"Error string: %s\n",
2514 X509_verify_cert_error_string(ctx->error));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002515 switch (ctx->error)
2516 {
2517 case X509_V_ERR_CERT_NOT_YET_VALID:
2518 case X509_V_ERR_CERT_HAS_EXPIRED:
2519 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002520 fprintf(stderr," ... ignored.\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002521 ok=1;
2522 }
2523 }
2524
Richard Levittea7201e92005-01-17 17:06:58 +00002525 if (ok == 1)
2526 {
2527 X509 *xs = ctx->current_cert;
2528#if 0
2529 X509 *xi = ctx->current_issuer;
2530#endif
2531
2532 if (xs->ex_flags & EXFLAG_PROXY)
2533 {
2534 unsigned int *letters =
2535 X509_STORE_CTX_get_ex_data(ctx,
2536 get_proxy_auth_ex_data_idx());
2537
2538 if (letters)
2539 {
2540 int found_any = 0;
2541 int i;
2542 PROXY_CERT_INFO_EXTENSION *pci =
2543 X509_get_ext_d2i(xs, NID_proxyCertInfo,
2544 NULL, NULL);
2545
2546 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
2547 {
2548 case NID_Independent:
2549 /* Completely meaningless in this
2550 program, as there's no way to
2551 grant explicit rights to a
2552 specific PrC. Basically, using
2553 id-ppl-Independent is the perfect
2554 way to grant no rights at all. */
2555 fprintf(stderr, " Independent proxy certificate");
2556 for (i = 0; i < 26; i++)
2557 letters[i] = 0;
2558 break;
2559 case NID_id_ppl_inheritAll:
2560 /* This is basically a NOP, we
2561 simply let the current rights
2562 stand as they are. */
2563 fprintf(stderr, " Proxy certificate inherits all");
2564 break;
2565 default:
2566 s = (char *)
2567 pci->proxyPolicy->policy->data;
2568 i = pci->proxyPolicy->policy->length;
2569
2570 /* The algorithm works as follows:
2571 it is assumed that previous
2572 iterations or the initial granted
2573 rights has already set some elements
2574 of `letters'. What we need to do is
2575 to clear those that weren't granted
2576 by the current PrC as well. The
2577 easiest way to do this is to add 1
2578 to all the elements whose letters
2579 are given with the current policy.
2580 That way, all elements that are set
2581 by the current policy and were
2582 already set by earlier policies and
2583 through the original grant of rights
2584 will get the value 2 or higher.
2585 The last thing to do is to sweep
2586 through `letters' and keep the
2587 elements having the value 2 as set,
2588 and clear all the others. */
2589
2590 fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s);
2591 while(i-- > 0)
2592 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002593 int c = *s++;
Richard Levittea7201e92005-01-17 17:06:58 +00002594 if (isascii(c) && isalpha(c))
2595 {
2596 if (islower(c))
2597 c = toupper(c);
2598 letters[c - 'A']++;
2599 }
2600 }
2601 for (i = 0; i < 26; i++)
2602 if (letters[i] < 2)
2603 letters[i] = 0;
2604 else
2605 letters[i] = 1;
2606 }
2607
2608 found_any = 0;
2609 fprintf(stderr,
2610 ", resulting proxy rights = ");
2611 for(i = 0; i < 26; i++)
2612 if (letters[i])
2613 {
2614 fprintf(stderr, "%c", i + 'A');
2615 found_any = 1;
2616 }
2617 if (!found_any)
2618 fprintf(stderr, "none");
2619 fprintf(stderr, "\n");
2620
2621 PROXY_CERT_INFO_EXTENSION_free(pci);
2622 }
2623 }
2624 }
2625
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002626 return(ok);
2627 }
2628
Richard Levittea7201e92005-01-17 17:06:58 +00002629static void process_proxy_debug(int indent, const char *format, ...)
2630 {
2631 static const char indentation[] =
2632 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
2633 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
2634 char my_format[256];
2635 va_list args;
2636
2637 BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2638 indent, indent, indentation, format);
2639
2640 va_start(args, format);
2641 vfprintf(stderr, my_format, args);
2642 va_end(args);
2643 }
2644/* Priority levels:
2645 0 [!]var, ()
2646 1 & ^
2647 2 |
2648*/
2649static int process_proxy_cond_adders(unsigned int letters[26],
2650 const char *cond, const char **cond_end, int *pos, int indent);
2651static int process_proxy_cond_val(unsigned int letters[26],
2652 const char *cond, const char **cond_end, int *pos, int indent)
2653 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002654 int c;
Richard Levittea7201e92005-01-17 17:06:58 +00002655 int ok = 1;
2656 int negate = 0;
2657
Ben Lauriea51a9722005-06-29 11:02:15 +00002658 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002659 {
2660 cond++; (*pos)++;
2661 }
2662 c = *cond;
2663
2664 if (debug)
2665 process_proxy_debug(indent,
2666 "Start process_proxy_cond_val at position %d: %s\n",
2667 *pos, cond);
2668
2669 while(c == '!')
2670 {
2671 negate = !negate;
2672 cond++; (*pos)++;
Ben Lauriea51a9722005-06-29 11:02:15 +00002673 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002674 {
2675 cond++; (*pos)++;
2676 }
2677 c = *cond;
2678 }
2679
2680 if (c == '(')
2681 {
2682 cond++; (*pos)++;
2683 ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
2684 indent + 1);
2685 cond = *cond_end;
2686 if (ok < 0)
2687 goto end;
Ben Lauriea51a9722005-06-29 11:02:15 +00002688 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002689 {
2690 cond++; (*pos)++;
2691 }
2692 c = *cond;
2693 if (c != ')')
2694 {
2695 fprintf(stderr,
2696 "Weird condition character in position %d: "
2697 "%c\n", *pos, c);
2698 ok = -1;
2699 goto end;
2700 }
2701 cond++; (*pos)++;
2702 }
2703 else if (isascii(c) && isalpha(c))
2704 {
2705 if (islower(c))
2706 c = toupper(c);
2707 ok = letters[c - 'A'];
2708 cond++; (*pos)++;
2709 }
2710 else
2711 {
2712 fprintf(stderr,
2713 "Weird condition character in position %d: "
2714 "%c\n", *pos, c);
2715 ok = -1;
2716 goto end;
2717 }
2718 end:
2719 *cond_end = cond;
2720 if (ok >= 0 && negate)
2721 ok = !ok;
2722
2723 if (debug)
2724 process_proxy_debug(indent,
2725 "End process_proxy_cond_val at position %d: %s, returning %d\n",
2726 *pos, cond, ok);
2727
2728 return ok;
2729 }
2730static int process_proxy_cond_multipliers(unsigned int letters[26],
2731 const char *cond, const char **cond_end, int *pos, int indent)
2732 {
2733 int ok;
2734 char c;
2735
2736 if (debug)
2737 process_proxy_debug(indent,
2738 "Start process_proxy_cond_multipliers at position %d: %s\n",
2739 *pos, cond);
2740
2741 ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
2742 cond = *cond_end;
2743 if (ok < 0)
2744 goto end;
2745
2746 while(ok >= 0)
2747 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002748 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002749 {
2750 cond++; (*pos)++;
2751 }
2752 c = *cond;
2753
2754 switch(c)
2755 {
2756 case '&':
2757 case '^':
2758 {
2759 int save_ok = ok;
2760
2761 cond++; (*pos)++;
2762 ok = process_proxy_cond_val(letters,
2763 cond, cond_end, pos, indent + 1);
2764 cond = *cond_end;
2765 if (ok < 0)
2766 break;
2767
2768 switch(c)
2769 {
2770 case '&':
2771 ok &= save_ok;
2772 break;
2773 case '^':
2774 ok ^= save_ok;
2775 break;
2776 default:
2777 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2778 " STOPPING\n");
2779 EXIT(1);
2780 }
2781 }
2782 break;
2783 default:
2784 goto end;
2785 }
2786 }
2787 end:
2788 if (debug)
2789 process_proxy_debug(indent,
2790 "End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
2791 *pos, cond, ok);
2792
2793 *cond_end = cond;
2794 return ok;
2795 }
2796static int process_proxy_cond_adders(unsigned int letters[26],
2797 const char *cond, const char **cond_end, int *pos, int indent)
2798 {
2799 int ok;
2800 char c;
2801
2802 if (debug)
2803 process_proxy_debug(indent,
2804 "Start process_proxy_cond_adders at position %d: %s\n",
2805 *pos, cond);
2806
2807 ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
2808 indent + 1);
2809 cond = *cond_end;
2810 if (ok < 0)
2811 goto end;
2812
2813 while(ok >= 0)
2814 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002815 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002816 {
2817 cond++; (*pos)++;
2818 }
2819 c = *cond;
2820
2821 switch(c)
2822 {
2823 case '|':
2824 {
2825 int save_ok = ok;
2826
2827 cond++; (*pos)++;
2828 ok = process_proxy_cond_multipliers(letters,
2829 cond, cond_end, pos, indent + 1);
2830 cond = *cond_end;
2831 if (ok < 0)
2832 break;
2833
2834 switch(c)
2835 {
2836 case '|':
2837 ok |= save_ok;
2838 break;
2839 default:
2840 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2841 " STOPPING\n");
2842 EXIT(1);
2843 }
2844 }
2845 break;
2846 default:
2847 goto end;
2848 }
2849 }
2850 end:
2851 if (debug)
2852 process_proxy_debug(indent,
2853 "End process_proxy_cond_adders at position %d: %s, returning %d\n",
2854 *pos, cond, ok);
2855
2856 *cond_end = cond;
2857 return ok;
2858 }
2859
2860static int process_proxy_cond(unsigned int letters[26],
2861 const char *cond, const char **cond_end)
2862 {
2863 int pos = 1;
2864 return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
2865 }
2866
Bodo Möller023ec152002-02-28 10:52:56 +00002867static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
2868 {
Bodo Möller023ec152002-02-28 10:52:56 +00002869 int ok=1;
Richard Levittea7201e92005-01-17 17:06:58 +00002870 struct app_verify_arg *cb_arg = arg;
2871 unsigned int letters[26]; /* only used with proxy_auth */
Bodo Möller023ec152002-02-28 10:52:56 +00002872
Richard Levittea7201e92005-01-17 17:06:58 +00002873 if (cb_arg->app_verify)
Bodo Möller023ec152002-02-28 10:52:56 +00002874 {
Richard Levittea7201e92005-01-17 17:06:58 +00002875 char *s = NULL,buf[256];
2876
2877 fprintf(stderr, "In app_verify_callback, allowing cert. ");
2878 fprintf(stderr, "Arg is: %s\n", cb_arg->string);
Nils Larsch35e85102005-05-10 11:55:28 +00002879 fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
Dr. Stephen Hensonf7951232005-05-12 22:39:42 +00002880 (void *)ctx, (void *)ctx->cert);
Richard Levittea7201e92005-01-17 17:06:58 +00002881 if (ctx->cert)
2882 s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
2883 if (s != NULL)
2884 {
Bodo Möller023ec152002-02-28 10:52:56 +00002885 fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
Richard Levittea7201e92005-01-17 17:06:58 +00002886 }
2887 return(1);
2888 }
2889 if (cb_arg->proxy_auth)
2890 {
2891 int found_any = 0, i;
2892 char *sp;
2893
2894 for(i = 0; i < 26; i++)
2895 letters[i] = 0;
2896 for(sp = cb_arg->proxy_auth; *sp; sp++)
2897 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002898 int c = *sp;
Richard Levittea7201e92005-01-17 17:06:58 +00002899 if (isascii(c) && isalpha(c))
2900 {
2901 if (islower(c))
2902 c = toupper(c);
2903 letters[c - 'A'] = 1;
2904 }
2905 }
2906
2907 fprintf(stderr,
2908 " Initial proxy rights = ");
2909 for(i = 0; i < 26; i++)
2910 if (letters[i])
2911 {
2912 fprintf(stderr, "%c", i + 'A');
2913 found_any = 1;
2914 }
2915 if (!found_any)
2916 fprintf(stderr, "none");
2917 fprintf(stderr, "\n");
2918
2919 X509_STORE_CTX_set_ex_data(ctx,
2920 get_proxy_auth_ex_data_idx(),letters);
Bodo Möller023ec152002-02-28 10:52:56 +00002921 }
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002922 if (cb_arg->allow_proxy_certs)
2923 {
2924 X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
2925 }
Bodo Möller023ec152002-02-28 10:52:56 +00002926
Richard Levittea7201e92005-01-17 17:06:58 +00002927#ifndef OPENSSL_NO_X509_VERIFY
Richard Levittea7201e92005-01-17 17:06:58 +00002928 ok = X509_verify_cert(ctx);
Richard Levittea7201e92005-01-17 17:06:58 +00002929#endif
2930
2931 if (cb_arg->proxy_auth)
2932 {
Dr. Stephen Hensonbab53402009-01-07 23:44:27 +00002933 if (ok > 0)
Richard Levittea7201e92005-01-17 17:06:58 +00002934 {
2935 const char *cond_end = NULL;
2936
2937 ok = process_proxy_cond(letters,
2938 cb_arg->proxy_cond, &cond_end);
2939
2940 if (ok < 0)
2941 EXIT(3);
2942 if (*cond_end)
2943 {
2944 fprintf(stderr, "Stopped processing condition before it's end.\n");
2945 ok = 0;
2946 }
2947 if (!ok)
2948 fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
2949 cb_arg->proxy_cond);
2950 else
2951 fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
2952 cb_arg->proxy_cond);
2953 }
2954 }
Bodo Möller023ec152002-02-28 10:52:56 +00002955 return(ok);
2956 }
2957
Richard Levittebc36ee62001-02-20 08:13:47 +00002958#ifndef OPENSSL_NO_RSA
Bodo Möller46b3bd52000-04-06 22:25:49 +00002959static RSA *rsa_tmp=NULL;
2960
Ulf Möllerdf63a381999-06-09 16:33:18 +00002961static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002962 {
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00002963 BIGNUM *bn = NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002964 if (rsa_tmp == NULL)
2965 {
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00002966 bn = BN_new();
Geoff Thorpee9224c72002-12-08 05:24:31 +00002967 rsa_tmp = RSA_new();
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00002968 if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
Geoff Thorpee9224c72002-12-08 05:24:31 +00002969 {
2970 BIO_printf(bio_err, "Memory error...");
2971 goto end;
2972 }
Ben Laurie60e31c31999-02-21 21:58:59 +00002973 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
Bodo Möllerd58d0921999-06-10 16:29:32 +00002974 (void)BIO_flush(bio_err);
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00002975 if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
Geoff Thorpee9224c72002-12-08 05:24:31 +00002976 {
Richard Levitte3ae70932003-04-03 23:39:48 +00002977 BIO_printf(bio_err, "Error generating key.");
Geoff Thorpee9224c72002-12-08 05:24:31 +00002978 RSA_free(rsa_tmp);
2979 rsa_tmp = NULL;
2980 }
2981end:
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002982 BIO_printf(bio_err,"\n");
Bodo Möllerd58d0921999-06-10 16:29:32 +00002983 (void)BIO_flush(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002984 }
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00002985 if(bn) BN_free(bn);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002986 return(rsa_tmp);
2987 }
Bodo Möller46b3bd52000-04-06 22:25:49 +00002988
2989static void free_tmp_rsa(void)
2990 {
2991 if (rsa_tmp != NULL)
2992 {
2993 RSA_free(rsa_tmp);
2994 rsa_tmp = NULL;
2995 }
2996 }
Ulf Möller79df9d61999-04-27 03:19:12 +00002997#endif
Bodo Möller53002dc2000-02-04 11:21:18 +00002998
Richard Levittebc36ee62001-02-20 08:13:47 +00002999#ifndef OPENSSL_NO_DH
Bodo Möllere4589582000-03-10 13:23:20 +00003000/* These DH parameters have been generated as follows:
3001 * $ openssl dhparam -C -noout 512
3002 * $ openssl dhparam -C -noout 1024
3003 * $ openssl dhparam -C -noout -dsaparam 1024
3004 * (The third function has been renamed to avoid name conflicts.)
3005 */
Richard Levittef3f316f2000-10-22 12:45:33 +00003006static DH *get_dh512()
Bodo Möller53002dc2000-02-04 11:21:18 +00003007 {
Bodo Möllere4589582000-03-10 13:23:20 +00003008 static unsigned char dh512_p[]={
3009 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
3010 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
3011 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
3012 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
3013 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
3014 0x02,0xC5,0xAE,0x23,
3015 };
3016 static unsigned char dh512_g[]={
3017 0x02,
3018 };
3019 DH *dh;
Bodo Möller53002dc2000-02-04 11:21:18 +00003020
Bodo Möllere4589582000-03-10 13:23:20 +00003021 if ((dh=DH_new()) == NULL) return(NULL);
3022 dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
3023 dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
3024 if ((dh->p == NULL) || (dh->g == NULL))
3025 { DH_free(dh); return(NULL); }
3026 return(dh);
3027 }
Bodo Möller53002dc2000-02-04 11:21:18 +00003028
Richard Levittef3f316f2000-10-22 12:45:33 +00003029static DH *get_dh1024()
Bodo Möllere4589582000-03-10 13:23:20 +00003030 {
3031 static unsigned char dh1024_p[]={
3032 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
3033 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
3034 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
3035 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
3036 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
3037 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
3038 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
3039 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
3040 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
3041 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
3042 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
3043 };
3044 static unsigned char dh1024_g[]={
3045 0x02,
3046 };
3047 DH *dh;
3048
3049 if ((dh=DH_new()) == NULL) return(NULL);
3050 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3051 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3052 if ((dh->p == NULL) || (dh->g == NULL))
3053 { DH_free(dh); return(NULL); }
3054 return(dh);
3055 }
3056
Richard Levittef3f316f2000-10-22 12:45:33 +00003057static DH *get_dh1024dsa()
Bodo Möllere4589582000-03-10 13:23:20 +00003058 {
3059 static unsigned char dh1024_p[]={
3060 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
3061 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
3062 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
3063 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
3064 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
3065 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
3066 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
3067 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
3068 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
3069 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
3070 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
3071 };
3072 static unsigned char dh1024_g[]={
3073 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
3074 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
3075 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
3076 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
3077 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
3078 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
3079 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
3080 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
3081 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
3082 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
3083 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
3084 };
3085 DH *dh;
3086
3087 if ((dh=DH_new()) == NULL) return(NULL);
3088 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3089 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3090 if ((dh->p == NULL) || (dh->g == NULL))
3091 { DH_free(dh); return(NULL); }
3092 dh->length = 160;
3093 return(dh);
Bodo Möller53002dc2000-02-04 11:21:18 +00003094 }
Nils Larschf71165b2006-02-24 17:58:43 +00003095#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +00003096
Nils Larschddac1972006-03-10 23:06:27 +00003097#ifndef OPENSSL_NO_PSK
3098/* convert the PSK key (psk_key) in ascii to binary (psk) */
3099static int psk_key2bn(const char *pskkey, unsigned char *psk,
3100 unsigned int max_psk_len)
3101 {
3102 int ret;
3103 BIGNUM *bn = NULL;
3104
3105 ret = BN_hex2bn(&bn, pskkey);
3106 if (!ret)
3107 {
3108 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey);
3109 if (bn)
3110 BN_free(bn);
3111 return 0;
3112 }
3113 if (BN_num_bytes(bn) > (int)max_psk_len)
3114 {
3115 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
3116 max_psk_len, BN_num_bytes(bn));
3117 BN_free(bn);
3118 return 0;
3119 }
3120 ret = BN_bn2bin(bn, psk);
3121 BN_free(bn);
3122 return ret;
3123 }
3124
3125static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
3126 unsigned int max_identity_len, unsigned char *psk,
3127 unsigned int max_psk_len)
3128 {
3129 int ret;
3130 unsigned int psk_len = 0;
3131
Nils Larsche9680892006-03-12 22:16:57 +00003132 ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
Nils Larschddac1972006-03-10 23:06:27 +00003133 if (ret < 0)
3134 goto out_err;
3135 if (debug)
3136 fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
3137 ret = psk_key2bn(psk_key, psk, max_psk_len);
3138 if (ret < 0)
3139 goto out_err;
3140 psk_len = ret;
3141out_err:
3142 return psk_len;
3143 }
3144
3145static unsigned int psk_server_callback(SSL *ssl, const char *identity,
3146 unsigned char *psk, unsigned int max_psk_len)
3147 {
3148 unsigned int psk_len=0;
3149
3150 if (strcmp(identity, "Client_identity") != 0)
3151 {
3152 BIO_printf(bio_err, "server: PSK error: client identity not found\n");
3153 return 0;
3154 }
3155 psk_len=psk_key2bn(psk_key, psk, max_psk_len);
3156 return psk_len;
3157 }
3158#endif
3159
Nils Larsch6e119bb2005-08-25 07:29:54 +00003160static int do_test_cipherlist(void)
3161 {
3162 int i = 0;
3163 const SSL_METHOD *meth;
Ben Lauriebabb3792008-10-12 14:32:47 +00003164 const SSL_CIPHER *ci, *tci = NULL;
Nils Larsch6e119bb2005-08-25 07:29:54 +00003165
Nils Larsch00fe8652006-01-15 17:35:28 +00003166#ifndef OPENSSL_NO_SSL2
Nils Larsch6e119bb2005-08-25 07:29:54 +00003167 fprintf(stderr, "testing SSLv2 cipher list order: ");
3168 meth = SSLv2_method();
3169 while ((ci = meth->get_cipher(i++)) != NULL)
3170 {
3171 if (tci != NULL)
3172 if (ci->id >= tci->id)
3173 {
3174 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3175 return 0;
3176 }
3177 tci = ci;
3178 }
3179 fprintf(stderr, "ok\n");
Nils Larsch00fe8652006-01-15 17:35:28 +00003180#endif
3181#ifndef OPENSSL_NO_SSL3
Nils Larsch6e119bb2005-08-25 07:29:54 +00003182 fprintf(stderr, "testing SSLv3 cipher list order: ");
3183 meth = SSLv3_method();
3184 tci = NULL;
3185 while ((ci = meth->get_cipher(i++)) != NULL)
3186 {
3187 if (tci != NULL)
3188 if (ci->id >= tci->id)
3189 {
3190 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3191 return 0;
3192 }
3193 tci = ci;
3194 }
3195 fprintf(stderr, "ok\n");
Nils Larsch00fe8652006-01-15 17:35:28 +00003196#endif
3197#ifndef OPENSSL_NO_TLS1
Nils Larsch6e119bb2005-08-25 07:29:54 +00003198 fprintf(stderr, "testing TLSv1 cipher list order: ");
3199 meth = TLSv1_method();
3200 tci = NULL;
3201 while ((ci = meth->get_cipher(i++)) != NULL)
3202 {
3203 if (tci != NULL)
3204 if (ci->id >= tci->id)
3205 {
3206 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3207 return 0;
3208 }
3209 tci = ci;
3210 }
3211 fprintf(stderr, "ok\n");
Nils Larsch00fe8652006-01-15 17:35:28 +00003212#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +00003213
3214 return 1;
3215 }