blob: 81292591d63c9b8f74d6a53e7f2f2143e63107ef [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
Matt Caswell3a834622015-01-05 00:34:00 +0000378/*-
379 * next_protos_parse parses a comma separated list of strings into a string
Adam Langleya8989362013-07-15 15:57:16 -0400380 * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
381 * outlen: (output) set to the length of the resulting buffer on success.
382 * err: (maybe NULL) on failure, an error message line is written to this BIO.
Kurt Cancemi4eadd112014-09-09 13:48:00 -0400383 * in: a NUL terminated string like "abc,def,ghi"
Adam Langleya8989362013-07-15 15:57:16 -0400384 *
385 * returns: a malloced buffer or NULL on failure.
386 */
387static unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
388 {
389 size_t len;
390 unsigned char *out;
391 size_t i, start = 0;
392
393 len = strlen(in);
394 if (len >= 65535)
395 return NULL;
396
397 out = OPENSSL_malloc(strlen(in) + 1);
398 if (!out)
399 return NULL;
400
401 for (i = 0; i <= len; ++i)
402 {
403 if (i == len || in[i] == ',')
404 {
405 if (i - start > 255)
406 {
407 OPENSSL_free(out);
408 return NULL;
409 }
410 out[start] = i - start;
411 start = i + 1;
412 }
413 else
414 out[i+1] = in[i];
415 }
416
417 *outlen = len + 1;
418 return out;
419 }
420
421static int cb_server_alpn(SSL *s, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
422 {
423 unsigned char *protos;
424 unsigned short protos_len;
425
426 protos = next_protos_parse(&protos_len, alpn_server);
427 if (protos == NULL)
428 {
429 fprintf(stderr, "failed to parser ALPN server protocol string: %s\n", alpn_server);
430 abort();
431 }
432
433 if (SSL_select_next_proto((unsigned char**) out, outlen, protos, protos_len, in, inlen) !=
434 OPENSSL_NPN_NEGOTIATED)
435 {
436 OPENSSL_free(protos);
437 return SSL_TLSEXT_ERR_NOACK;
438 }
439
440 /* Make a copy of the selected protocol which will be freed in verify_alpn. */
441 alpn_selected = OPENSSL_malloc(*outlen);
442 memcpy(alpn_selected, *out, *outlen);
443 *out = alpn_selected;
444
445 OPENSSL_free(protos);
446 return SSL_TLSEXT_ERR_OK;
447 }
448
449static int verify_alpn(SSL *client, SSL *server)
450 {
451 const unsigned char *client_proto, *server_proto;
452 unsigned int client_proto_len = 0, server_proto_len = 0;
453 SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
454 SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
455
456 if (alpn_selected != NULL)
457 {
458 OPENSSL_free(alpn_selected);
459 alpn_selected = NULL;
460 }
461
462 if (client_proto_len != server_proto_len ||
463 memcmp(client_proto, server_proto, client_proto_len) != 0)
464 {
465 BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
466 goto err;
467 }
468
469 if (client_proto_len > 0 && alpn_expected == NULL)
470 {
471 BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
472 goto err;
473 }
474
475 if (alpn_expected != NULL &&
476 (client_proto_len != strlen(alpn_expected) ||
477 memcmp(client_proto, alpn_expected, client_proto_len) != 0))
478 {
479 BIO_printf(bio_stdout, "ALPN selected protocols not equal to expected protocol: %s\n", alpn_expected);
480 goto err;
481 }
482
483 return 0;
484
485err:
486 BIO_printf(bio_stdout, "ALPN results: client: '");
487 BIO_write(bio_stdout, client_proto, client_proto_len);
488 BIO_printf(bio_stdout, "', server: '");
489 BIO_write(bio_stdout, server_proto, server_proto_len);
490 BIO_printf(bio_stdout, "'\n");
491 BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '%s'\n", alpn_client, alpn_server);
492 return -1;
493 }
494
Trevora398f822013-05-12 18:55:27 -0700495#define SCT_EXT_TYPE 18
Trevor9cd50f72013-06-13 22:36:45 -0700496
497/* WARNING : below extension types are *NOT* IETF assigned, and
498 could conflict if these types are reassigned and handled
499 specially by OpenSSL in the future */
Trevora398f822013-05-12 18:55:27 -0700500#define TACK_EXT_TYPE 62208
Trevor9cd50f72013-06-13 22:36:45 -0700501#define CUSTOM_EXT_TYPE_0 1000
502#define CUSTOM_EXT_TYPE_1 1001
503#define CUSTOM_EXT_TYPE_2 1002
504#define CUSTOM_EXT_TYPE_3 1003
505
506const char custom_ext_cli_string[] = "abc";
507const char custom_ext_srv_string[] = "defg";
Trevora398f822013-05-12 18:55:27 -0700508
509/* These set from cmdline */
510char* serverinfo_file = NULL;
511int serverinfo_sct = 0;
512int serverinfo_tack = 0;
Trevor9cd50f72013-06-13 22:36:45 -0700513
514/* These set based on extension callbacks */
Trevora398f822013-05-12 18:55:27 -0700515int serverinfo_sct_seen = 0;
516int serverinfo_tack_seen = 0;
517int serverinfo_other_seen = 0;
518
Trevor9cd50f72013-06-13 22:36:45 -0700519/* This set from cmdline */
520int custom_ext = 0;
521
522/* This set based on extension callbacks */
523int custom_ext_error = 0;
524
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +0100525static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type,
526 const unsigned char *in, size_t inlen,
527 int *al, void *arg)
Trevora398f822013-05-12 18:55:27 -0700528 {
Trevor9cd50f72013-06-13 22:36:45 -0700529 if (ext_type == SCT_EXT_TYPE)
530 serverinfo_sct_seen++;
531 else if (ext_type == TACK_EXT_TYPE)
532 serverinfo_tack_seen++;
533 else
534 serverinfo_other_seen++;
535 return 1;
Trevora398f822013-05-12 18:55:27 -0700536 }
537
538static int verify_serverinfo()
539 {
540 if (serverinfo_sct != serverinfo_sct_seen)
541 return -1;
542 if (serverinfo_tack != serverinfo_tack_seen)
543 return -1;
544 if (serverinfo_other_seen)
545 return -1;
546 return 0;
547 }
548
Tim Hudson1d97c842014-12-28 12:48:40 +1000549/*-
550 * Four test cases for custom extensions:
Trevor9cd50f72013-06-13 22:36:45 -0700551 * 0 - no ClientHello extension or ServerHello response
552 * 1 - ClientHello with "abc", no response
553 * 2 - ClientHello with "abc", empty response
554 * 3 - ClientHello with "abc", "defg" response
555 */
556
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100557static int custom_ext_0_cli_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000558 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100559 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700560 {
561 if (ext_type != CUSTOM_EXT_TYPE_0)
562 custom_ext_error = 1;
Dr. Stephen Henson33f653a2014-08-16 18:16:26 +0100563 return 0; /* Don't send an extension */
Trevor9cd50f72013-06-13 22:36:45 -0700564 }
565
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100566static int custom_ext_0_cli_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000567 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100568 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000569 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700570 {
Scott Deboy9dabfce2014-02-04 18:48:59 -0800571 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700572 }
573
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100574static int custom_ext_1_cli_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000575 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100576 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700577 {
578 if (ext_type != CUSTOM_EXT_TYPE_1)
579 custom_ext_error = 1;
580 *out = (const unsigned char*)custom_ext_cli_string;
581 *outlen = strlen(custom_ext_cli_string);
582 return 1; /* Send "abc" */
583 }
584
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100585static int custom_ext_1_cli_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000586 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100587 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000588 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700589 {
Scott Deboy9dabfce2014-02-04 18:48:59 -0800590 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700591 }
592
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100593static int custom_ext_2_cli_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000594 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100595 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700596 {
597 if (ext_type != CUSTOM_EXT_TYPE_2)
598 custom_ext_error = 1;
599 *out = (const unsigned char*)custom_ext_cli_string;
600 *outlen = strlen(custom_ext_cli_string);
601 return 1; /* Send "abc" */
602 }
603
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100604static int custom_ext_2_cli_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000605 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100606 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000607 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700608 {
609 if (ext_type != CUSTOM_EXT_TYPE_2)
610 custom_ext_error = 1;
611 if (inlen != 0)
612 custom_ext_error = 1; /* Should be empty response */
613 return 1;
614 }
615
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100616static int custom_ext_3_cli_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000617 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100618 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700619 {
620 if (ext_type != CUSTOM_EXT_TYPE_3)
621 custom_ext_error = 1;
622 *out = (const unsigned char*)custom_ext_cli_string;
623 *outlen = strlen(custom_ext_cli_string);
624 return 1; /* Send "abc" */
625 }
626
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100627static int custom_ext_3_cli_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000628 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100629 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000630 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700631 {
632 if (ext_type != CUSTOM_EXT_TYPE_3)
633 custom_ext_error = 1;
634 if (inlen != strlen(custom_ext_srv_string))
635 custom_ext_error = 1;
636 if (memcmp(custom_ext_srv_string, in, inlen) != 0)
637 custom_ext_error = 1; /* Check for "defg" */
638 return 1;
639 }
640
Dr. Stephen Hensonf47e2032014-08-26 01:20:26 +0100641/* custom_ext_0_cli_add_cb returns 0 - the server won't receive a callback for this extension */
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100642static int custom_ext_0_srv_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000643 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100644 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000645 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700646 {
Dr. Stephen Hensonf47e2032014-08-26 01:20:26 +0100647 custom_ext_error = 1;
Scott Deboy9dabfce2014-02-04 18:48:59 -0800648 return 1;
Trevor9cd50f72013-06-13 22:36:45 -0700649 }
650
Dr. Stephen Hensonf47e2032014-08-26 01:20:26 +0100651/* 'add' callbacks are only called if the 'parse' callback is called */
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100652static int custom_ext_0_srv_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000653 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100654 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700655 {
Dr. Stephen Hensonf47e2032014-08-26 01:20:26 +0100656 /* Error: should not have been called */
657 custom_ext_error = 1;
Dr. Stephen Henson33f653a2014-08-16 18:16:26 +0100658 return 0; /* Don't send an extension */
Trevor9cd50f72013-06-13 22:36:45 -0700659 }
660
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100661static int custom_ext_1_srv_parse_cb(SSL *s, unsigned int ext_type,
Scott Deboye9add062014-02-04 13:08:43 -0800662 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100663 size_t inlen, int *al,
Scott Deboye9add062014-02-04 13:08:43 -0800664 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700665 {
666 if (ext_type != CUSTOM_EXT_TYPE_1)
667 custom_ext_error = 1;
668 /* Check for "abc" */
669 if (inlen != strlen(custom_ext_cli_string))
670 custom_ext_error = 1;
671 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
672 custom_ext_error = 1;
673 return 1;
674 }
675
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100676static int custom_ext_1_srv_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000677 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100678 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700679 {
Dr. Stephen Henson33f653a2014-08-16 18:16:26 +0100680 return 0; /* Don't send an extension */
Trevor9cd50f72013-06-13 22:36:45 -0700681 }
682
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100683static int custom_ext_2_srv_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000684 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100685 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000686 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700687 {
688 if (ext_type != CUSTOM_EXT_TYPE_2)
689 custom_ext_error = 1;
690 /* Check for "abc" */
691 if (inlen != strlen(custom_ext_cli_string))
692 custom_ext_error = 1;
693 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
694 custom_ext_error = 1;
695 return 1;
696 }
697
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100698static int custom_ext_2_srv_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000699 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100700 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700701 {
702 *out = NULL;
703 *outlen = 0;
704 return 1; /* Send empty extension */
705 }
706
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100707static int custom_ext_3_srv_parse_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000708 const unsigned char *in,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100709 size_t inlen, int *al,
Ben Laurie0a602872014-02-04 23:16:46 +0000710 void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700711 {
712 if (ext_type != CUSTOM_EXT_TYPE_3)
713 custom_ext_error = 1;
714 /* Check for "abc" */
715 if (inlen != strlen(custom_ext_cli_string))
716 custom_ext_error = 1;
717 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
718 custom_ext_error = 1;
719 return 1;
720 }
721
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100722static int custom_ext_3_srv_add_cb(SSL *s, unsigned int ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000723 const unsigned char **out,
Dr. Stephen Hensonde2a9e32014-08-14 13:25:50 +0100724 size_t *outlen, int *al, void *arg)
Trevor9cd50f72013-06-13 22:36:45 -0700725 {
726 *out = (const unsigned char*)custom_ext_srv_string;
727 *outlen = strlen(custom_ext_srv_string);
728 return 1; /* Send "defg" */
729 }
730
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000731static char *cipher=NULL;
Bodo Möller79875771999-10-25 19:36:01 +0000732static int verbose=0;
733static int debug=0;
Bodo Möllerd58d0921999-06-10 16:29:32 +0000734#if 0
735/* Not used yet. */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000736#ifdef FIONBIO
737static int s_nbio=0;
738#endif
Bodo Möllerd58d0921999-06-10 16:29:32 +0000739#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000740
Ulf Möllerb9d82f42000-01-16 12:21:22 +0000741static const char rnd_seed[] = "string to make the random number generator think it has entropy";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000742
Bodo Möller563f1502000-03-13 15:06:54 +0000743int 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 +0000744int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
Nils Larsch6e119bb2005-08-25 07:29:54 +0000745static int do_test_cipherlist(void);
Ulf Möller6b691a51999-04-19 21:31:43 +0000746static void sv_usage(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000747 {
748 fprintf(stderr,"usage: ssltest [args ...]\n");
749 fprintf(stderr,"\n");
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +0000750#ifdef OPENSSL_FIPS
751 fprintf(stderr,"-F - run test in FIPS mode\n");
752#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000753 fprintf(stderr," -server_auth - check server certificate\n");
754 fprintf(stderr," -client_auth - do client authentication\n");
Richard Levitted9bfe4f2005-04-09 16:07:12 +0000755 fprintf(stderr," -proxy - allow proxy certificates\n");
Richard Levittea7201e92005-01-17 17:06:58 +0000756 fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
Kurt Cancemi4eadd112014-09-09 13:48:00 -0400757 fprintf(stderr," -proxy_cond <val> - expression to test proxy policy rights\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000758 fprintf(stderr," -v - more output\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000759 fprintf(stderr," -d - debug output\n");
760 fprintf(stderr," -reuse - use session-id reuse\n");
761 fprintf(stderr," -num <val> - number of connections to perform\n");
762 fprintf(stderr," -bytes <val> - number of bytes to swap between client/server\n");
Richard Levittebc36ee62001-02-20 08:13:47 +0000763#ifndef OPENSSL_NO_DH
Bodo Möllere4589582000-03-10 13:23:20 +0000764 fprintf(stderr," -dhe1024 - use 1024 bit key (safe prime) for DHE\n");
765 fprintf(stderr," -dhe1024dsa - use 1024 bit key (with 160-bit subprime) for DHE\n");
Bodo Möller77fa04a1999-09-03 16:31:36 +0000766 fprintf(stderr," -no_dhe - disable DHE\n");
767#endif
Bodo Möllerea262262002-08-09 08:56:08 +0000768#ifndef OPENSSL_NO_ECDH
769 fprintf(stderr," -no_ecdhe - disable ECDHE\n");
770#endif
Nils Larschddac1972006-03-10 23:06:27 +0000771#ifndef OPENSSL_NO_PSK
772 fprintf(stderr," -psk arg - PSK in hex (without 0x)\n");
773#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000774#ifndef OPENSSL_NO_SRP
775 fprintf(stderr," -srpuser user - SRP username to use\n");
776 fprintf(stderr," -srppass arg - password for 'user'\n");
777#endif
Dr. Stephen Henson3881d812014-10-29 12:51:31 +0000778#ifndef OPENSSL_NO_SSL3_METHOD
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000779 fprintf(stderr," -ssl3 - use SSLv3\n");
780#endif
Richard Levittebc36ee62001-02-20 08:13:47 +0000781#ifndef OPENSSL_NO_TLS1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000782 fprintf(stderr," -tls1 - use TLSv1\n");
783#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000784 fprintf(stderr," -CApath arg - PEM format directory of CA's\n");
785 fprintf(stderr," -CAfile arg - PEM format file of CA's\n");
Bodo Möller7d2509b2000-03-13 19:30:59 +0000786 fprintf(stderr," -cert arg - Server certificate file\n");
787 fprintf(stderr," -key arg - Server key file (default: same as -cert)\n");
788 fprintf(stderr," -c_cert arg - Client certificate file\n");
789 fprintf(stderr," -c_key arg - Client key file (default: same as -c_cert)\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000790 fprintf(stderr," -cipher arg - The cipher list\n");
Bodo Möller95d29591999-06-12 01:03:40 +0000791 fprintf(stderr," -bio_pair - Use BIO pairs\n");
792 fprintf(stderr," -f - Test even cases that can't work\n");
Bodo Möller563f1502000-03-13 15:06:54 +0000793 fprintf(stderr," -time - measure processor time used by client and server\n");
Richard Levitte23f80f42000-11-30 11:57:31 +0000794 fprintf(stderr," -zlib - use zlib compression\n");
Bodo Möllerea262262002-08-09 08:56:08 +0000795 fprintf(stderr," -rle - use rle compression\n");
796#ifndef OPENSSL_NO_ECDH
797 fprintf(stderr," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
798 " Use \"openssl ecparam -list_curves\" for all names\n" \
799 " (default is sect163r2).\n");
800#endif
Emilia Kasperfd28a412014-10-27 16:25:17 +0100801 fprintf(stderr," -test_cipherlist - Verifies the order of the ssl cipher lists.\n"
802 " When this option is requested, the cipherlist\n"
803 " tests are run instead of handshake tests.\n");
Piotr Sikora29115752013-11-13 15:20:22 -0800804#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +0000805 fprintf(stderr," -npn_client - have client side offer NPN\n");
806 fprintf(stderr," -npn_server - have server side offer NPN\n");
807 fprintf(stderr," -npn_server_reject - have server reject NPN\n");
808#endif
Trevor9cd50f72013-06-13 22:36:45 -0700809 fprintf(stderr," -serverinfo_file file - have server use this file\n");
Trevora398f822013-05-12 18:55:27 -0700810 fprintf(stderr," -serverinfo_sct - have client offer and expect SCT\n");
811 fprintf(stderr," -serverinfo_tack - have client offer and expect TACK\n");
Trevor9cd50f72013-06-13 22:36:45 -0700812 fprintf(stderr," -custom_ext - try various custom extension callbacks\n");
Adam Langleya8989362013-07-15 15:57:16 -0400813 fprintf(stderr," -alpn_client <string> - have client side offer ALPN\n");
814 fprintf(stderr," -alpn_server <string> - have server side offer ALPN\n");
815 fprintf(stderr," -alpn_expected <string> - the ALPN protocol that should be negotiated\n");
Bodo Möller563f1502000-03-13 15:06:54 +0000816 }
817
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000818static void print_key_details(BIO *out, EVP_PKEY *key)
819 {
820 int keyid = EVP_PKEY_id(key);
821#ifndef OPENSSL_NO_EC
822 if (keyid == EVP_PKEY_EC)
823 {
824 EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
825 int nid;
826 const char *cname;
827 nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
828 EC_KEY_free(ec);
829 cname = EC_curve_nid2nist(nid);
830 if (!cname)
831 cname = OBJ_nid2sn(nid);
832 BIO_printf(out, "%d bits EC (%s)",
833 EVP_PKEY_bits(key), cname);
834 }
835 else
836#endif
837 {
838 const char *algname;
839 switch (keyid)
840 {
841 case EVP_PKEY_RSA:
842 algname = "RSA";
843 break;
844 case EVP_PKEY_DSA:
845 algname = "DSA";
846 break;
847 case EVP_PKEY_DH:
848 algname = "DH";
849 break;
850 default:
851 algname = OBJ_nid2sn(keyid);
852 break;
853 }
854 BIO_printf(out, "%d bits %s", EVP_PKEY_bits(key), algname);
855 }
856 }
857
Bodo Möller563f1502000-03-13 15:06:54 +0000858static void print_details(SSL *c_ssl, const char *prefix)
859 {
Ben Lauriebabb3792008-10-12 14:32:47 +0000860 const SSL_CIPHER *ciph;
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000861 int mdnid;
Bodo Möller563f1502000-03-13 15:06:54 +0000862 X509 *cert;
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000863 EVP_PKEY *pkey;
Bodo Möller563f1502000-03-13 15:06:54 +0000864
865 ciph=SSL_get_current_cipher(c_ssl);
866 BIO_printf(bio_stdout,"%s%s, cipher %s %s",
867 prefix,
868 SSL_get_version(c_ssl),
869 SSL_CIPHER_get_version(ciph),
870 SSL_CIPHER_get_name(ciph));
871 cert=SSL_get_peer_certificate(c_ssl);
872 if (cert != NULL)
873 {
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000874 pkey = X509_get_pubkey(cert);
Bodo Möller563f1502000-03-13 15:06:54 +0000875 if (pkey != NULL)
876 {
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000877 BIO_puts(bio_stdout, ", ");
878 print_key_details(bio_stdout, pkey);
Bodo Möller563f1502000-03-13 15:06:54 +0000879 EVP_PKEY_free(pkey);
880 }
881 X509_free(cert);
882 }
Dr. Stephen Hensonf756f1f2014-10-27 14:39:37 +0000883 if (SSL_get_server_tmp_key(c_ssl, &pkey))
884 {
885 BIO_puts(bio_stdout, ", temp key: ");
886 print_key_details(bio_stdout, pkey);
887 EVP_PKEY_free(pkey);
888 }
889 if (SSL_get_peer_signature_nid(c_ssl, &mdnid))
890 BIO_printf(bio_stdout, ", digest=%s", OBJ_nid2sn(mdnid));
Bodo Möller563f1502000-03-13 15:06:54 +0000891 BIO_printf(bio_stdout,"\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000892 }
893
Bodo Möller3ac82fa2000-12-15 16:40:35 +0000894static void lock_dbg_cb(int mode, int type, const char *file, int line)
895 {
896 static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
897 const char *errstr = NULL;
898 int rw;
899
900 rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
901 if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
902 {
903 errstr = "invalid mode";
904 goto err;
905 }
906
Bodo Möller563c05e2003-08-14 10:33:56 +0000907 if (type < 0 || type >= CRYPTO_NUM_LOCKS)
Bodo Möller3ac82fa2000-12-15 16:40:35 +0000908 {
909 errstr = "type out of bounds";
910 goto err;
911 }
912
913 if (mode & CRYPTO_LOCK)
914 {
915 if (modes[type])
916 {
917 errstr = "already locked";
918 /* must not happen in a single-threaded program
919 * (would deadlock) */
920 goto err;
921 }
922
923 modes[type] = rw;
924 }
925 else if (mode & CRYPTO_UNLOCK)
926 {
927 if (!modes[type])
928 {
929 errstr = "not locked";
930 goto err;
931 }
932
933 if (modes[type] != rw)
934 {
935 errstr = (rw == CRYPTO_READ) ?
936 "CRYPTO_r_unlock on write lock" :
937 "CRYPTO_w_unlock on read lock";
938 }
939
940 modes[type] = 0;
941 }
942 else
943 {
944 errstr = "invalid mode";
945 goto err;
946 }
947
948 err:
949 if (errstr)
950 {
951 /* we cannot use bio_err here */
952 fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
953 errstr, mode, type, file, line);
954 }
955 }
956
Bodo Möller761772d2007-09-21 06:54:24 +0000957#ifdef TLSEXT_TYPE_opaque_prf_input
958struct cb_info_st { void *input; size_t len; int ret; };
959struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
960struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
961struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
962struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
963
964int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
965 {
966 struct cb_info_st *arg = arg_;
967
968 if (arg == NULL)
969 return 1;
970
971 if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
972 return 0;
973 return arg->ret;
974 }
975#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +0000976
Ulf Möller6b691a51999-04-19 21:31:43 +0000977int main(int argc, char *argv[])
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000978 {
979 char *CApath=NULL,*CAfile=NULL;
980 int badop=0;
Bodo Möller95d29591999-06-12 01:03:40 +0000981 int bio_pair=0;
982 int force=0;
Kurt Roeckx45f55f62014-11-30 15:35:22 +0100983 int tls1=0,ssl3=0,ret=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000984 int client_auth=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000985 int server_auth=0,i;
Richard Levittea7201e92005-01-17 17:06:58 +0000986 struct app_verify_arg app_verify_arg =
Richard Levitted9bfe4f2005-04-09 16:07:12 +0000987 { APP_CALLBACK_STRING, 0, 0, NULL, NULL };
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000988 char *server_cert=TEST_SERVER_CERT;
Bodo Möller65b002f2000-03-13 19:24:39 +0000989 char *server_key=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000990 char *client_cert=TEST_CLIENT_CERT;
Bodo Möller65b002f2000-03-13 19:24:39 +0000991 char *client_key=NULL;
Nils Larsch3eeaab42005-07-16 12:37:36 +0000992#ifndef OPENSSL_NO_ECDH
Bodo Möllerea262262002-08-09 08:56:08 +0000993 char *named_curve = NULL;
Nils Larsch3eeaab42005-07-16 12:37:36 +0000994#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000995 SSL_CTX *s_ctx=NULL;
996 SSL_CTX *c_ctx=NULL;
Nils Larsch4ebb3422005-08-14 21:48:33 +0000997 const SSL_METHOD *meth=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000998 SSL *c_ssl,*s_ssl;
999 int number=1,reuse=0;
Richard Levitte82423542003-10-06 11:00:15 +00001000 long bytes=256L;
Richard Levittebc36ee62001-02-20 08:13:47 +00001001#ifndef OPENSSL_NO_DH
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001002 DH *dh;
Bodo Möllere4589582000-03-10 13:23:20 +00001003 int dhe1024 = 0, dhe1024dsa = 0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001004#endif
Bodo Möllerea262262002-08-09 08:56:08 +00001005#ifndef OPENSSL_NO_ECDH
1006 EC_KEY *ecdh = NULL;
1007#endif
Ben Laurieedc032b2011-03-12 17:01:19 +00001008#ifndef OPENSSL_NO_SRP
1009 /* client */
Ben Laurieedc032b2011-03-12 17:01:19 +00001010 SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
1011 /* server */
1012 SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
1013#endif
Bodo Möllere4589582000-03-10 13:23:20 +00001014 int no_dhe = 0;
Bodo Möllerea262262002-08-09 08:56:08 +00001015 int no_ecdhe = 0;
Nils Larschddac1972006-03-10 23:06:27 +00001016 int no_psk = 0;
Bodo Möller563f1502000-03-13 15:06:54 +00001017 int print_time = 0;
1018 clock_t s_time = 0, c_time = 0;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00001019#ifndef OPENSSL_NO_COMP
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +00001020 int comp = 0;
Bodo Möller8df788c2000-11-30 23:41:58 +00001021 COMP_METHOD *cm = NULL;
Richard Levitte82423542003-10-06 11:00:15 +00001022 STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
Dr. Stephen Henson00a37b52010-04-06 11:18:59 +00001023#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +00001024 int test_cipherlist = 0;
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001025#ifdef OPENSSL_FIPS
1026 int fips_mode=0;
1027#endif
Emilia Kasperfd28a412014-10-27 16:25:17 +01001028 int no_protocol = 0;
Bodo Möller563f1502000-03-13 15:06:54 +00001029
Dr. Stephen Hensonde942222014-10-27 14:07:12 +00001030 SSL_CONF_CTX *s_cctx = NULL, *c_cctx = NULL;
1031 STACK_OF(OPENSSL_STRING) *conf_args = NULL;
1032 const char *arg = NULL, *argn = NULL;
1033
Bodo Möller79875771999-10-25 19:36:01 +00001034 verbose = 0;
1035 debug = 0;
1036 cipher = 0;
Bodo Möller1e3a9b62002-11-19 11:56:05 +00001037
Nils Larsche9680892006-03-12 22:16:57 +00001038 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);
Bodo Möller1e3a9b62002-11-19 11:56:05 +00001039
Bodo Möller3ac82fa2000-12-15 16:40:35 +00001040 CRYPTO_set_locking_callback(lock_dbg_cb);
1041
Bodo Möller10654d32001-03-11 14:49:46 +00001042 /* enable memory leak checking unless explicitly disabled */
1043 if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
1044 {
1045 CRYPTO_malloc_debug_init();
Bodo Möller384eff82001-09-10 09:50:30 +00001046 CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
1047 }
1048 else
1049 {
1050 /* OPENSSL_DEBUG_MEMORY=off */
1051 CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
Bodo Möller10654d32001-03-11 14:49:46 +00001052 }
Bodo Möller79875771999-10-25 19:36:01 +00001053 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001054
Ulf Möllerb9d82f42000-01-16 12:21:22 +00001055 RAND_seed(rnd_seed, sizeof rnd_seed);
1056
Nils Larsche9680892006-03-12 22:16:57 +00001057 bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001058
Dr. Stephen Hensonde942222014-10-27 14:07:12 +00001059 s_cctx = SSL_CONF_CTX_new();
1060 c_cctx = SSL_CONF_CTX_new();
1061
1062 if (!s_cctx || !c_cctx)
1063 {
1064 ERR_print_errors(bio_err);
1065 goto end;
1066 }
1067
1068 SSL_CONF_CTX_set_flags(s_cctx,
1069 SSL_CONF_FLAG_CMDLINE|SSL_CONF_FLAG_SERVER);
1070 if (!SSL_CONF_CTX_set1_prefix(s_cctx, "-s_"))
1071 {
1072 ERR_print_errors(bio_err);
1073 goto end;
1074 }
1075
1076 SSL_CONF_CTX_set_flags(c_cctx,
1077 SSL_CONF_FLAG_CMDLINE|SSL_CONF_FLAG_CLIENT);
1078 if (!SSL_CONF_CTX_set1_prefix(c_cctx, "-c_"))
1079 {
1080 ERR_print_errors(bio_err);
1081 goto end;
1082 }
1083
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001084 argc--;
1085 argv++;
1086
1087 while (argc >= 1)
1088 {
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001089 if(!strcmp(*argv,"-F"))
1090 {
1091#ifdef OPENSSL_FIPS
1092 fips_mode=1;
1093#else
Kurt Cancemi4eadd112014-09-09 13:48:00 -04001094 fprintf(stderr,"not compiled with FIPS support, so exiting without running.\n");
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001095 EXIT(0);
1096#endif
1097 }
1098 else if (strcmp(*argv,"-server_auth") == 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001099 server_auth=1;
1100 else if (strcmp(*argv,"-client_auth") == 0)
1101 client_auth=1;
Richard Levittea7201e92005-01-17 17:06:58 +00001102 else if (strcmp(*argv,"-proxy_auth") == 0)
1103 {
1104 if (--argc < 1) goto bad;
1105 app_verify_arg.proxy_auth= *(++argv);
1106 }
1107 else if (strcmp(*argv,"-proxy_cond") == 0)
1108 {
1109 if (--argc < 1) goto bad;
1110 app_verify_arg.proxy_cond= *(++argv);
1111 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001112 else if (strcmp(*argv,"-v") == 0)
1113 verbose=1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001114 else if (strcmp(*argv,"-d") == 0)
1115 debug=1;
1116 else if (strcmp(*argv,"-reuse") == 0)
1117 reuse=1;
Bodo Möller48c843c1999-08-05 11:50:18 +00001118 else if (strcmp(*argv,"-dhe1024") == 0)
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001119 {
1120#ifndef OPENSSL_NO_DH
Bodo Möller48c843c1999-08-05 11:50:18 +00001121 dhe1024=1;
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001122#else
Lutz Jänickeba5ba542002-09-25 20:19:04 +00001123 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
Bodo Möllere4589582000-03-10 13:23:20 +00001124#endif
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001125 }
1126 else if (strcmp(*argv,"-dhe1024dsa") == 0)
1127 {
1128#ifndef OPENSSL_NO_DH
1129 dhe1024dsa=1;
1130#else
Lutz Jänickeba5ba542002-09-25 20:19:04 +00001131 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001132#endif
1133 }
Bodo Möller77fa04a1999-09-03 16:31:36 +00001134 else if (strcmp(*argv,"-no_dhe") == 0)
1135 no_dhe=1;
Bodo Möllerea262262002-08-09 08:56:08 +00001136 else if (strcmp(*argv,"-no_ecdhe") == 0)
1137 no_ecdhe=1;
Nils Larschddac1972006-03-10 23:06:27 +00001138 else if (strcmp(*argv,"-psk") == 0)
1139 {
1140 if (--argc < 1) goto bad;
1141 psk_key=*(++argv);
1142#ifndef OPENSSL_NO_PSK
1143 if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
1144 {
1145 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
1146 goto bad;
1147 }
1148#else
1149 no_psk=1;
1150#endif
1151 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001152#ifndef OPENSSL_NO_SRP
1153 else if (strcmp(*argv,"-srpuser") == 0)
1154 {
1155 if (--argc < 1) goto bad;
1156 srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
1157 tls1=1;
1158 }
1159 else if (strcmp(*argv,"-srppass") == 0)
1160 {
1161 if (--argc < 1) goto bad;
1162 srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
1163 tls1=1;
1164 }
1165#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001166 else if (strcmp(*argv,"-tls1") == 0)
Emilia Kasperfd28a412014-10-27 16:25:17 +01001167 {
1168#ifdef OPENSSL_NO_TLS1
1169 no_protocol = 1;
1170#endif
1171 tls1 = 1;
1172 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001173 else if (strcmp(*argv,"-ssl3") == 0)
Emilia Kasperfd28a412014-10-27 16:25:17 +01001174 {
Dr. Stephen Henson3881d812014-10-29 12:51:31 +00001175#ifdef OPENSSL_NO_SSL3_METHOD
Emilia Kasperfd28a412014-10-27 16:25:17 +01001176 no_protocol = 1;
1177#endif
1178 ssl3 = 1;
1179 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001180 else if (strncmp(*argv,"-num",4) == 0)
1181 {
1182 if (--argc < 1) goto bad;
1183 number= atoi(*(++argv));
1184 if (number == 0) number=1;
1185 }
1186 else if (strcmp(*argv,"-bytes") == 0)
1187 {
1188 if (--argc < 1) goto bad;
1189 bytes= atol(*(++argv));
1190 if (bytes == 0L) bytes=1L;
1191 i=strlen(argv[0]);
1192 if (argv[0][i-1] == 'k') bytes*=1024L;
1193 if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
1194 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001195 else if (strcmp(*argv,"-cert") == 0)
1196 {
1197 if (--argc < 1) goto bad;
1198 server_cert= *(++argv);
1199 }
1200 else if (strcmp(*argv,"-s_cert") == 0)
1201 {
1202 if (--argc < 1) goto bad;
1203 server_cert= *(++argv);
1204 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001205 else if (strcmp(*argv,"-key") == 0)
1206 {
1207 if (--argc < 1) goto bad;
1208 server_key= *(++argv);
1209 }
1210 else if (strcmp(*argv,"-s_key") == 0)
1211 {
1212 if (--argc < 1) goto bad;
1213 server_key= *(++argv);
1214 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001215 else if (strcmp(*argv,"-c_cert") == 0)
1216 {
1217 if (--argc < 1) goto bad;
1218 client_cert= *(++argv);
1219 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001220 else if (strcmp(*argv,"-c_key") == 0)
1221 {
1222 if (--argc < 1) goto bad;
1223 client_key= *(++argv);
1224 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001225 else if (strcmp(*argv,"-cipher") == 0)
1226 {
1227 if (--argc < 1) goto bad;
1228 cipher= *(++argv);
1229 }
1230 else if (strcmp(*argv,"-CApath") == 0)
1231 {
1232 if (--argc < 1) goto bad;
1233 CApath= *(++argv);
1234 }
1235 else if (strcmp(*argv,"-CAfile") == 0)
1236 {
1237 if (--argc < 1) goto bad;
1238 CAfile= *(++argv);
1239 }
Bodo Möller95d29591999-06-12 01:03:40 +00001240 else if (strcmp(*argv,"-bio_pair") == 0)
1241 {
1242 bio_pair = 1;
1243 }
1244 else if (strcmp(*argv,"-f") == 0)
1245 {
1246 force = 1;
1247 }
Bodo Möller563f1502000-03-13 15:06:54 +00001248 else if (strcmp(*argv,"-time") == 0)
1249 {
1250 print_time = 1;
1251 }
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +00001252#ifndef OPENSSL_NO_COMP
Richard Levitte23f80f42000-11-30 11:57:31 +00001253 else if (strcmp(*argv,"-zlib") == 0)
1254 {
1255 comp = COMP_ZLIB;
1256 }
1257 else if (strcmp(*argv,"-rle") == 0)
1258 {
1259 comp = COMP_RLE;
1260 }
Dr. Stephen Hensona4c4a7d2012-12-29 23:37:56 +00001261#endif
Bodo Möllerea262262002-08-09 08:56:08 +00001262 else if (strcmp(*argv,"-named_curve") == 0)
1263 {
1264 if (--argc < 1) goto bad;
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001265#ifndef OPENSSL_NO_ECDH
Bodo Möllerea262262002-08-09 08:56:08 +00001266 named_curve = *(++argv);
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001267#else
Bodo Möller5e3247d2002-11-05 10:54:40 +00001268 fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001269 ++argv;
Bodo Möllerea262262002-08-09 08:56:08 +00001270#endif
Richard Levitte90f5a2b2002-08-14 12:16:27 +00001271 }
Bodo Möller023ec152002-02-28 10:52:56 +00001272 else if (strcmp(*argv,"-app_verify") == 0)
1273 {
Richard Levittea7201e92005-01-17 17:06:58 +00001274 app_verify_arg.app_verify = 1;
Bodo Möller023ec152002-02-28 10:52:56 +00001275 }
Richard Levitted9bfe4f2005-04-09 16:07:12 +00001276 else if (strcmp(*argv,"-proxy") == 0)
1277 {
1278 app_verify_arg.allow_proxy_certs = 1;
1279 }
Nils Larsch6e119bb2005-08-25 07:29:54 +00001280 else if (strcmp(*argv,"-test_cipherlist") == 0)
1281 {
1282 test_cipherlist = 1;
1283 }
Piotr Sikora29115752013-11-13 15:20:22 -08001284#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00001285 else if (strcmp(*argv,"-npn_client") == 0)
1286 {
1287 npn_client = 1;
1288 }
1289 else if (strcmp(*argv,"-npn_server") == 0)
1290 {
1291 npn_server = 1;
1292 }
1293 else if (strcmp(*argv,"-npn_server_reject") == 0)
1294 {
1295 npn_server_reject = 1;
1296 }
1297#endif
Trevora398f822013-05-12 18:55:27 -07001298 else if (strcmp(*argv,"-serverinfo_sct") == 0)
1299 {
1300 serverinfo_sct = 1;
1301 }
1302 else if (strcmp(*argv,"-serverinfo_tack") == 0)
1303 {
1304 serverinfo_tack = 1;
1305 }
1306 else if (strcmp(*argv,"-serverinfo_file") == 0)
1307 {
1308 if (--argc < 1) goto bad;
1309 serverinfo_file = *(++argv);
1310 }
Trevor9cd50f72013-06-13 22:36:45 -07001311 else if (strcmp(*argv,"-custom_ext") == 0)
1312 {
1313 custom_ext = 1;
1314 }
Adam Langleya8989362013-07-15 15:57:16 -04001315 else if (strcmp(*argv,"-alpn_client") == 0)
1316 {
1317 if (--argc < 1) goto bad;
1318 alpn_client = *(++argv);
1319 }
1320 else if (strcmp(*argv,"-alpn_server") == 0)
1321 {
1322 if (--argc < 1) goto bad;
1323 alpn_server = *(++argv);
1324 }
1325 else if (strcmp(*argv,"-alpn_expected") == 0)
1326 {
1327 if (--argc < 1) goto bad;
1328 alpn_expected = *(++argv);
1329 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001330 else
1331 {
Dr. Stephen Hensonde942222014-10-27 14:07:12 +00001332 int rv;
1333 arg = argv[0];
1334 argn = argv[1];
1335 /* Try to process command using SSL_CONF */
1336 rv = SSL_CONF_cmd_argv(c_cctx, &argc, &argv);
1337 /* If not processed try server */
1338 if (rv == 0)
1339 rv = SSL_CONF_cmd_argv(s_cctx, &argc, &argv);
1340 /* Recognised: store it for later use */
1341 if (rv > 0)
1342 {
1343 if (rv == 1)
1344 argn = NULL;
1345 if (!conf_args)
1346 {
1347 conf_args = sk_OPENSSL_STRING_new_null();
1348 if (!conf_args)
1349 goto end;
1350 }
1351 if (!sk_OPENSSL_STRING_push(conf_args, arg))
1352 goto end;
1353 if (!sk_OPENSSL_STRING_push(conf_args, argn))
1354 goto end;
1355 continue;
1356 }
1357 if (rv == -3)
1358 BIO_printf(bio_err, "Missing argument for %s\n",
1359 arg);
1360 else if (rv < 0)
1361 BIO_printf(bio_err, "Error with command %s\n",
1362 arg);
1363 else if (rv == 0)
1364 BIO_printf(bio_err,"unknown option %s\n", arg);
1365 badop = 1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001366 break;
1367 }
1368 argc--;
1369 argv++;
1370 }
1371 if (badop)
1372 {
1373bad:
1374 sv_usage();
1375 goto end;
1376 }
1377
Emilia Kasperfd28a412014-10-27 16:25:17 +01001378 /*
1379 * test_cipherlist prevails over protocol switch: we test the cipherlist
1380 * for all enabled protocols.
1381 */
Nils Larsch6e119bb2005-08-25 07:29:54 +00001382 if (test_cipherlist == 1)
1383 {
1384 /* ensure that the cipher list are correctly sorted and exit */
Emilia Kasperfd28a412014-10-27 16:25:17 +01001385 fprintf(stdout, "Testing cipherlist order only. Ignoring all "
1386 "other options.\n");
Nils Larsch6e119bb2005-08-25 07:29:54 +00001387 if (do_test_cipherlist() == 0)
1388 EXIT(1);
1389 ret = 0;
1390 goto end;
1391 }
1392
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001393 if (ssl3 + tls1 > 1)
Emilia Kasperfd28a412014-10-27 16:25:17 +01001394 {
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001395 fprintf(stderr, "At most one of -ssl3, or -tls1 should "
Emilia Kasperfd28a412014-10-27 16:25:17 +01001396 "be requested.\n");
1397 EXIT(1);
1398 }
1399
1400 /*
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001401 * Testing was requested for a compiled-out protocol (e.g. SSLv3).
Emilia Kasperfd28a412014-10-27 16:25:17 +01001402 * Ideally, we would error out, but the generic test wrapper can't know
1403 * when to expect failure. So we do nothing and return success.
1404 */
1405 if (no_protocol)
1406 {
1407 fprintf(stderr, "Testing was requested for a disabled protocol. "
1408 "Skipping tests.\n");
1409 ret = 0;
1410 goto end;
1411 }
1412
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001413 if (!ssl3 && !tls1 && number > 1 && !reuse && !force)
Bodo Möller95d29591999-06-12 01:03:40 +00001414 {
Bodo Möller563f1502000-03-13 15:06:54 +00001415 fprintf(stderr, "This case cannot work. Use -f to perform "
1416 "the test anyway (and\n-d to see what happens), "
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001417 "or add one of -ssl3, -tls1, -reuse\n"
Bodo Möller563f1502000-03-13 15:06:54 +00001418 "to avoid protocol mismatch.\n");
Richard Levitte55f78ba2002-11-28 18:54:30 +00001419 EXIT(1);
Bodo Möller95d29591999-06-12 01:03:40 +00001420 }
1421
Dr. Stephen Henson086e32a2011-05-19 18:09:02 +00001422#ifdef OPENSSL_FIPS
1423 if(fips_mode)
1424 {
1425 if(!FIPS_mode_set(1))
1426 {
1427 ERR_load_crypto_strings();
1428 ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
1429 EXIT(1);
1430 }
1431 else
1432 fprintf(stderr,"*** IN FIPS MODE ***\n");
1433 }
1434#endif
1435
Bodo Möller563f1502000-03-13 15:06:54 +00001436 if (print_time)
1437 {
1438 if (!bio_pair)
1439 {
1440 fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1441 bio_pair = 1;
1442 }
1443 if (number < 50 && !force)
1444 fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1445 }
1446
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001447/* if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
1448
Mark J. Cox413c4f41999-02-16 09:22:21 +00001449 SSL_library_init();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001450 SSL_load_error_strings();
1451
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00001452#ifndef OPENSSL_NO_COMP
Richard Levittebd68b6b2000-11-30 12:22:35 +00001453 if (comp == COMP_ZLIB) cm = COMP_zlib();
1454 if (comp == COMP_RLE) cm = COMP_rle();
1455 if (cm != NULL)
Richard Levitte23f80f42000-11-30 11:57:31 +00001456 {
Richard Levitte23f80f42000-11-30 11:57:31 +00001457 if (cm->type != NID_undef)
Richard Levittef82ab532003-10-02 10:41:48 +00001458 {
1459 if (SSL_COMP_add_compression_method(comp, cm) != 0)
1460 {
1461 fprintf(stderr,
1462 "Failed to add compression method\n");
1463 ERR_print_errors_fp(stderr);
1464 }
1465 }
Richard Levitte23f80f42000-11-30 11:57:31 +00001466 else
Richard Levitte47517172000-11-30 12:53:15 +00001467 {
Richard Levittebd68b6b2000-11-30 12:22:35 +00001468 fprintf(stderr,
1469 "Warning: %s compression not supported\n",
1470 (comp == COMP_RLE ? "rle" :
1471 (comp == COMP_ZLIB ? "zlib" :
1472 "unknown")));
Richard Levitte47517172000-11-30 12:53:15 +00001473 ERR_print_errors_fp(stderr);
1474 }
Richard Levitte23f80f42000-11-30 11:57:31 +00001475 }
Richard Levitte82423542003-10-06 11:00:15 +00001476 ssl_comp_methods = SSL_COMP_get_compression_methods();
1477 fprintf(stderr, "Available compression methods:\n");
1478 {
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001479 int j, n = sk_SSL_COMP_num(ssl_comp_methods);
Richard Levitte82423542003-10-06 11:00:15 +00001480 if (n == 0)
1481 fprintf(stderr, " NONE\n");
1482 else
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001483 for (j = 0; j < n; j++)
Richard Levitte82423542003-10-06 11:00:15 +00001484 {
Dr. Stephen Hensona08ced72003-10-10 23:07:24 +00001485 SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
Richard Levitte82423542003-10-06 11:00:15 +00001486 fprintf(stderr, " %d: %s\n", c->id, c->name);
1487 }
1488 }
Dr. Stephen Henson231b98a2005-10-02 12:28:40 +00001489#endif
Richard Levitte23f80f42000-11-30 11:57:31 +00001490
Kurt Roeckx45f55f62014-11-30 15:35:22 +01001491/* At this point, ssl3/tls1 is only set if the protocol is available.
Emilia Kasperfd28a412014-10-27 16:25:17 +01001492 * (Otherwise we exit early.)
1493 * However the compiler doesn't know this, so we ifdef. */
Emilia Kasperfd28a412014-10-27 16:25:17 +01001494#ifndef OPENSSL_NO_SSL3
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001495 if (ssl3)
1496 meth=SSLv3_method();
1497 else
Emilia Kasperfd28a412014-10-27 16:25:17 +01001498#endif
1499#ifndef OPENSSL_NO_TLS1
Dr. Stephen Hensonb7c37f22013-02-11 18:17:50 +00001500 if (tls1)
1501 meth=TLSv1_method();
1502 else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001503#endif
Emilia Kasperfd28a412014-10-27 16:25:17 +01001504 meth=SSLv23_method();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001505
1506 c_ctx=SSL_CTX_new(meth);
1507 s_ctx=SSL_CTX_new(meth);
1508 if ((c_ctx == NULL) || (s_ctx == NULL))
1509 {
1510 ERR_print_errors(bio_err);
1511 goto end;
1512 }
Dr. Stephen Henson77a926e2014-02-16 12:50:18 +00001513 /* Since we will use low security ciphersuites and keys for
1514 * testing set security level to zero.
1515 */
1516 SSL_CTX_set_security_level(c_ctx, 0);
1517 SSL_CTX_set_security_level(s_ctx, 0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001518
1519 if (cipher != NULL)
1520 {
1521 SSL_CTX_set_cipher_list(c_ctx,cipher);
1522 SSL_CTX_set_cipher_list(s_ctx,cipher);
1523 }
1524
Dr. Stephen Hensonde942222014-10-27 14:07:12 +00001525 /* Process SSL_CONF arguments */
1526 SSL_CONF_CTX_set_ssl_ctx(c_cctx, c_ctx);
1527 SSL_CONF_CTX_set_ssl_ctx(s_cctx, s_ctx);
1528
1529 for (i = 0; i < sk_OPENSSL_STRING_num(conf_args); i += 2)
1530 {
1531 int rv;
1532 arg = sk_OPENSSL_STRING_value(conf_args, i);
1533 argn = sk_OPENSSL_STRING_value(conf_args, i + 1);
1534 rv = SSL_CONF_cmd(c_cctx, arg, argn);
1535 /* If not recognised use server context */
1536 if (rv == -2)
1537 rv = SSL_CONF_cmd(s_cctx, arg, argn);
1538 if (rv <= 0)
1539 {
1540 BIO_printf(bio_err, "Error processing %s %s\n",
1541 arg, argn ? argn : "");
1542 ERR_print_errors(bio_err);
1543 goto end;
1544 }
1545 }
1546
1547 if (!SSL_CONF_CTX_finish(s_cctx) || !SSL_CONF_CTX_finish(c_cctx))
1548 {
1549 BIO_puts(bio_err, "Error finishing context\n");
1550 ERR_print_errors(bio_err);
1551 goto end;
1552 }
1553
Richard Levittebc36ee62001-02-20 08:13:47 +00001554#ifndef OPENSSL_NO_DH
Bodo Möller77fa04a1999-09-03 16:31:36 +00001555 if (!no_dhe)
Bodo Möller48c843c1999-08-05 11:50:18 +00001556 {
Bodo Möllere4589582000-03-10 13:23:20 +00001557 if (dhe1024dsa)
Bodo Möller48c843c1999-08-05 11:50:18 +00001558 {
Bodo Möllere4589582000-03-10 13:23:20 +00001559 /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
Bodo Möller77fa04a1999-09-03 16:31:36 +00001560 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
Bodo Möllere4589582000-03-10 13:23:20 +00001561 dh=get_dh1024dsa();
Bodo Möller48c843c1999-08-05 11:50:18 +00001562 }
Bodo Möllere4589582000-03-10 13:23:20 +00001563 else if (dhe1024)
1564 dh=get_dh1024();
Bodo Möller77fa04a1999-09-03 16:31:36 +00001565 else
Bodo Möller77fa04a1999-09-03 16:31:36 +00001566 dh=get_dh512();
1567 SSL_CTX_set_tmp_dh(s_ctx,dh);
1568 DH_free(dh);
1569 }
Bodo Möllere4589582000-03-10 13:23:20 +00001570#else
1571 (void)no_dhe;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001572#endif
1573
Bodo Möllerea262262002-08-09 08:56:08 +00001574#ifndef OPENSSL_NO_ECDH
1575 if (!no_ecdhe)
1576 {
Nils Larsch9dd84052005-05-16 10:11:04 +00001577 int nid;
1578
1579 if (named_curve != NULL)
Bodo Möllerea262262002-08-09 08:56:08 +00001580 {
Nils Larsch9dd84052005-05-16 10:11:04 +00001581 nid = OBJ_sn2nid(named_curve);
1582 if (nid == 0)
1583 {
1584 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1585 goto end;
Bodo Möllerea262262002-08-09 08:56:08 +00001586 }
Bodo Möllerea262262002-08-09 08:56:08 +00001587 }
Nils Larsch9dd84052005-05-16 10:11:04 +00001588 else
Dr. Stephen Hensonb3310162011-02-12 17:23:32 +00001589#ifdef OPENSSL_NO_EC2M
1590 nid = NID_X9_62_prime256v1;
1591#else
Nils Larsch9dd84052005-05-16 10:11:04 +00001592 nid = NID_sect163r2;
Dr. Stephen Hensonb3310162011-02-12 17:23:32 +00001593#endif
Nils Larsch9dd84052005-05-16 10:11:04 +00001594
1595 ecdh = EC_KEY_new_by_curve_name(nid);
1596 if (ecdh == NULL)
1597 {
1598 BIO_printf(bio_err, "unable to create curve\n");
1599 goto end;
1600 }
1601
1602 SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
1603 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
1604 EC_KEY_free(ecdh);
Bodo Möllerea262262002-08-09 08:56:08 +00001605 }
1606#else
1607 (void)no_ecdhe;
1608#endif
1609
Richard Levittebc36ee62001-02-20 08:13:47 +00001610#ifndef OPENSSL_NO_RSA
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001611 SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001612#endif
1613
Bodo Möller761772d2007-09-21 06:54:24 +00001614#ifdef TLSEXT_TYPE_opaque_prf_input
1615 SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
1616 SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
1617 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
1618 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
1619#endif
1620
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001621 if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
1622 {
1623 ERR_print_errors(bio_err);
1624 }
Bodo Möller65b002f2000-03-13 19:24:39 +00001625 else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
1626 (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001627 {
1628 ERR_print_errors(bio_err);
1629 goto end;
1630 }
1631
1632 if (client_auth)
1633 {
1634 SSL_CTX_use_certificate_file(c_ctx,client_cert,
1635 SSL_FILETYPE_PEM);
Bodo Möller65b002f2000-03-13 19:24:39 +00001636 SSL_CTX_use_PrivateKey_file(c_ctx,
1637 (client_key?client_key:client_cert),
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001638 SSL_FILETYPE_PEM);
1639 }
1640
1641 if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
1642 (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1643 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
1644 (!SSL_CTX_set_default_verify_paths(c_ctx)))
1645 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001646 /* fprintf(stderr,"SSL_load_verify_locations\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001647 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001648 /* goto end; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001649 }
1650
1651 if (client_auth)
1652 {
Bodo Möller53002dc2000-02-04 11:21:18 +00001653 BIO_printf(bio_err,"client authentication\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001654 SSL_CTX_set_verify(s_ctx,
1655 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1656 verify_callback);
Richard Levittea7201e92005-01-17 17:06:58 +00001657 SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001658 }
1659 if (server_auth)
1660 {
Bodo Möller53002dc2000-02-04 11:21:18 +00001661 BIO_printf(bio_err,"server authentication\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001662 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
1663 verify_callback);
Richard Levittea7201e92005-01-17 17:06:58 +00001664 SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001665 }
Bodo Möllerb1fe6ca1999-11-16 23:15:41 +00001666
1667 {
1668 int session_id_context = 0;
1669 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
1670 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001671
Nils Larschddac1972006-03-10 23:06:27 +00001672 /* Use PSK only if PSK key is given */
1673 if (psk_key != NULL)
1674 {
1675 /* no_psk is used to avoid putting psk command to openssl tool */
1676 if (no_psk)
1677 {
1678 /* if PSK is not compiled in and psk key is
1679 * given, do nothing and exit successfully */
1680 ret=0;
1681 goto end;
1682 }
1683#ifndef OPENSSL_NO_PSK
1684 SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1685 SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1686 if (debug)
1687 BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
1688 if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
1689 {
1690 BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
1691 ERR_print_errors(bio_err);
1692 goto end;
1693 }
1694#endif
1695 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001696#ifndef OPENSSL_NO_SRP
1697 if (srp_client_arg.srplogin)
1698 {
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +00001699 if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
Ben Laurieedc032b2011-03-12 17:01:19 +00001700 {
1701 BIO_printf(bio_err,"Unable to set SRP username\n");
1702 goto end;
1703 }
1704 SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
1705 SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
1706 /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
1707 }
1708
1709 if (srp_server_arg.expected_user != NULL)
1710 {
1711 SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
1712 SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1713 SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1714 }
1715#endif
Nils Larschddac1972006-03-10 23:06:27 +00001716
Piotr Sikora29115752013-11-13 15:20:22 -08001717#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00001718 if (npn_client)
1719 {
1720 SSL_CTX_set_next_proto_select_cb(c_ctx, cb_client_npn, NULL);
1721 }
1722 if (npn_server)
1723 {
1724 if (npn_server_reject)
1725 {
1726 BIO_printf(bio_err, "Can't have both -npn_server and -npn_server_reject\n");
1727 goto end;
1728 }
1729 SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_npn, NULL);
1730 }
1731 if (npn_server_reject)
1732 {
1733 SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_rejects_npn, NULL);
1734 }
1735#endif
1736
Trevora398f822013-05-12 18:55:27 -07001737 if (serverinfo_sct)
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001738 SSL_CTX_add_client_custom_ext(c_ctx, SCT_EXT_TYPE,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001739 NULL, NULL, NULL,
1740 serverinfo_cli_parse_cb, NULL);
Trevora398f822013-05-12 18:55:27 -07001741 if (serverinfo_tack)
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001742 SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001743 NULL, NULL, NULL,
1744 serverinfo_cli_parse_cb, NULL);
Trevora398f822013-05-12 18:55:27 -07001745
1746 if (serverinfo_file)
1747 if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file))
1748 {
1749 BIO_printf(bio_err, "missing serverinfo file\n");
1750 goto end;
1751 }
1752
Trevor9cd50f72013-06-13 22:36:45 -07001753 if (custom_ext)
1754 {
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001755 SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001756 custom_ext_0_cli_add_cb,
1757 NULL, NULL,
1758 custom_ext_0_cli_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001759 SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001760 custom_ext_1_cli_add_cb,
1761 NULL, NULL,
1762 custom_ext_1_cli_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001763 SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001764 custom_ext_2_cli_add_cb,
1765 NULL, NULL,
1766 custom_ext_2_cli_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001767 SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001768 custom_ext_3_cli_add_cb,
1769 NULL, NULL,
1770 custom_ext_3_cli_parse_cb, NULL);
Trevor9cd50f72013-06-13 22:36:45 -07001771
1772
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001773 SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001774 custom_ext_0_srv_add_cb,
1775 NULL, NULL,
1776 custom_ext_0_srv_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001777 SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001778 custom_ext_1_srv_add_cb,
1779 NULL, NULL,
1780 custom_ext_1_srv_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001781 SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001782 custom_ext_2_srv_add_cb,
1783 NULL, NULL,
1784 custom_ext_2_srv_parse_cb, NULL);
Dr. Stephen Henson8cafe9e2014-08-19 13:54:38 +01001785 SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001786 custom_ext_3_srv_add_cb,
1787 NULL, NULL,
1788 custom_ext_3_srv_parse_cb, NULL);
Trevor9cd50f72013-06-13 22:36:45 -07001789 }
1790
Adam Langleya8989362013-07-15 15:57:16 -04001791 if (alpn_server)
1792 SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, NULL);
1793
1794 if (alpn_client)
1795 {
1796 unsigned short alpn_len;
1797 unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
1798
1799 if (alpn == NULL)
1800 {
1801 BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
1802 goto end;
1803 }
1804 SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len);
1805 OPENSSL_free(alpn);
1806 }
1807
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001808 c_ssl=SSL_new(c_ctx);
1809 s_ssl=SSL_new(s_ctx);
1810
Richard Levittebc36ee62001-02-20 08:13:47 +00001811#ifndef OPENSSL_NO_KRB5
Richard Levittef9b3bff2000-11-30 22:53:34 +00001812 if (c_ssl && c_ssl->kssl_ctx)
1813 {
Ben Laurie54a656e2002-11-13 15:43:43 +00001814 char localhost[MAXHOSTNAMELEN+2];
Richard Levittef9b3bff2000-11-30 22:53:34 +00001815
Ben Laurie54a656e2002-11-13 15:43:43 +00001816 if (gethostname(localhost, sizeof localhost-1) == 0)
Richard Levittef9b3bff2000-11-30 22:53:34 +00001817 {
Ben Laurie54a656e2002-11-13 15:43:43 +00001818 localhost[sizeof localhost-1]='\0';
1819 if(strlen(localhost) == sizeof localhost-1)
1820 {
1821 BIO_printf(bio_err,"localhost name too long\n");
Richard Levitte31be2da2002-11-26 10:09:36 +00001822 goto end;
Ben Laurie54a656e2002-11-13 15:43:43 +00001823 }
Richard Levittef9b3bff2000-11-30 22:53:34 +00001824 kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
1825 localhost);
1826 }
1827 }
Richard Levittebc36ee62001-02-20 08:13:47 +00001828#endif /* OPENSSL_NO_KRB5 */
Richard Levittef9b3bff2000-11-30 22:53:34 +00001829
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001830 for (i=0; i<number; i++)
1831 {
1832 if (!reuse) SSL_set_session(c_ssl,NULL);
Bodo Möller95d29591999-06-12 01:03:40 +00001833 if (bio_pair)
Bodo Möller563f1502000-03-13 15:06:54 +00001834 ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
Bodo Möller95d29591999-06-12 01:03:40 +00001835 else
1836 ret=doit(s_ssl,c_ssl,bytes);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001837 }
1838
1839 if (!verbose)
1840 {
Bodo Möller563f1502000-03-13 15:06:54 +00001841 print_details(c_ssl, "");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001842 }
1843 if ((number > 1) || (bytes > 1L))
Bodo Möller53002dc2000-02-04 11:21:18 +00001844 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
Bodo Möller563f1502000-03-13 15:06:54 +00001845 if (print_time)
1846 {
Bodo Möller617d71b2000-03-26 12:27:30 +00001847#ifdef CLOCKS_PER_SEC
1848 /* "To determine the time in seconds, the value returned
1849 * by the clock function should be divided by the value
1850 * of the macro CLOCKS_PER_SEC."
1851 * -- ISO/IEC 9899 */
Bodo Möller563f1502000-03-13 15:06:54 +00001852 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1853 "Approximate total client time: %6.2f s\n",
1854 (double)s_time/CLOCKS_PER_SEC,
1855 (double)c_time/CLOCKS_PER_SEC);
Bodo Möller617d71b2000-03-26 12:27:30 +00001856#else
Bodo Möller617d71b2000-03-26 12:27:30 +00001857 BIO_printf(bio_stdout,
1858 "Approximate total server time: %6.2f units\n"
1859 "Approximate total client time: %6.2f units\n",
1860 (double)s_time,
1861 (double)c_time);
1862#endif
Bodo Möller563f1502000-03-13 15:06:54 +00001863 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001864
1865 SSL_free(s_ssl);
1866 SSL_free(c_ssl);
1867
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001868end:
1869 if (s_ctx != NULL) SSL_CTX_free(s_ctx);
1870 if (c_ctx != NULL) SSL_CTX_free(c_ctx);
1871
Dr. Stephen Hensonde942222014-10-27 14:07:12 +00001872 if (s_cctx)
1873 SSL_CONF_CTX_free(s_cctx);
1874 if (c_cctx)
1875 SSL_CONF_CTX_free(c_cctx);
1876 sk_OPENSSL_STRING_free(conf_args);
1877
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001878 if (bio_stdout != NULL) BIO_free(bio_stdout);
1879
Richard Levittebc36ee62001-02-20 08:13:47 +00001880#ifndef OPENSSL_NO_RSA
Bodo Möller46b3bd52000-04-06 22:25:49 +00001881 free_tmp_rsa();
1882#endif
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001883#ifndef OPENSSL_NO_ENGINE
Bodo Möllerb8e2f832001-07-04 20:55:36 +00001884 ENGINE_cleanup();
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001885#endif
Geoff Thorpe79aa04e2001-09-01 20:02:13 +00001886 CRYPTO_cleanup_all_ex_data();
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001887 ERR_free_strings();
Geoff Thorpe4c329692008-08-06 15:54:15 +00001888 ERR_remove_thread_state(NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001889 EVP_cleanup();
1890 CRYPTO_mem_leaks(bio_err);
Bodo Möller79875771999-10-25 19:36:01 +00001891 if (bio_err != NULL) BIO_free(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001892 EXIT(ret);
Andy Polyakov19bd66f2005-08-03 19:56:36 +00001893 return ret;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001894 }
1895
Bodo Möller563f1502000-03-13 15:06:54 +00001896int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
1897 clock_t *s_time, clock_t *c_time)
Bodo Möller95d29591999-06-12 01:03:40 +00001898 {
1899 long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1900 BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1901 BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
Bodo Möller95d29591999-06-12 01:03:40 +00001902 int ret = 1;
1903
1904 size_t bufsiz = 256; /* small buffer for testing */
1905
1906 if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
1907 goto err;
1908 if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
1909 goto err;
1910
1911 s_ssl_bio = BIO_new(BIO_f_ssl());
1912 if (!s_ssl_bio)
1913 goto err;
1914
1915 c_ssl_bio = BIO_new(BIO_f_ssl());
1916 if (!c_ssl_bio)
1917 goto err;
1918
1919 SSL_set_connect_state(c_ssl);
1920 SSL_set_bio(c_ssl, client, client);
1921 (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1922
1923 SSL_set_accept_state(s_ssl);
1924 SSL_set_bio(s_ssl, server, server);
1925 (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1926
1927 do
1928 {
Tim Hudson1d97c842014-12-28 12:48:40 +10001929 /*-
1930 * c_ssl_bio: SSL filter BIO
Bodo Möller95d29591999-06-12 01:03:40 +00001931 *
1932 * client: pseudo-I/O for SSL library
1933 *
1934 * client_io: client's SSL communication; usually to be
1935 * relayed over some I/O facility, but in this
1936 * test program, we're the server, too:
1937 *
1938 * server_io: server's SSL communication
1939 *
1940 * server: pseudo-I/O for SSL library
1941 *
1942 * s_ssl_bio: SSL filter BIO
1943 *
1944 * The client and the server each employ a "BIO pair":
1945 * client + client_io, server + server_io.
1946 * BIO pairs are symmetric. A BIO pair behaves similar
1947 * to a non-blocking socketpair (but both endpoints must
1948 * be handled by the same thread).
Bodo Möller7eea36b1999-07-12 18:50:34 +00001949 * [Here we could connect client and server to the ends
1950 * of a single BIO pair, but then this code would be less
1951 * suitable as an example for BIO pairs in general.]
Bodo Möller95d29591999-06-12 01:03:40 +00001952 *
1953 * Useful functions for querying the state of BIO pair endpoints:
1954 *
1955 * BIO_ctrl_pending(bio) number of bytes we can read now
Bodo Möllerf50c0492000-02-04 00:56:09 +00001956 * BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil
Bodo Möller95d29591999-06-12 01:03:40 +00001957 * other side's read attempt
Ulf Möller657e60f2000-02-03 23:23:24 +00001958 * BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now
Bodo Möller95d29591999-06-12 01:03:40 +00001959 *
1960 * ..._read_request is never more than ..._write_guarantee;
1961 * it depends on the application which one you should use.
1962 */
1963
1964 /* We have non-blocking behaviour throughout this test program, but
1965 * can be sure that there is *some* progress in each iteration; so
1966 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
1967 * -- we just try everything in each iteration
1968 */
1969
1970 {
1971 /* CLIENT */
1972
1973 MS_STATIC char cbuf[1024*8];
1974 int i, r;
Bodo Möller563f1502000-03-13 15:06:54 +00001975 clock_t c_clock = clock();
Bodo Möller95d29591999-06-12 01:03:40 +00001976
Bodo Möller896e4fe2002-11-05 13:54:41 +00001977 memset(cbuf, 0, sizeof(cbuf));
1978
Bodo Möller95d29591999-06-12 01:03:40 +00001979 if (debug)
1980 if (SSL_in_init(c_ssl))
1981 printf("client waiting in SSL_connect - %s\n",
1982 SSL_state_string_long(c_ssl));
1983
1984 if (cw_num > 0)
1985 {
1986 /* Write to server. */
1987
1988 if (cw_num > (long)sizeof cbuf)
1989 i = sizeof cbuf;
1990 else
1991 i = (int)cw_num;
1992 r = BIO_write(c_ssl_bio, cbuf, i);
Bodo Möller29159a41999-08-09 16:33:34 +00001993 if (r < 0)
Bodo Möller95d29591999-06-12 01:03:40 +00001994 {
1995 if (!BIO_should_retry(c_ssl_bio))
1996 {
1997 fprintf(stderr,"ERROR in CLIENT\n");
1998 goto err;
1999 }
2000 /* BIO_should_retry(...) can just be ignored here.
2001 * The library expects us to call BIO_write with
2002 * the same arguments again, and that's what we will
2003 * do in the next iteration. */
2004 }
2005 else if (r == 0)
2006 {
2007 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2008 goto err;
2009 }
2010 else
2011 {
2012 if (debug)
2013 printf("client wrote %d\n", r);
2014 cw_num -= r;
2015 }
2016 }
2017
2018 if (cr_num > 0)
2019 {
2020 /* Read from server. */
2021
2022 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
2023 if (r < 0)
2024 {
2025 if (!BIO_should_retry(c_ssl_bio))
2026 {
2027 fprintf(stderr,"ERROR in CLIENT\n");
2028 goto err;
2029 }
2030 /* Again, "BIO_should_retry" can be ignored. */
2031 }
2032 else if (r == 0)
2033 {
2034 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2035 goto err;
2036 }
2037 else
2038 {
2039 if (debug)
2040 printf("client read %d\n", r);
2041 cr_num -= r;
2042 }
2043 }
Bodo Möller563f1502000-03-13 15:06:54 +00002044
2045 /* c_time and s_time increments will typically be very small
2046 * (depending on machine speed and clock tick intervals),
2047 * but sampling over a large number of connections should
2048 * result in fairly accurate figures. We cannot guarantee
2049 * a lot, however -- if each connection lasts for exactly
2050 * one clock tick, it will be counted only for the client
2051 * or only for the server or even not at all.
2052 */
2053 *c_time += (clock() - c_clock);
Bodo Möller95d29591999-06-12 01:03:40 +00002054 }
2055
2056 {
2057 /* SERVER */
2058
2059 MS_STATIC char sbuf[1024*8];
2060 int i, r;
Bodo Möller563f1502000-03-13 15:06:54 +00002061 clock_t s_clock = clock();
Bodo Möller95d29591999-06-12 01:03:40 +00002062
Bodo Möller896e4fe2002-11-05 13:54:41 +00002063 memset(sbuf, 0, sizeof(sbuf));
2064
Bodo Möller95d29591999-06-12 01:03:40 +00002065 if (debug)
2066 if (SSL_in_init(s_ssl))
2067 printf("server waiting in SSL_accept - %s\n",
2068 SSL_state_string_long(s_ssl));
2069
2070 if (sw_num > 0)
2071 {
2072 /* Write to client. */
2073
2074 if (sw_num > (long)sizeof sbuf)
2075 i = sizeof sbuf;
2076 else
2077 i = (int)sw_num;
2078 r = BIO_write(s_ssl_bio, sbuf, i);
Bodo Möller29159a41999-08-09 16:33:34 +00002079 if (r < 0)
Bodo Möller95d29591999-06-12 01:03:40 +00002080 {
2081 if (!BIO_should_retry(s_ssl_bio))
2082 {
2083 fprintf(stderr,"ERROR in SERVER\n");
2084 goto err;
2085 }
2086 /* Ignore "BIO_should_retry". */
2087 }
2088 else if (r == 0)
2089 {
2090 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
2091 goto err;
2092 }
2093 else
2094 {
2095 if (debug)
2096 printf("server wrote %d\n", r);
2097 sw_num -= r;
2098 }
2099 }
2100
2101 if (sr_num > 0)
2102 {
2103 /* Read from client. */
2104
2105 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2106 if (r < 0)
2107 {
2108 if (!BIO_should_retry(s_ssl_bio))
2109 {
2110 fprintf(stderr,"ERROR in SERVER\n");
2111 goto err;
2112 }
2113 /* blah, blah */
2114 }
2115 else if (r == 0)
2116 {
2117 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
2118 goto err;
2119 }
2120 else
2121 {
2122 if (debug)
2123 printf("server read %d\n", r);
2124 sr_num -= r;
2125 }
2126 }
Bodo Möller563f1502000-03-13 15:06:54 +00002127
2128 *s_time += (clock() - s_clock);
Bodo Möller95d29591999-06-12 01:03:40 +00002129 }
2130
2131 {
2132 /* "I/O" BETWEEN CLIENT AND SERVER. */
2133
Bodo Möller95d29591999-06-12 01:03:40 +00002134 size_t r1, r2;
Bodo Möller6f7af151999-09-10 14:03:21 +00002135 BIO *io1 = server_io, *io2 = client_io;
2136 /* we use the non-copying interface for io1
2137 * and the standard BIO_write/BIO_read interface for io2
2138 */
2139
Bodo Möller95d29591999-06-12 01:03:40 +00002140 static int prev_progress = 1;
2141 int progress = 0;
2142
Bodo Möller6f7af151999-09-10 14:03:21 +00002143 /* io1 to io2 */
Bodo Möller95d29591999-06-12 01:03:40 +00002144 do
2145 {
Bodo Möller6f7af151999-09-10 14:03:21 +00002146 size_t num;
Bodo Möllerb52f3812002-04-29 11:03:06 +00002147 int r;
Bodo Möller6f7af151999-09-10 14:03:21 +00002148
2149 r1 = BIO_ctrl_pending(io1);
2150 r2 = BIO_ctrl_get_write_guarantee(io2);
Bodo Möller95d29591999-06-12 01:03:40 +00002151
2152 num = r1;
2153 if (r2 < num)
2154 num = r2;
2155 if (num)
2156 {
Bodo Möller6f7af151999-09-10 14:03:21 +00002157 char *dataptr;
2158
Bodo Möller95d29591999-06-12 01:03:40 +00002159 if (INT_MAX < num) /* yeah, right */
2160 num = INT_MAX;
2161
Bodo Möller6f7af151999-09-10 14:03:21 +00002162 r = BIO_nread(io1, &dataptr, (int)num);
2163 assert(r > 0);
2164 assert(r <= (int)num);
2165 /* possibly r < num (non-contiguous data) */
2166 num = r;
2167 r = BIO_write(io2, dataptr, (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002168 if (r != (int)num) /* can't happen */
2169 {
2170 fprintf(stderr, "ERROR: BIO_write could not write "
2171 "BIO_ctrl_get_write_guarantee() bytes");
2172 goto err;
2173 }
2174 progress = 1;
2175
2176 if (debug)
Bodo Möller6f7af151999-09-10 14:03:21 +00002177 printf((io1 == client_io) ?
2178 "C->S relaying: %d bytes\n" :
2179 "S->C relaying: %d bytes\n",
2180 (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002181 }
2182 }
2183 while (r1 && r2);
2184
Bodo Möller6f7af151999-09-10 14:03:21 +00002185 /* io2 to io1 */
2186 {
2187 size_t num;
2188 int r;
Bodo Möller95d29591999-06-12 01:03:40 +00002189
Bodo Möller6f7af151999-09-10 14:03:21 +00002190 r1 = BIO_ctrl_pending(io2);
2191 r2 = BIO_ctrl_get_read_request(io1);
2192 /* here we could use ..._get_write_guarantee instead of
2193 * ..._get_read_request, but by using the latter
2194 * we test restartability of the SSL implementation
2195 * more thoroughly */
Bodo Möller95d29591999-06-12 01:03:40 +00002196 num = r1;
2197 if (r2 < num)
2198 num = r2;
2199 if (num)
2200 {
Bodo Möller6f7af151999-09-10 14:03:21 +00002201 char *dataptr;
2202
Bodo Möller95d29591999-06-12 01:03:40 +00002203 if (INT_MAX < num)
2204 num = INT_MAX;
Bodo Möller6f7af151999-09-10 14:03:21 +00002205
2206 if (num > 1)
Bodo Möllercb0369d1999-09-10 16:41:01 +00002207 --num; /* test restartability even more thoroughly */
Bodo Möller95d29591999-06-12 01:03:40 +00002208
Bodo Möller234c7372002-03-14 09:48:54 +00002209 r = BIO_nwrite0(io1, &dataptr);
Bodo Möller6f7af151999-09-10 14:03:21 +00002210 assert(r > 0);
Richard Levittecc129752002-04-29 10:29:38 +00002211 if (r < (int)num)
Bodo Möller234c7372002-03-14 09:48:54 +00002212 num = r;
Bodo Möller6f7af151999-09-10 14:03:21 +00002213 r = BIO_read(io2, dataptr, (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002214 if (r != (int)num) /* can't happen */
2215 {
2216 fprintf(stderr, "ERROR: BIO_read could not read "
2217 "BIO_ctrl_pending() bytes");
2218 goto err;
2219 }
Bodo Möller95d29591999-06-12 01:03:40 +00002220 progress = 1;
Bodo Möller234c7372002-03-14 09:48:54 +00002221 r = BIO_nwrite(io1, &dataptr, (int)num);
2222 if (r != (int)num) /* can't happen */
2223 {
2224 fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
2225 "BIO_nwrite0() bytes");
2226 goto err;
2227 }
Bodo Möller6f7af151999-09-10 14:03:21 +00002228
Bodo Möller95d29591999-06-12 01:03:40 +00002229 if (debug)
Bodo Möller6f7af151999-09-10 14:03:21 +00002230 printf((io2 == client_io) ?
2231 "C->S relaying: %d bytes\n" :
2232 "S->C relaying: %d bytes\n",
2233 (int)num);
Bodo Möller95d29591999-06-12 01:03:40 +00002234 }
Bodo Möller6f7af151999-09-10 14:03:21 +00002235 } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
Bodo Möller95d29591999-06-12 01:03:40 +00002236
2237 if (!progress && !prev_progress)
2238 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
Bodo Möller95d29591999-06-12 01:03:40 +00002239 {
2240 fprintf(stderr, "ERROR: got stuck\n");
Bodo Möllerd7fcc7f1999-06-12 11:07:52 +00002241 fprintf(stderr, " ERROR.\n");
Bodo Möller95d29591999-06-12 01:03:40 +00002242 goto err;
2243 }
2244 prev_progress = progress;
2245 }
2246 }
2247 while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2248
Bodo Möller95d29591999-06-12 01:03:40 +00002249 if (verbose)
Bodo Möller563f1502000-03-13 15:06:54 +00002250 print_details(c_ssl, "DONE via BIO pair: ");
Piotr Sikora29115752013-11-13 15:20:22 -08002251#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00002252 if (verify_npn(c_ssl, s_ssl) < 0)
2253 {
2254 ret = 1;
2255 goto end;
2256 }
2257#endif
Trevora398f822013-05-12 18:55:27 -07002258 if (verify_serverinfo() < 0)
2259 {
Dr. Stephen Henson06f5d122014-08-11 22:03:21 +01002260 fprintf(stderr, "Server info verify error\n");
Trevora398f822013-05-12 18:55:27 -07002261 ret = 1;
2262 goto err;
2263 }
Adam Langleya8989362013-07-15 15:57:16 -04002264 if (verify_alpn(c_ssl, s_ssl) < 0)
2265 {
2266 ret = 1;
2267 goto err;
2268 }
Trevora398f822013-05-12 18:55:27 -07002269
Trevor9cd50f72013-06-13 22:36:45 -07002270 if (custom_ext_error)
2271 {
Dr. Stephen Henson06f5d122014-08-11 22:03:21 +01002272 fprintf(stderr, "Custom extension error\n");
Trevor9cd50f72013-06-13 22:36:45 -07002273 ret = 1;
2274 goto err;
2275 }
2276
Bodo Möller563f1502000-03-13 15:06:54 +00002277end:
Bodo Möller95d29591999-06-12 01:03:40 +00002278 ret = 0;
2279
2280 err:
2281 ERR_print_errors(bio_err);
2282
2283 if (server)
2284 BIO_free(server);
2285 if (server_io)
2286 BIO_free(server_io);
2287 if (client)
2288 BIO_free(client);
2289 if (client_io)
2290 BIO_free(client_io);
2291 if (s_ssl_bio)
2292 BIO_free(s_ssl_bio);
2293 if (c_ssl_bio)
2294 BIO_free(c_ssl_bio);
2295
2296 return ret;
2297 }
2298
2299
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002300#define W_READ 1
2301#define W_WRITE 2
2302#define C_DONE 1
2303#define S_DONE 2
2304
Ulf Möller6b691a51999-04-19 21:31:43 +00002305int doit(SSL *s_ssl, SSL *c_ssl, long count)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002306 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002307 char *cbuf=NULL,*sbuf=NULL;
2308 long bufsiz;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002309 long cw_num=count,cr_num=count;
2310 long sw_num=count,sr_num=count;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002311 int ret=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002312 BIO *c_to_s=NULL;
2313 BIO *s_to_c=NULL;
2314 BIO *c_bio=NULL;
2315 BIO *s_bio=NULL;
2316 int c_r,c_w,s_r,s_w;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002317 int i,j;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002318 int done=0;
2319 int c_write,s_write;
2320 int do_server=0,do_client=0;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002321 int max_frag = 5*1024;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002322
Andy Polyakov77a27a52014-06-11 20:40:51 +02002323 bufsiz = count>40*1024 ? 40*1024 : count;
2324
2325 if ((cbuf = OPENSSL_malloc(bufsiz))==NULL) goto err;
2326 if ((sbuf = OPENSSL_malloc(bufsiz))==NULL) goto err;
2327
2328 memset(cbuf,0,bufsiz);
2329 memset(sbuf,0,bufsiz);
Bodo Möller896e4fe2002-11-05 13:54:41 +00002330
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002331 c_to_s=BIO_new(BIO_s_mem());
2332 s_to_c=BIO_new(BIO_s_mem());
2333 if ((s_to_c == NULL) || (c_to_s == NULL))
2334 {
2335 ERR_print_errors(bio_err);
2336 goto err;
2337 }
2338
2339 c_bio=BIO_new(BIO_f_ssl());
2340 s_bio=BIO_new(BIO_f_ssl());
2341 if ((c_bio == NULL) || (s_bio == NULL))
2342 {
2343 ERR_print_errors(bio_err);
2344 goto err;
2345 }
2346
2347 SSL_set_connect_state(c_ssl);
2348 SSL_set_bio(c_ssl,s_to_c,c_to_s);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002349 SSL_set_max_send_fragment(c_ssl,max_frag);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002350 BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002351
2352 SSL_set_accept_state(s_ssl);
2353 SSL_set_bio(s_ssl,c_to_s,s_to_c);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002354 SSL_set_max_send_fragment(s_ssl,max_frag);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002355 BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002356
2357 c_r=0; s_r=1;
2358 c_w=1; s_w=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002359 c_write=1,s_write=0;
2360
2361 /* We can always do writes */
2362 for (;;)
2363 {
2364 do_server=0;
2365 do_client=0;
2366
2367 i=(int)BIO_pending(s_bio);
2368 if ((i && s_r) || s_w) do_server=1;
2369
2370 i=(int)BIO_pending(c_bio);
2371 if ((i && c_r) || c_w) do_client=1;
2372
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002373 if (do_server && debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002374 {
2375 if (SSL_in_init(s_ssl))
2376 printf("server waiting in SSL_accept - %s\n",
2377 SSL_state_string_long(s_ssl));
Matt Caswell3a834622015-01-05 00:34:00 +00002378/*-
2379 else if (s_write)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002380 printf("server:SSL_write()\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002381 else
2382 printf("server:SSL_read()\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002383 }
2384
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002385 if (do_client && debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002386 {
2387 if (SSL_in_init(c_ssl))
2388 printf("client waiting in SSL_connect - %s\n",
2389 SSL_state_string_long(c_ssl));
Matt Caswell3a834622015-01-05 00:34:00 +00002390/*-
2391 else if (c_write)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002392 printf("client:SSL_write()\n");
2393 else
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002394 printf("client:SSL_read()\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002395 }
2396
2397 if (!do_client && !do_server)
2398 {
2399 fprintf(stdout,"ERROR IN STARTUP\n");
2400 ERR_print_errors(bio_err);
2401 break;
2402 }
2403 if (do_client && !(done & C_DONE))
2404 {
2405 if (c_write)
2406 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002407 j = (cw_num > bufsiz) ?
2408 (int)bufsiz : (int)cw_num;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002409 i=BIO_write(c_bio,cbuf,j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002410 if (i < 0)
2411 {
2412 c_r=0;
2413 c_w=0;
2414 if (BIO_should_retry(c_bio))
2415 {
2416 if (BIO_should_read(c_bio))
2417 c_r=1;
2418 if (BIO_should_write(c_bio))
2419 c_w=1;
2420 }
2421 else
2422 {
2423 fprintf(stderr,"ERROR in CLIENT\n");
2424 ERR_print_errors(bio_err);
2425 goto err;
2426 }
2427 }
2428 else if (i == 0)
2429 {
2430 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2431 goto err;
2432 }
2433 else
2434 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002435 if (debug)
2436 printf("client wrote %d\n",i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002437 /* ok */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002438 s_r=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002439 c_write=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002440 cw_num-=i;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002441 if (max_frag>1029)
2442 SSL_set_max_send_fragment(c_ssl,max_frag-=5);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002443 }
2444 }
2445 else
2446 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002447 i=BIO_read(c_bio,cbuf,bufsiz);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002448 if (i < 0)
2449 {
2450 c_r=0;
2451 c_w=0;
2452 if (BIO_should_retry(c_bio))
2453 {
2454 if (BIO_should_read(c_bio))
2455 c_r=1;
2456 if (BIO_should_write(c_bio))
2457 c_w=1;
2458 }
2459 else
2460 {
2461 fprintf(stderr,"ERROR in CLIENT\n");
2462 ERR_print_errors(bio_err);
2463 goto err;
2464 }
2465 }
2466 else if (i == 0)
2467 {
2468 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2469 goto err;
2470 }
2471 else
2472 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002473 if (debug)
2474 printf("client read %d\n",i);
2475 cr_num-=i;
2476 if (sw_num > 0)
2477 {
2478 s_write=1;
2479 s_w=1;
2480 }
2481 if (cr_num <= 0)
2482 {
2483 s_write=1;
2484 s_w=1;
2485 done=S_DONE|C_DONE;
2486 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002487 }
2488 }
2489 }
2490
2491 if (do_server && !(done & S_DONE))
2492 {
2493 if (!s_write)
2494 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002495 i=BIO_read(s_bio,sbuf,bufsiz);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002496 if (i < 0)
2497 {
2498 s_r=0;
2499 s_w=0;
2500 if (BIO_should_retry(s_bio))
2501 {
2502 if (BIO_should_read(s_bio))
2503 s_r=1;
2504 if (BIO_should_write(s_bio))
2505 s_w=1;
2506 }
2507 else
2508 {
2509 fprintf(stderr,"ERROR in SERVER\n");
2510 ERR_print_errors(bio_err);
2511 goto err;
2512 }
2513 }
2514 else if (i == 0)
2515 {
2516 ERR_print_errors(bio_err);
2517 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
2518 goto err;
2519 }
2520 else
2521 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002522 if (debug)
2523 printf("server read %d\n",i);
2524 sr_num-=i;
2525 if (cw_num > 0)
2526 {
2527 c_write=1;
2528 c_w=1;
2529 }
2530 if (sr_num <= 0)
2531 {
2532 s_write=1;
2533 s_w=1;
2534 c_write=0;
2535 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002536 }
2537 }
2538 else
2539 {
Andy Polyakov77a27a52014-06-11 20:40:51 +02002540 j = (sw_num > bufsiz) ?
2541 (int)bufsiz : (int)sw_num;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002542 i=BIO_write(s_bio,sbuf,j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002543 if (i < 0)
2544 {
2545 s_r=0;
2546 s_w=0;
2547 if (BIO_should_retry(s_bio))
2548 {
2549 if (BIO_should_read(s_bio))
2550 s_r=1;
2551 if (BIO_should_write(s_bio))
2552 s_w=1;
2553 }
2554 else
2555 {
2556 fprintf(stderr,"ERROR in SERVER\n");
2557 ERR_print_errors(bio_err);
2558 goto err;
2559 }
2560 }
2561 else if (i == 0)
2562 {
2563 ERR_print_errors(bio_err);
2564 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
2565 goto err;
2566 }
2567 else
2568 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002569 if (debug)
2570 printf("server wrote %d\n",i);
2571 sw_num-=i;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002572 s_write=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002573 c_r=1;
2574 if (sw_num <= 0)
2575 done|=S_DONE;
Andy Polyakov77a27a52014-06-11 20:40:51 +02002576 if (max_frag>1029)
2577 SSL_set_max_send_fragment(s_ssl,max_frag-=5);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002578 }
2579 }
2580 }
2581
2582 if ((done & S_DONE) && (done & C_DONE)) break;
2583 }
2584
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002585 if (verbose)
Bodo Möller563f1502000-03-13 15:06:54 +00002586 print_details(c_ssl, "DONE: ");
Piotr Sikora29115752013-11-13 15:20:22 -08002587#ifndef OPENSSL_NO_NEXTPROTONEG
Ben Lauried9a268b2010-09-05 16:35:10 +00002588 if (verify_npn(c_ssl, s_ssl) < 0)
2589 {
2590 ret = 1;
2591 goto err;
2592 }
2593#endif
Trevora398f822013-05-12 18:55:27 -07002594 if (verify_serverinfo() < 0)
2595 {
Dr. Stephen Henson06f5d122014-08-11 22:03:21 +01002596 fprintf(stderr, "Server info verify error\n");
Trevora398f822013-05-12 18:55:27 -07002597 ret = 1;
2598 goto err;
2599 }
Trevor9cd50f72013-06-13 22:36:45 -07002600 if (custom_ext_error)
2601 {
Dr. Stephen Henson06f5d122014-08-11 22:03:21 +01002602 fprintf(stderr, "Custom extension error\n");
Trevor9cd50f72013-06-13 22:36:45 -07002603 ret = 1;
2604 goto err;
2605 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002606 ret=0;
2607err:
2608 /* We have to set the BIO's to NULL otherwise they will be
Richard Levitte26a3a482000-06-01 22:19:21 +00002609 * OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002610 * again when c_ssl is SSL_free()ed.
2611 * This is a hack required because s_ssl and c_ssl are sharing the same
2612 * BIO structure and SSL_set_bio() and SSL_free() automatically
2613 * BIO_free non NULL entries.
2614 * You should not normally do this or be required to do this */
2615 if (s_ssl != NULL)
2616 {
2617 s_ssl->rbio=NULL;
2618 s_ssl->wbio=NULL;
2619 }
2620 if (c_ssl != NULL)
2621 {
2622 c_ssl->rbio=NULL;
2623 c_ssl->wbio=NULL;
2624 }
2625
2626 if (c_to_s != NULL) BIO_free(c_to_s);
2627 if (s_to_c != NULL) BIO_free(s_to_c);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002628 if (c_bio != NULL) BIO_free_all(c_bio);
2629 if (s_bio != NULL) BIO_free_all(s_bio);
Andy Polyakov77a27a52014-06-11 20:40:51 +02002630
2631 if (cbuf) OPENSSL_free(cbuf);
2632 if (sbuf) OPENSSL_free(sbuf);
2633
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002634 return(ret);
2635 }
2636
Richard Levittea7201e92005-01-17 17:06:58 +00002637static int get_proxy_auth_ex_data_idx(void)
2638 {
2639 static volatile int idx = -1;
2640 if (idx < 0)
2641 {
2642 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
2643 if (idx < 0)
2644 {
2645 idx = X509_STORE_CTX_get_ex_new_index(0,
2646 "SSLtest for verify callback", NULL,NULL,NULL);
2647 }
2648 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
2649 }
2650 return idx;
2651 }
2652
Bodo Möller396f6311999-09-08 21:58:13 +00002653static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002654 {
2655 char *s,buf[256];
2656
Ben Laurie54a656e2002-11-13 15:43:43 +00002657 s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
2658 sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002659 if (s != NULL)
2660 {
2661 if (ok)
Richard Levittea7201e92005-01-17 17:06:58 +00002662 fprintf(stderr,"depth=%d %s\n",
2663 ctx->error_depth,buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002664 else
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002665 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002666 fprintf(stderr,"depth=%d error=%d %s\n",
2667 ctx->error_depth,ctx->error,buf);
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002668 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002669 }
2670
2671 if (ok == 0)
2672 {
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002673 fprintf(stderr,"Error string: %s\n",
2674 X509_verify_cert_error_string(ctx->error));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002675 switch (ctx->error)
2676 {
2677 case X509_V_ERR_CERT_NOT_YET_VALID:
2678 case X509_V_ERR_CERT_HAS_EXPIRED:
2679 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
Richard Levitted9bfe4f2005-04-09 16:07:12 +00002680 fprintf(stderr," ... ignored.\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002681 ok=1;
2682 }
2683 }
2684
Richard Levittea7201e92005-01-17 17:06:58 +00002685 if (ok == 1)
2686 {
2687 X509 *xs = ctx->current_cert;
2688#if 0
2689 X509 *xi = ctx->current_issuer;
2690#endif
2691
2692 if (xs->ex_flags & EXFLAG_PROXY)
2693 {
2694 unsigned int *letters =
2695 X509_STORE_CTX_get_ex_data(ctx,
2696 get_proxy_auth_ex_data_idx());
2697
2698 if (letters)
2699 {
2700 int found_any = 0;
2701 int i;
2702 PROXY_CERT_INFO_EXTENSION *pci =
2703 X509_get_ext_d2i(xs, NID_proxyCertInfo,
2704 NULL, NULL);
2705
2706 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
2707 {
2708 case NID_Independent:
2709 /* Completely meaningless in this
2710 program, as there's no way to
2711 grant explicit rights to a
2712 specific PrC. Basically, using
2713 id-ppl-Independent is the perfect
2714 way to grant no rights at all. */
2715 fprintf(stderr, " Independent proxy certificate");
2716 for (i = 0; i < 26; i++)
2717 letters[i] = 0;
2718 break;
2719 case NID_id_ppl_inheritAll:
2720 /* This is basically a NOP, we
2721 simply let the current rights
2722 stand as they are. */
2723 fprintf(stderr, " Proxy certificate inherits all");
2724 break;
2725 default:
2726 s = (char *)
2727 pci->proxyPolicy->policy->data;
2728 i = pci->proxyPolicy->policy->length;
2729
2730 /* The algorithm works as follows:
2731 it is assumed that previous
2732 iterations or the initial granted
2733 rights has already set some elements
2734 of `letters'. What we need to do is
2735 to clear those that weren't granted
2736 by the current PrC as well. The
2737 easiest way to do this is to add 1
2738 to all the elements whose letters
2739 are given with the current policy.
2740 That way, all elements that are set
2741 by the current policy and were
2742 already set by earlier policies and
2743 through the original grant of rights
2744 will get the value 2 or higher.
2745 The last thing to do is to sweep
2746 through `letters' and keep the
2747 elements having the value 2 as set,
2748 and clear all the others. */
2749
2750 fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s);
2751 while(i-- > 0)
2752 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002753 int c = *s++;
Richard Levittea7201e92005-01-17 17:06:58 +00002754 if (isascii(c) && isalpha(c))
2755 {
2756 if (islower(c))
2757 c = toupper(c);
2758 letters[c - 'A']++;
2759 }
2760 }
2761 for (i = 0; i < 26; i++)
2762 if (letters[i] < 2)
2763 letters[i] = 0;
2764 else
2765 letters[i] = 1;
2766 }
2767
2768 found_any = 0;
2769 fprintf(stderr,
2770 ", resulting proxy rights = ");
2771 for(i = 0; i < 26; i++)
2772 if (letters[i])
2773 {
2774 fprintf(stderr, "%c", i + 'A');
2775 found_any = 1;
2776 }
2777 if (!found_any)
2778 fprintf(stderr, "none");
2779 fprintf(stderr, "\n");
2780
2781 PROXY_CERT_INFO_EXTENSION_free(pci);
2782 }
2783 }
2784 }
2785
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002786 return(ok);
2787 }
2788
Richard Levittea7201e92005-01-17 17:06:58 +00002789static void process_proxy_debug(int indent, const char *format, ...)
2790 {
2791 static const char indentation[] =
2792 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
2793 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
2794 char my_format[256];
2795 va_list args;
2796
2797 BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2798 indent, indent, indentation, format);
2799
2800 va_start(args, format);
2801 vfprintf(stderr, my_format, args);
2802 va_end(args);
2803 }
Tim Hudson1d97c842014-12-28 12:48:40 +10002804/*-
2805 * Priority levels:
2806 * 0 [!]var, ()
2807 * 1 & ^
2808 * 2 |
2809 */
Richard Levittea7201e92005-01-17 17:06:58 +00002810static int process_proxy_cond_adders(unsigned int letters[26],
2811 const char *cond, const char **cond_end, int *pos, int indent);
2812static int process_proxy_cond_val(unsigned int letters[26],
2813 const char *cond, const char **cond_end, int *pos, int indent)
2814 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002815 int c;
Richard Levittea7201e92005-01-17 17:06:58 +00002816 int ok = 1;
2817 int negate = 0;
2818
Ben Lauriea51a9722005-06-29 11:02:15 +00002819 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002820 {
2821 cond++; (*pos)++;
2822 }
2823 c = *cond;
2824
2825 if (debug)
2826 process_proxy_debug(indent,
2827 "Start process_proxy_cond_val at position %d: %s\n",
2828 *pos, cond);
2829
2830 while(c == '!')
2831 {
2832 negate = !negate;
2833 cond++; (*pos)++;
Ben Lauriea51a9722005-06-29 11:02:15 +00002834 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002835 {
2836 cond++; (*pos)++;
2837 }
2838 c = *cond;
2839 }
2840
2841 if (c == '(')
2842 {
2843 cond++; (*pos)++;
2844 ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
2845 indent + 1);
2846 cond = *cond_end;
2847 if (ok < 0)
2848 goto end;
Ben Lauriea51a9722005-06-29 11:02:15 +00002849 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002850 {
2851 cond++; (*pos)++;
2852 }
2853 c = *cond;
2854 if (c != ')')
2855 {
2856 fprintf(stderr,
2857 "Weird condition character in position %d: "
2858 "%c\n", *pos, c);
2859 ok = -1;
2860 goto end;
2861 }
2862 cond++; (*pos)++;
2863 }
2864 else if (isascii(c) && isalpha(c))
2865 {
2866 if (islower(c))
2867 c = toupper(c);
2868 ok = letters[c - 'A'];
2869 cond++; (*pos)++;
2870 }
2871 else
2872 {
2873 fprintf(stderr,
2874 "Weird condition character in position %d: "
2875 "%c\n", *pos, c);
2876 ok = -1;
2877 goto end;
2878 }
2879 end:
2880 *cond_end = cond;
2881 if (ok >= 0 && negate)
2882 ok = !ok;
2883
2884 if (debug)
2885 process_proxy_debug(indent,
2886 "End process_proxy_cond_val at position %d: %s, returning %d\n",
2887 *pos, cond, ok);
2888
2889 return ok;
2890 }
2891static int process_proxy_cond_multipliers(unsigned int letters[26],
2892 const char *cond, const char **cond_end, int *pos, int indent)
2893 {
2894 int ok;
2895 char c;
2896
2897 if (debug)
2898 process_proxy_debug(indent,
2899 "Start process_proxy_cond_multipliers at position %d: %s\n",
2900 *pos, cond);
2901
2902 ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
2903 cond = *cond_end;
2904 if (ok < 0)
2905 goto end;
2906
2907 while(ok >= 0)
2908 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002909 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002910 {
2911 cond++; (*pos)++;
2912 }
2913 c = *cond;
2914
2915 switch(c)
2916 {
2917 case '&':
2918 case '^':
2919 {
2920 int save_ok = ok;
2921
2922 cond++; (*pos)++;
2923 ok = process_proxy_cond_val(letters,
2924 cond, cond_end, pos, indent + 1);
2925 cond = *cond_end;
2926 if (ok < 0)
2927 break;
2928
2929 switch(c)
2930 {
2931 case '&':
2932 ok &= save_ok;
2933 break;
2934 case '^':
2935 ok ^= save_ok;
2936 break;
2937 default:
2938 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2939 " STOPPING\n");
2940 EXIT(1);
2941 }
2942 }
2943 break;
2944 default:
2945 goto end;
2946 }
2947 }
2948 end:
2949 if (debug)
2950 process_proxy_debug(indent,
2951 "End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
2952 *pos, cond, ok);
2953
2954 *cond_end = cond;
2955 return ok;
2956 }
2957static int process_proxy_cond_adders(unsigned int letters[26],
2958 const char *cond, const char **cond_end, int *pos, int indent)
2959 {
2960 int ok;
2961 char c;
2962
2963 if (debug)
2964 process_proxy_debug(indent,
2965 "Start process_proxy_cond_adders at position %d: %s\n",
2966 *pos, cond);
2967
2968 ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
2969 indent + 1);
2970 cond = *cond_end;
2971 if (ok < 0)
2972 goto end;
2973
2974 while(ok >= 0)
2975 {
Ben Lauriea51a9722005-06-29 11:02:15 +00002976 while(isspace((int)*cond))
Richard Levittea7201e92005-01-17 17:06:58 +00002977 {
2978 cond++; (*pos)++;
2979 }
2980 c = *cond;
2981
2982 switch(c)
2983 {
2984 case '|':
2985 {
2986 int save_ok = ok;
2987
2988 cond++; (*pos)++;
2989 ok = process_proxy_cond_multipliers(letters,
2990 cond, cond_end, pos, indent + 1);
2991 cond = *cond_end;
2992 if (ok < 0)
2993 break;
2994
2995 switch(c)
2996 {
2997 case '|':
2998 ok |= save_ok;
2999 break;
3000 default:
3001 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
3002 " STOPPING\n");
3003 EXIT(1);
3004 }
3005 }
3006 break;
3007 default:
3008 goto end;
3009 }
3010 }
3011 end:
3012 if (debug)
3013 process_proxy_debug(indent,
3014 "End process_proxy_cond_adders at position %d: %s, returning %d\n",
3015 *pos, cond, ok);
3016
3017 *cond_end = cond;
3018 return ok;
3019 }
3020
3021static int process_proxy_cond(unsigned int letters[26],
3022 const char *cond, const char **cond_end)
3023 {
3024 int pos = 1;
3025 return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
3026 }
3027
Bodo Möller023ec152002-02-28 10:52:56 +00003028static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
3029 {
Bodo Möller023ec152002-02-28 10:52:56 +00003030 int ok=1;
Richard Levittea7201e92005-01-17 17:06:58 +00003031 struct app_verify_arg *cb_arg = arg;
3032 unsigned int letters[26]; /* only used with proxy_auth */
Bodo Möller023ec152002-02-28 10:52:56 +00003033
Richard Levittea7201e92005-01-17 17:06:58 +00003034 if (cb_arg->app_verify)
Bodo Möller023ec152002-02-28 10:52:56 +00003035 {
Richard Levittea7201e92005-01-17 17:06:58 +00003036 char *s = NULL,buf[256];
3037
3038 fprintf(stderr, "In app_verify_callback, allowing cert. ");
3039 fprintf(stderr, "Arg is: %s\n", cb_arg->string);
Nils Larsch35e85102005-05-10 11:55:28 +00003040 fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
Dr. Stephen Hensonf7951232005-05-12 22:39:42 +00003041 (void *)ctx, (void *)ctx->cert);
Richard Levittea7201e92005-01-17 17:06:58 +00003042 if (ctx->cert)
3043 s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
3044 if (s != NULL)
3045 {
Bodo Möller023ec152002-02-28 10:52:56 +00003046 fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
Richard Levittea7201e92005-01-17 17:06:58 +00003047 }
3048 return(1);
3049 }
3050 if (cb_arg->proxy_auth)
3051 {
3052 int found_any = 0, i;
3053 char *sp;
3054
3055 for(i = 0; i < 26; i++)
3056 letters[i] = 0;
3057 for(sp = cb_arg->proxy_auth; *sp; sp++)
3058 {
Ben Lauriea51a9722005-06-29 11:02:15 +00003059 int c = *sp;
Richard Levittea7201e92005-01-17 17:06:58 +00003060 if (isascii(c) && isalpha(c))
3061 {
3062 if (islower(c))
3063 c = toupper(c);
3064 letters[c - 'A'] = 1;
3065 }
3066 }
3067
3068 fprintf(stderr,
3069 " Initial proxy rights = ");
3070 for(i = 0; i < 26; i++)
3071 if (letters[i])
3072 {
3073 fprintf(stderr, "%c", i + 'A');
3074 found_any = 1;
3075 }
3076 if (!found_any)
3077 fprintf(stderr, "none");
3078 fprintf(stderr, "\n");
3079
3080 X509_STORE_CTX_set_ex_data(ctx,
3081 get_proxy_auth_ex_data_idx(),letters);
Bodo Möller023ec152002-02-28 10:52:56 +00003082 }
Richard Levitted9bfe4f2005-04-09 16:07:12 +00003083 if (cb_arg->allow_proxy_certs)
3084 {
3085 X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
3086 }
Bodo Möller023ec152002-02-28 10:52:56 +00003087
Richard Levittea7201e92005-01-17 17:06:58 +00003088#ifndef OPENSSL_NO_X509_VERIFY
Richard Levittea7201e92005-01-17 17:06:58 +00003089 ok = X509_verify_cert(ctx);
Richard Levittea7201e92005-01-17 17:06:58 +00003090#endif
3091
3092 if (cb_arg->proxy_auth)
3093 {
Dr. Stephen Hensonbab53402009-01-07 23:44:27 +00003094 if (ok > 0)
Richard Levittea7201e92005-01-17 17:06:58 +00003095 {
3096 const char *cond_end = NULL;
3097
3098 ok = process_proxy_cond(letters,
3099 cb_arg->proxy_cond, &cond_end);
3100
3101 if (ok < 0)
3102 EXIT(3);
3103 if (*cond_end)
3104 {
3105 fprintf(stderr, "Stopped processing condition before it's end.\n");
3106 ok = 0;
3107 }
3108 if (!ok)
3109 fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
3110 cb_arg->proxy_cond);
3111 else
3112 fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
3113 cb_arg->proxy_cond);
3114 }
3115 }
Bodo Möller023ec152002-02-28 10:52:56 +00003116 return(ok);
3117 }
3118
Richard Levittebc36ee62001-02-20 08:13:47 +00003119#ifndef OPENSSL_NO_RSA
Bodo Möller46b3bd52000-04-06 22:25:49 +00003120static RSA *rsa_tmp=NULL;
3121
Ulf Möllerdf63a381999-06-09 16:33:18 +00003122static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003123 {
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003124 BIGNUM *bn = NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003125 if (rsa_tmp == NULL)
3126 {
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003127 bn = BN_new();
Geoff Thorpee9224c72002-12-08 05:24:31 +00003128 rsa_tmp = RSA_new();
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003129 if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
Geoff Thorpee9224c72002-12-08 05:24:31 +00003130 {
3131 BIO_printf(bio_err, "Memory error...");
3132 goto end;
3133 }
Ben Laurie60e31c31999-02-21 21:58:59 +00003134 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
Bodo Möllerd58d0921999-06-10 16:29:32 +00003135 (void)BIO_flush(bio_err);
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003136 if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
Geoff Thorpee9224c72002-12-08 05:24:31 +00003137 {
Richard Levitte3ae70932003-04-03 23:39:48 +00003138 BIO_printf(bio_err, "Error generating key.");
Geoff Thorpee9224c72002-12-08 05:24:31 +00003139 RSA_free(rsa_tmp);
3140 rsa_tmp = NULL;
3141 }
3142end:
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003143 BIO_printf(bio_err,"\n");
Bodo Möllerd58d0921999-06-10 16:29:32 +00003144 (void)BIO_flush(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003145 }
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003146 if(bn) BN_free(bn);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003147 return(rsa_tmp);
3148 }
Bodo Möller46b3bd52000-04-06 22:25:49 +00003149
3150static void free_tmp_rsa(void)
3151 {
3152 if (rsa_tmp != NULL)
3153 {
3154 RSA_free(rsa_tmp);
3155 rsa_tmp = NULL;
3156 }
3157 }
Ulf Möller79df9d61999-04-27 03:19:12 +00003158#endif
Bodo Möller53002dc2000-02-04 11:21:18 +00003159
Richard Levittebc36ee62001-02-20 08:13:47 +00003160#ifndef OPENSSL_NO_DH
Tim Hudson1d97c842014-12-28 12:48:40 +10003161/*-
3162 * These DH parameters have been generated as follows:
Bodo Möllere4589582000-03-10 13:23:20 +00003163 * $ openssl dhparam -C -noout 512
3164 * $ openssl dhparam -C -noout 1024
3165 * $ openssl dhparam -C -noout -dsaparam 1024
3166 * (The third function has been renamed to avoid name conflicts.)
3167 */
Richard Levittef3f316f2000-10-22 12:45:33 +00003168static DH *get_dh512()
Bodo Möller53002dc2000-02-04 11:21:18 +00003169 {
Bodo Möllere4589582000-03-10 13:23:20 +00003170 static unsigned char dh512_p[]={
3171 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
3172 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
3173 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
3174 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
3175 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
3176 0x02,0xC5,0xAE,0x23,
3177 };
3178 static unsigned char dh512_g[]={
3179 0x02,
3180 };
3181 DH *dh;
Bodo Möller53002dc2000-02-04 11:21:18 +00003182
Bodo Möllere4589582000-03-10 13:23:20 +00003183 if ((dh=DH_new()) == NULL) return(NULL);
3184 dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
3185 dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
3186 if ((dh->p == NULL) || (dh->g == NULL))
3187 { DH_free(dh); return(NULL); }
3188 return(dh);
3189 }
Bodo Möller53002dc2000-02-04 11:21:18 +00003190
Richard Levittef3f316f2000-10-22 12:45:33 +00003191static DH *get_dh1024()
Bodo Möllere4589582000-03-10 13:23:20 +00003192 {
3193 static unsigned char dh1024_p[]={
3194 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
3195 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
3196 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
3197 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
3198 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
3199 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
3200 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
3201 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
3202 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
3203 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
3204 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
3205 };
3206 static unsigned char dh1024_g[]={
3207 0x02,
3208 };
3209 DH *dh;
3210
3211 if ((dh=DH_new()) == NULL) return(NULL);
3212 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3213 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3214 if ((dh->p == NULL) || (dh->g == NULL))
3215 { DH_free(dh); return(NULL); }
3216 return(dh);
3217 }
3218
Richard Levittef3f316f2000-10-22 12:45:33 +00003219static DH *get_dh1024dsa()
Bodo Möllere4589582000-03-10 13:23:20 +00003220 {
3221 static unsigned char dh1024_p[]={
3222 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
3223 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
3224 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
3225 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
3226 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
3227 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
3228 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
3229 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
3230 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
3231 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
3232 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
3233 };
3234 static unsigned char dh1024_g[]={
3235 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
3236 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
3237 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
3238 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
3239 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
3240 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
3241 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
3242 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
3243 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
3244 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
3245 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
3246 };
3247 DH *dh;
3248
3249 if ((dh=DH_new()) == NULL) return(NULL);
3250 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3251 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3252 if ((dh->p == NULL) || (dh->g == NULL))
3253 { DH_free(dh); return(NULL); }
3254 dh->length = 160;
3255 return(dh);
Bodo Möller53002dc2000-02-04 11:21:18 +00003256 }
Nils Larschf71165b2006-02-24 17:58:43 +00003257#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +00003258
Nils Larschddac1972006-03-10 23:06:27 +00003259#ifndef OPENSSL_NO_PSK
3260/* convert the PSK key (psk_key) in ascii to binary (psk) */
3261static int psk_key2bn(const char *pskkey, unsigned char *psk,
3262 unsigned int max_psk_len)
3263 {
3264 int ret;
3265 BIGNUM *bn = NULL;
3266
3267 ret = BN_hex2bn(&bn, pskkey);
3268 if (!ret)
3269 {
3270 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey);
3271 if (bn)
3272 BN_free(bn);
3273 return 0;
3274 }
3275 if (BN_num_bytes(bn) > (int)max_psk_len)
3276 {
3277 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
3278 max_psk_len, BN_num_bytes(bn));
3279 BN_free(bn);
3280 return 0;
3281 }
3282 ret = BN_bn2bin(bn, psk);
3283 BN_free(bn);
3284 return ret;
3285 }
3286
3287static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
3288 unsigned int max_identity_len, unsigned char *psk,
3289 unsigned int max_psk_len)
3290 {
3291 int ret;
3292 unsigned int psk_len = 0;
3293
Nils Larsche9680892006-03-12 22:16:57 +00003294 ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
Nils Larschddac1972006-03-10 23:06:27 +00003295 if (ret < 0)
3296 goto out_err;
3297 if (debug)
3298 fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
3299 ret = psk_key2bn(psk_key, psk, max_psk_len);
3300 if (ret < 0)
3301 goto out_err;
3302 psk_len = ret;
3303out_err:
3304 return psk_len;
3305 }
3306
3307static unsigned int psk_server_callback(SSL *ssl, const char *identity,
3308 unsigned char *psk, unsigned int max_psk_len)
3309 {
3310 unsigned int psk_len=0;
3311
3312 if (strcmp(identity, "Client_identity") != 0)
3313 {
3314 BIO_printf(bio_err, "server: PSK error: client identity not found\n");
3315 return 0;
3316 }
3317 psk_len=psk_key2bn(psk_key, psk, max_psk_len);
3318 return psk_len;
3319 }
3320#endif
3321
Nils Larsch6e119bb2005-08-25 07:29:54 +00003322static int do_test_cipherlist(void)
3323 {
3324 int i = 0;
3325 const SSL_METHOD *meth;
Ben Lauriebabb3792008-10-12 14:32:47 +00003326 const SSL_CIPHER *ci, *tci = NULL;
Nils Larsch6e119bb2005-08-25 07:29:54 +00003327
Nils Larsch00fe8652006-01-15 17:35:28 +00003328#ifndef OPENSSL_NO_SSL3
Nils Larsch6e119bb2005-08-25 07:29:54 +00003329 fprintf(stderr, "testing SSLv3 cipher list order: ");
3330 meth = SSLv3_method();
3331 tci = NULL;
3332 while ((ci = meth->get_cipher(i++)) != NULL)
3333 {
3334 if (tci != NULL)
3335 if (ci->id >= tci->id)
3336 {
3337 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3338 return 0;
3339 }
3340 tci = ci;
3341 }
3342 fprintf(stderr, "ok\n");
Nils Larsch00fe8652006-01-15 17:35:28 +00003343#endif
3344#ifndef OPENSSL_NO_TLS1
Nils Larsch6e119bb2005-08-25 07:29:54 +00003345 fprintf(stderr, "testing TLSv1 cipher list order: ");
3346 meth = TLSv1_method();
3347 tci = NULL;
3348 while ((ci = meth->get_cipher(i++)) != NULL)
3349 {
3350 if (tci != NULL)
3351 if (ci->id >= tci->id)
3352 {
3353 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3354 return 0;
3355 }
3356 tci = ci;
3357 }
3358 fprintf(stderr, "ok\n");
Nils Larsch00fe8652006-01-15 17:35:28 +00003359#endif
Nils Larsch6e119bb2005-08-25 07:29:54 +00003360
3361 return 1;
3362 }