blob: 10bfdd6b911e0a6ee669fe942de65edd8e6e80b1 [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* apps/s_server.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öllera661b652001-10-20 17:56:36 +000058/* ====================================================================
Bodo Möllerb1277b92006-01-02 23:29:12 +000059 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
Bodo Möllera661b652001-10-20 17:56:36 +000060 *
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.
Bodo Möller7eb18f12002-08-15 09:21:31 +0000113 * ECC cipher suite support in OpenSSL originally developed by
Bodo Möllerea262262002-08-09 08:56:08 +0000114 * 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
Geoff Thorpe5daec7e2002-12-08 05:38:44 +0000143/* Until the key-gen callbacks are modified to use newer prototypes, we allow
144 * deprecated functions for openssl-internal code */
145#ifdef OPENSSL_NO_DEPRECATED
146#undef OPENSSL_NO_DEPRECATED
147#endif
148
Bodo Möller1b1a6e71999-08-09 13:01:48 +0000149#include <assert.h>
Nils Larschddac1972006-03-10 23:06:27 +0000150#include <ctype.h>
Ulf Möller8c197cc1999-07-28 23:25:59 +0000151#include <stdio.h>
152#include <stdlib.h>
153#include <string.h>
Richard Levitte4d8743f2003-11-28 13:10:58 +0000154
Richard Levittebe1bd922001-02-20 14:07:03 +0000155#include <openssl/e_os2.h>
Richard Levittecf1b7d92001-02-19 16:06:34 +0000156#ifdef OPENSSL_NO_STDIO
Ulf Möller8c197cc1999-07-28 23:25:59 +0000157#define APPS_WIN16
158#endif
159
Richard Levitte4d8743f2003-11-28 13:10:58 +0000160#if !defined(OPENSSL_SYS_NETWARE) /* conflicts with winsock2 stuff on netware */
161#include <sys/types.h>
162#endif
163
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000164/* With IPv6, it looks like Digital has mixed up the proper order of
165 recursive header file inclusion, resulting in the compiler complaining
166 that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
167 is needed to have fileno() declared correctly... So let's define u_int */
Richard Levittebc36ee62001-02-20 08:13:47 +0000168#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000169#define __U_INT
170typedef unsigned int u_int;
171#endif
172
Bodo Möllerec577821999-04-23 22:13:45 +0000173#include <openssl/lhash.h>
174#include <openssl/bn.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000175#define USE_SOCKETS
176#include "apps.h"
Bodo Möllerec577821999-04-23 22:13:45 +0000177#include <openssl/err.h>
178#include <openssl/pem.h>
179#include <openssl/x509.h>
180#include <openssl/ssl.h>
Geoff Thorpe13729652001-09-12 02:39:06 +0000181#include <openssl/rand.h>
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000182#include <openssl/ocsp.h>
Nils Larsch3eeaab42005-07-16 12:37:36 +0000183#ifndef OPENSSL_NO_DH
184#include <openssl/dh.h>
185#endif
186#ifndef OPENSSL_NO_RSA
187#include <openssl/rsa.h>
188#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000189#ifndef OPENSSL_NO_SRP
190#include <openssl/srp.h>
191#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000192#include "s_apps.h"
Ben Laurie36d16f82005-04-26 16:02:40 +0000193#include "timeouts.h"
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000194
Richard Levittebc36ee62001-02-20 08:13:47 +0000195#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
Ulf Möller75e07701999-05-13 13:21:17 +0000196/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000197#undef FIONBIO
198#endif
199
Ulf Möller4700aea2006-04-11 21:34:21 +0000200#if defined(OPENSSL_SYS_BEOS_R5)
201#include <fcntl.h>
202#endif
203
Richard Levittecf1b7d92001-02-19 16:06:34 +0000204#ifndef OPENSSL_NO_RSA
Ulf Möllerdf63a381999-06-09 16:33:18 +0000205static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
Ulf Möllerf5d7a031999-04-27 01:14:46 +0000206#endif
Bodo Möller7c2d4fe2010-08-26 15:15:47 +0000207static int not_resumable_sess_cb(SSL *s, int is_forward_secure);
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +0000208static int sv_body(char *hostname, int s, int stype, unsigned char *context);
209static int www_body(char *hostname, int s, int stype, unsigned char *context);
210static int rev_body(char *hostname, int s, int stype, unsigned char *context);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000211static void close_accept_socket(void );
212static void sv_usage(void);
213static int init_ssl_connection(SSL *s);
214static void print_stats(BIO *bp,SSL_CTX *ctx);
Geoff Thorpe1aa0d942001-02-21 18:38:48 +0000215static int generate_session_id(const SSL *ssl, unsigned char *id,
216 unsigned int *id_len);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +0000217static void init_session_cache_ctx(SSL_CTX *sctx);
218static void free_sessions(void);
Richard Levittecf1b7d92001-02-19 16:06:34 +0000219#ifndef OPENSSL_NO_DH
Nils Larscheb3eab22005-04-07 22:48:33 +0000220static DH *load_dh_param(const char *dhfile);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000221#endif
Bodo Möllerea262262002-08-09 08:56:08 +0000222
Bodo Möllerb74ba291999-09-03 23:08:45 +0000223#ifdef MONOLITH
224static void s_server_init(void);
225#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000226
Scott Deboy36086182013-06-18 14:34:38 -0700227#ifndef OPENSSL_NO_TLSEXT
228
229static const unsigned char auth_ext_data[]={TLSEXT_AUTHZDATAFORMAT_dtcp};
230
Scott Deboy67c408c2013-08-01 11:54:09 -0700231static unsigned char *generated_supp_data = NULL;
232
Ben Laurie1769dfa2013-09-06 14:03:28 +0100233static const unsigned char *most_recent_supplemental_data = NULL;
Scott Deboy67c408c2013-08-01 11:54:09 -0700234static size_t most_recent_supplemental_data_length = 0;
Scott Deboy36086182013-06-18 14:34:38 -0700235
236static int client_provided_server_authz = 0;
237static int client_provided_client_authz = 0;
238
239#endif
240
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000241/* static int load_CA(SSL_CTX *ctx, char *file);*/
242
243#undef BUFSIZZ
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000244#define BUFSIZZ 16*1024
Bodo Möllerdd731931999-09-25 11:24:53 +0000245static int bufsize=BUFSIZZ;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000246static int accept_socket= -1;
247
248#define TEST_CERT "server.pem"
Bodo Möllered3883d2006-01-02 23:14:37 +0000249#ifndef OPENSSL_NO_TLSEXT
250#define TEST_CERT2 "server2.pem"
251#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000252#undef PROG
253#define PROG s_server_main
254
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000255extern int verify_depth, verify_return_error, verify_quiet;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000256
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000257static int s_server_verify=SSL_VERIFY_NONE;
Bodo Möllerb56bce41999-05-13 15:09:38 +0000258static int s_server_session_id_context = 1; /* anything will do */
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +0000259static const char *s_cert_file=TEST_CERT,*s_key_file=NULL, *s_chain_file=NULL;
Bodo Möllered3883d2006-01-02 23:14:37 +0000260#ifndef OPENSSL_NO_TLSEXT
261static const char *s_cert_file2=TEST_CERT2,*s_key_file2=NULL;
262#endif
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +0000263static char *s_dcert_file=NULL,*s_dkey_file=NULL, *s_dchain_file=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000264#ifdef FIONBIO
265static int s_nbio=0;
266#endif
267static int s_nbio_test=0;
Bodo Möller204cf1a1999-08-08 14:21:04 +0000268int s_crlf=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000269static SSL_CTX *ctx=NULL;
Bodo Möllered3883d2006-01-02 23:14:37 +0000270#ifndef OPENSSL_NO_TLSEXT
271static SSL_CTX *ctx2=NULL;
272#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000273static int www=0;
274
275static BIO *bio_s_out=NULL;
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +0000276static BIO *bio_s_msg = NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000277static int s_debug=0;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000278#ifndef OPENSSL_NO_TLSEXT
279static int s_tlsextdebug=0;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000280static int s_tlsextstatus=0;
281static int cert_status_cb(SSL *s, void *arg);
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000282#endif
Bodo Möller7c2d4fe2010-08-26 15:15:47 +0000283static int no_resume_ephemeral = 0;
Bodo Möllera661b652001-10-20 17:56:36 +0000284static int s_msg=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000285static int s_quiet=0;
Dr. Stephen Henson68575592012-11-19 23:41:24 +0000286static int s_ign_eof=0;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000287static int s_brief=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000288
Ben Lauriee0af0402011-11-15 23:50:52 +0000289static char *keymatexportlabel=NULL;
290static int keymatexportlen=20;
291
Bodo Möllerb74ba291999-09-03 23:08:45 +0000292static int hack=0;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000293#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000294static char *engine_id=NULL;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000295#endif
Geoff Thorpe1aa0d942001-02-21 18:38:48 +0000296static const char *session_id_prefix=NULL;
Bodo Möllerb74ba291999-09-03 23:08:45 +0000297
Ben Laurie36d16f82005-04-26 16:02:40 +0000298static int enable_timeouts = 0;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000299static long socket_mtu;
Dr. Stephen Henson58f41a92009-06-05 14:59:26 +0000300#ifndef OPENSSL_NO_DTLS1
Ben Laurie36d16f82005-04-26 16:02:40 +0000301static int cert_chain = 0;
Dr. Stephen Henson58f41a92009-06-05 14:59:26 +0000302#endif
Ben Laurie36d16f82005-04-26 16:02:40 +0000303
Ben Lauriea9e1c502012-05-30 10:10:58 +0000304#ifndef OPENSSL_NO_TLSEXT
Scott Deboy36086182013-06-18 14:34:38 -0700305static int suppdata_cb(SSL *s, unsigned short supp_data_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000306 const unsigned char *in,
307 unsigned short inlen, int *al,
308 void *arg);
Scott Deboy36086182013-06-18 14:34:38 -0700309
310static int auth_suppdata_generate_cb(SSL *s, unsigned short supp_data_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000311 const unsigned char **out,
312 unsigned short *outlen, int *al, void *arg);
Scott Deboy36086182013-06-18 14:34:38 -0700313
314static int authz_tlsext_generate_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000315 const unsigned char **out, unsigned short *outlen,
316 int *al, void *arg);
Scott Deboy36086182013-06-18 14:34:38 -0700317
318static int authz_tlsext_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +0000319 const unsigned char *in,
320 unsigned short inlen, int *al,
321 void *arg);
Scott Deboy36086182013-06-18 14:34:38 -0700322
Trevora398f822013-05-12 18:55:27 -0700323static BIO *serverinfo_in = NULL;
324static const char *s_serverinfo_file = NULL;
Scott Deboy36086182013-06-18 14:34:38 -0700325
326static int c_auth = 0;
327static int c_auth_require_reneg = 0;
Ben Lauriea9e1c502012-05-30 10:10:58 +0000328#endif
Ben Laurie333f9262011-11-15 22:59:20 +0000329
Nils Larschddac1972006-03-10 23:06:27 +0000330#ifndef OPENSSL_NO_PSK
331static char *psk_identity="Client_identity";
Ben Laurief3b7bda2008-11-16 12:47:12 +0000332char *psk_key=NULL; /* by default PSK is not used */
Nils Larschddac1972006-03-10 23:06:27 +0000333
334static unsigned int psk_server_cb(SSL *ssl, const char *identity,
335 unsigned char *psk, unsigned int max_psk_len)
336 {
337 unsigned int psk_len = 0;
338 int ret;
339 BIGNUM *bn = NULL;
340
341 if (s_debug)
342 BIO_printf(bio_s_out,"psk_server_cb\n");
343 if (!identity)
344 {
345 BIO_printf(bio_err,"Error: client did not send PSK identity\n");
346 goto out_err;
347 }
348 if (s_debug)
349 BIO_printf(bio_s_out,"identity_len=%d identity=%s\n",
Dr. Stephen Hensond82a6122007-09-07 13:34:46 +0000350 identity ? (int)strlen(identity) : 0, identity);
Nils Larschddac1972006-03-10 23:06:27 +0000351
352 /* here we could lookup the given identity e.g. from a database */
353 if (strcmp(identity, psk_identity) != 0)
354 {
Ben Laurief3b7bda2008-11-16 12:47:12 +0000355 BIO_printf(bio_s_out, "PSK error: client identity not found"
356 " (got '%s' expected '%s')\n", identity,
357 psk_identity);
Nils Larschddac1972006-03-10 23:06:27 +0000358 goto out_err;
359 }
360 if (s_debug)
361 BIO_printf(bio_s_out, "PSK client identity found\n");
362
363 /* convert the PSK key to binary */
364 ret = BN_hex2bn(&bn, psk_key);
365 if (!ret)
366 {
367 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
368 if (bn)
369 BN_free(bn);
370 return 0;
371 }
372 if (BN_num_bytes(bn) > (int)max_psk_len)
373 {
374 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
375 max_psk_len, BN_num_bytes(bn));
376 BN_free(bn);
377 return 0;
378 }
379
380 ret = BN_bn2bin(bn, psk);
381 BN_free(bn);
382
383 if (ret < 0)
384 goto out_err;
385 psk_len = (unsigned int)ret;
386
387 if (s_debug)
388 BIO_printf(bio_s_out, "fetched PSK len=%d\n", psk_len);
389 return psk_len;
390 out_err:
391 if (s_debug)
392 BIO_printf(bio_err, "Error in PSK server callback\n");
393 return 0;
394 }
395#endif
Ben Laurie36d16f82005-04-26 16:02:40 +0000396
Ben Laurieedc032b2011-03-12 17:01:19 +0000397#ifndef OPENSSL_NO_SRP
398/* This is a context that we pass to callbacks */
399typedef struct srpsrvparm_st
400 {
Ben Laurieedc032b2011-03-12 17:01:19 +0000401 char *login;
402 SRP_VBASE *vb;
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000403 SRP_user_pwd *user;
Ben Laurieedc032b2011-03-12 17:01:19 +0000404 } srpsrvparm;
405
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000406/* This callback pretends to require some asynchronous logic in order to obtain
407 a verifier. When the callback is called for a new connection we return
408 with a negative value. This will provoke the accept etc to return with
409 an LOOKUP_X509. The main logic of the reinvokes the suspended call
410 (which would normally occur after a worker has finished) and we
411 set the user parameters.
412*/
Ben Laurieedc032b2011-03-12 17:01:19 +0000413static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
414 {
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000415 srpsrvparm *p = (srpsrvparm *)arg;
416 if (p->login == NULL && p->user == NULL )
417 {
418 p->login = SSL_get_srp_username(s);
419 BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login);
420 return (-1) ;
421 }
Ben Laurieedc032b2011-03-12 17:01:19 +0000422
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000423 if (p->user == NULL)
Ben Laurieedc032b2011-03-12 17:01:19 +0000424 {
425 BIO_printf(bio_err, "User %s doesn't exist\n", p->login);
426 return SSL3_AL_FATAL;
427 }
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000428 if (SSL_set_srp_server_param(s, p->user->N, p->user->g, p->user->s, p->user->v,
429 p->user->info) < 0)
Ben Laurieedc032b2011-03-12 17:01:19 +0000430 {
431 *ad = SSL_AD_INTERNAL_ERROR;
432 return SSL3_AL_FATAL;
433 }
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +0000434 BIO_printf(bio_err, "SRP parameters set: username = \"%s\" info=\"%s\" \n", p->login,p->user->info);
435 /* need to check whether there are memory leaks */
436 p->user = NULL;
437 p->login = NULL;
Ben Laurieedc032b2011-03-12 17:01:19 +0000438 return SSL_ERROR_NONE;
439 }
440
441#endif
442
Bodo Möllerb74ba291999-09-03 23:08:45 +0000443#ifdef MONOLITH
Ulf Möller6b691a51999-04-19 21:31:43 +0000444static void s_server_init(void)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000445 {
Bodo Möllerb74ba291999-09-03 23:08:45 +0000446 accept_socket=-1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000447 s_server_verify=SSL_VERIFY_NONE;
448 s_dcert_file=NULL;
449 s_dkey_file=NULL;
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +0000450 s_dchain_file=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000451 s_cert_file=TEST_CERT;
452 s_key_file=NULL;
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +0000453 s_chain_file=NULL;
Bodo Möllered3883d2006-01-02 23:14:37 +0000454#ifndef OPENSSL_NO_TLSEXT
455 s_cert_file2=TEST_CERT2;
456 s_key_file2=NULL;
457 ctx2=NULL;
458#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000459#ifdef FIONBIO
460 s_nbio=0;
461#endif
462 s_nbio_test=0;
463 ctx=NULL;
464 www=0;
465
466 bio_s_out=NULL;
467 s_debug=0;
Bodo Möllera661b652001-10-20 17:56:36 +0000468 s_msg=0;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000469 s_quiet=0;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000470 s_brief=0;
Bodo Möllerb74ba291999-09-03 23:08:45 +0000471 hack=0;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000472#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000473 engine_id=NULL;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000474#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000475 }
476#endif
477
Ulf Möller6b691a51999-04-19 21:31:43 +0000478static void sv_usage(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000479 {
480 BIO_printf(bio_err,"usage: s_server [args ...]\n");
481 BIO_printf(bio_err,"\n");
Ralf S. Engelschall13e91dd1998-12-22 15:59:57 +0000482 BIO_printf(bio_err," -accept arg - port to accept on (default is %d)\n",PORT);
Ben Laurieb4cadc61999-03-22 12:22:14 +0000483 BIO_printf(bio_err," -context arg - set session ID context\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000484 BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n");
485 BIO_printf(bio_err," -Verify arg - turn on peer certificate verification, must have a cert.\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000486 BIO_printf(bio_err," -cert arg - certificate file to use\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000487 BIO_printf(bio_err," (default is %s)\n",TEST_CERT);
Trevora398f822013-05-12 18:55:27 -0700488#ifndef OPENSSL_NO_TLSEXT
489 BIO_printf(bio_err," -serverinfo arg - PEM serverinfo file for certificate\n");
Scott Deboy36086182013-06-18 14:34:38 -0700490 BIO_printf(bio_err," -auth - send and receive RFC 5878 TLS auth extensions and supplemental data\n");
491 BIO_printf(bio_err," -auth_require_reneg - Do not send TLS auth extensions until renegotiation\n");
Trevora398f822013-05-12 18:55:27 -0700492#endif
Scott Deboy36086182013-06-18 14:34:38 -0700493 BIO_printf(bio_err," -no_resumption_on_reneg - set SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION flag\n");
Lutz Jänicke51e00db2008-05-19 07:52:15 +0000494 BIO_printf(bio_err," -crl_check - check the peer certificate has not been revoked by its CA.\n" \
495 " The CRL(s) are appended to the certificate file\n");
496 BIO_printf(bio_err," -crl_check_all - check the peer certificate has not been revoked by its CA\n" \
497 " or any other CRL in the CA chain. CRL(s) are appened to the\n" \
498 " the certificate file.\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000499 BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
500 BIO_printf(bio_err," -key arg - Private Key file to use, in cert file if\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000501 BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000502 BIO_printf(bio_err," -keyform arg - key format (PEM, DER or ENGINE) PEM default\n");
503 BIO_printf(bio_err," -pass arg - private key file pass phrase source\n");
Ralf S. Engelschallea14a911999-02-25 11:26:26 +0000504 BIO_printf(bio_err," -dcert arg - second certificate file to use (usually for DSA)\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000505 BIO_printf(bio_err," -dcertform x - second certificate format (PEM or DER) PEM default\n");
Ralf S. Engelschallea14a911999-02-25 11:26:26 +0000506 BIO_printf(bio_err," -dkey arg - second private key file to use (usually for DSA)\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000507 BIO_printf(bio_err," -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
508 BIO_printf(bio_err," -dpass arg - second private key file pass phrase source\n");
Dr. Stephen Henson3908cdf1999-10-04 23:56:06 +0000509 BIO_printf(bio_err," -dhparam arg - DH parameter file to use, in cert file if not specified\n");
510 BIO_printf(bio_err," or a default set of parameters is used\n");
Bodo Möllerea262262002-08-09 08:56:08 +0000511#ifndef OPENSSL_NO_ECDH
512 BIO_printf(bio_err," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
513 " Use \"openssl ecparam -list_curves\" for all names\n" \
Bodo Möllerbcbe37b2006-03-30 02:41:30 +0000514 " (default is nistp256).\n");
Bodo Möllerea262262002-08-09 08:56:08 +0000515#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000516#ifdef FIONBIO
517 BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
518#endif
519 BIO_printf(bio_err," -nbio_test - test with the non-blocking test bio\n");
Bodo Möller1bdb8631999-08-07 02:51:10 +0000520 BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000521 BIO_printf(bio_err," -debug - Print more output\n");
Bodo Möllera661b652001-10-20 17:56:36 +0000522 BIO_printf(bio_err," -msg - Show protocol messages\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000523 BIO_printf(bio_err," -state - Print the SSL states\n");
524 BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
525 BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
526 BIO_printf(bio_err," -nocert - Don't use any certificates (Anon-DH)\n");
Paul C. Suttone170a5c1999-01-02 14:42:23 +0000527 BIO_printf(bio_err," -cipher arg - play with 'openssl ciphers' to see what goes here\n");
Lutz Jänicke836f9962001-02-09 19:56:31 +0000528 BIO_printf(bio_err," -serverpref - Use server's cipher preferences\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000529 BIO_printf(bio_err," -quiet - No server output\n");
530 BIO_printf(bio_err," -no_tmp_rsa - Do not generate a tmp RSA key\n");
Nils Larschddac1972006-03-10 23:06:27 +0000531#ifndef OPENSSL_NO_PSK
532 BIO_printf(bio_err," -psk_hint arg - PSK identity hint to use\n");
533 BIO_printf(bio_err," -psk arg - PSK in hex (without 0x)\n");
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000534# ifndef OPENSSL_NO_JPAKE
Ben Laurief3b7bda2008-11-16 12:47:12 +0000535 BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n");
536# endif
Nils Larschddac1972006-03-10 23:06:27 +0000537#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000538#ifndef OPENSSL_NO_SRP
539 BIO_printf(bio_err," -srpvfile file - The verifier file for SRP\n");
540 BIO_printf(bio_err," -srpuserseed string - A seed string for a default user salt.\n");
541#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000542 BIO_printf(bio_err," -ssl2 - Just talk SSLv2\n");
543 BIO_printf(bio_err," -ssl3 - Just talk SSLv3\n");
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000544 BIO_printf(bio_err," -tls1_2 - Just talk TLSv1.2\n");
Dr. Stephen Henson61f477f2011-02-06 00:51:05 +0000545 BIO_printf(bio_err," -tls1_1 - Just talk TLSv1.1\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000546 BIO_printf(bio_err," -tls1 - Just talk TLSv1\n");
Ben Laurie36d16f82005-04-26 16:02:40 +0000547 BIO_printf(bio_err," -dtls1 - Just talk DTLSv1\n");
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +0000548 BIO_printf(bio_err," -dtls1_2 - Just talk DTLSv1.2\n");
Ben Laurie36d16f82005-04-26 16:02:40 +0000549 BIO_printf(bio_err," -timeout - Enable timeouts\n");
Dr. Stephen Henson046f2102009-05-17 16:04:58 +0000550 BIO_printf(bio_err," -mtu - Set link layer MTU\n");
Ben Laurie36d16f82005-04-26 16:02:40 +0000551 BIO_printf(bio_err," -chain - Read a certificate chain\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000552 BIO_printf(bio_err," -no_ssl2 - Just disable SSLv2\n");
553 BIO_printf(bio_err," -no_ssl3 - Just disable SSLv3\n");
554 BIO_printf(bio_err," -no_tls1 - Just disable TLSv1\n");
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000555 BIO_printf(bio_err," -no_tls1_1 - Just disable TLSv1.1\n");
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000556 BIO_printf(bio_err," -no_tls1_2 - Just disable TLSv1.2\n");
Richard Levittecf1b7d92001-02-19 16:06:34 +0000557#ifndef OPENSSL_NO_DH
Bodo Möller50596581999-07-12 17:15:42 +0000558 BIO_printf(bio_err," -no_dhe - Disable ephemeral DH\n");
559#endif
Bodo Möllerea262262002-08-09 08:56:08 +0000560#ifndef OPENSSL_NO_ECDH
561 BIO_printf(bio_err," -no_ecdhe - Disable ephemeral ECDH\n");
562#endif
Bodo Möller7c2d4fe2010-08-26 15:15:47 +0000563 BIO_printf(bio_err, "-no_resume_ephemeral - Disable caching and tickets if ephemeral (EC)DH is used\n");
Ulf Möller657e60f2000-02-03 23:23:24 +0000564 BIO_printf(bio_err," -bugs - Turn on SSL bug compatibility\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000565 BIO_printf(bio_err," -www - Respond to a 'GET /' with a status page\n");
Ralf S. Engelschall15542b21999-03-09 13:09:07 +0000566 BIO_printf(bio_err," -WWW - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
Richard Levitte251cb4c2001-03-10 16:20:52 +0000567 BIO_printf(bio_err," -HTTP - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
568 BIO_printf(bio_err," with the assumption it contains a complete HTTP response.\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000569#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000570 BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000571#endif
Geoff Thorpe1aa0d942001-02-21 18:38:48 +0000572 BIO_printf(bio_err," -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000573 BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
Bodo Möllered3883d2006-01-02 23:14:37 +0000574#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +0000575 BIO_printf(bio_err," -servername host - servername for HostName TLS extension\n");
Bodo Möller241520e2006-01-11 06:10:40 +0000576 BIO_printf(bio_err," -servername_fatal - on mismatch send fatal alert (default warning alert)\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000577 BIO_printf(bio_err," -cert2 arg - certificate file to use for servername\n");
578 BIO_printf(bio_err," (default is %s)\n",TEST_CERT2);
579 BIO_printf(bio_err," -key2 arg - Private Key file to use for servername, in cert file if\n");
580 BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT2);
Dr. Stephen Hensond24a9c82007-08-23 11:34:48 +0000581 BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n");
582 BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n");
Dr. Stephen Henson2942dde2009-11-11 14:10:24 +0000583 BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
Ben Lauriebf488362010-09-05 17:14:01 +0000584# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000585 BIO_printf(bio_err," -nextprotoneg arg - set the advertised protocols for the NPN extension (comma-separated list)\n");
Ben Lauriebf488362010-09-05 17:14:01 +0000586# endif
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +0000587 BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
Adam Langley6f017a82013-04-15 18:07:47 -0400588 BIO_printf(bio_err," -alpn arg - set the advertised protocols for the ALPN extension (comma-separated list)\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000589#endif
Ben Lauriee0af0402011-11-15 23:50:52 +0000590 BIO_printf(bio_err," -keymatexport label - Export keying material using label\n");
591 BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000592 }
593
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000594static int local_argc=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000595static char **local_argv;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000596
Ulf Möllera53955d1999-06-04 21:35:58 +0000597#ifdef CHARSET_EBCDIC
598static int ebcdic_new(BIO *bi);
599static int ebcdic_free(BIO *a);
600static int ebcdic_read(BIO *b, char *out, int outl);
Bodo Möller0fd05a22002-08-15 14:52:54 +0000601static int ebcdic_write(BIO *b, const char *in, int inl);
602static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
Ulf Möllera53955d1999-06-04 21:35:58 +0000603static int ebcdic_gets(BIO *bp, char *buf, int size);
Bodo Möller0fd05a22002-08-15 14:52:54 +0000604static int ebcdic_puts(BIO *bp, const char *str);
Ulf Möllera53955d1999-06-04 21:35:58 +0000605
606#define BIO_TYPE_EBCDIC_FILTER (18|0x0200)
607static BIO_METHOD methods_ebcdic=
608 {
609 BIO_TYPE_EBCDIC_FILTER,
610 "EBCDIC/ASCII filter",
611 ebcdic_write,
612 ebcdic_read,
613 ebcdic_puts,
614 ebcdic_gets,
615 ebcdic_ctrl,
616 ebcdic_new,
617 ebcdic_free,
618 };
619
620typedef struct
621{
622 size_t alloced;
623 char buff[1];
624} EBCDIC_OUTBUFF;
625
626BIO_METHOD *BIO_f_ebcdic_filter()
627{
628 return(&methods_ebcdic);
629}
630
631static int ebcdic_new(BIO *bi)
632{
633 EBCDIC_OUTBUFF *wbuf;
634
Richard Levitte26a3a482000-06-01 22:19:21 +0000635 wbuf = (EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
Ulf Möllera53955d1999-06-04 21:35:58 +0000636 wbuf->alloced = 1024;
637 wbuf->buff[0] = '\0';
638
639 bi->ptr=(char *)wbuf;
640 bi->init=1;
641 bi->flags=0;
642 return(1);
643}
644
645static int ebcdic_free(BIO *a)
646{
647 if (a == NULL) return(0);
648 if (a->ptr != NULL)
Richard Levitte26a3a482000-06-01 22:19:21 +0000649 OPENSSL_free(a->ptr);
Ulf Möllera53955d1999-06-04 21:35:58 +0000650 a->ptr=NULL;
651 a->init=0;
652 a->flags=0;
653 return(1);
654}
655
656static int ebcdic_read(BIO *b, char *out, int outl)
657{
658 int ret=0;
659
660 if (out == NULL || outl == 0) return(0);
661 if (b->next_bio == NULL) return(0);
662
663 ret=BIO_read(b->next_bio,out,outl);
664 if (ret > 0)
665 ascii2ebcdic(out,out,ret);
666 return(ret);
667}
668
Bodo Möller0fd05a22002-08-15 14:52:54 +0000669static int ebcdic_write(BIO *b, const char *in, int inl)
Ulf Möllera53955d1999-06-04 21:35:58 +0000670{
671 EBCDIC_OUTBUFF *wbuf;
672 int ret=0;
673 int num;
674 unsigned char n;
675
676 if ((in == NULL) || (inl <= 0)) return(0);
677 if (b->next_bio == NULL) return(0);
678
679 wbuf=(EBCDIC_OUTBUFF *)b->ptr;
680
681 if (inl > (num = wbuf->alloced))
682 {
683 num = num + num; /* double the size */
684 if (num < inl)
685 num = inl;
Richard Levitte26a3a482000-06-01 22:19:21 +0000686 OPENSSL_free(wbuf);
687 wbuf=(EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
Ulf Möllera53955d1999-06-04 21:35:58 +0000688
689 wbuf->alloced = num;
690 wbuf->buff[0] = '\0';
691
692 b->ptr=(char *)wbuf;
693 }
694
695 ebcdic2ascii(wbuf->buff, in, inl);
696
697 ret=BIO_write(b->next_bio, wbuf->buff, inl);
698
699 return(ret);
700}
701
Bodo Möller0fd05a22002-08-15 14:52:54 +0000702static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
Ulf Möllera53955d1999-06-04 21:35:58 +0000703{
704 long ret;
705
706 if (b->next_bio == NULL) return(0);
707 switch (cmd)
708 {
709 case BIO_CTRL_DUP:
710 ret=0L;
711 break;
712 default:
713 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
714 break;
715 }
716 return(ret);
717}
718
719static int ebcdic_gets(BIO *bp, char *buf, int size)
720{
Bodo Möller0fd05a22002-08-15 14:52:54 +0000721 int i, ret=0;
Ulf Möllera53955d1999-06-04 21:35:58 +0000722 if (bp->next_bio == NULL) return(0);
723/* return(BIO_gets(bp->next_bio,buf,size));*/
724 for (i=0; i<size-1; ++i)
725 {
726 ret = ebcdic_read(bp,&buf[i],1);
727 if (ret <= 0)
728 break;
729 else if (buf[i] == '\n')
730 {
731 ++i;
732 break;
733 }
734 }
735 if (i < size)
736 buf[i] = '\0';
737 return (ret < 0 && i == 0) ? ret : i;
738}
739
Bodo Möller0fd05a22002-08-15 14:52:54 +0000740static int ebcdic_puts(BIO *bp, const char *str)
Ulf Möllera53955d1999-06-04 21:35:58 +0000741{
742 if (bp->next_bio == NULL) return(0);
743 return ebcdic_write(bp, str, strlen(str));
744}
745#endif
746
Bodo Möllered3883d2006-01-02 23:14:37 +0000747#ifndef OPENSSL_NO_TLSEXT
748
749/* This is a context that we pass to callbacks */
750typedef struct tlsextctx_st {
751 char * servername;
752 BIO * biodebug;
Bodo Möller241520e2006-01-11 06:10:40 +0000753 int extension_error;
Bodo Möllered3883d2006-01-02 23:14:37 +0000754} tlsextctx;
755
756
Bodo Möllerb1277b92006-01-02 23:29:12 +0000757static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
758 {
Bodo Möllered3883d2006-01-02 23:14:37 +0000759 tlsextctx * p = (tlsextctx *) arg;
Bodo Möllerf1fd4542006-01-03 03:27:19 +0000760 const char * servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Bodo Möller1aeb3da2006-01-06 09:08:59 +0000761 if (servername && p->biodebug)
Bodo Möllered3883d2006-01-02 23:14:37 +0000762 BIO_printf(p->biodebug,"Hostname in TLS extension: \"%s\"\n",servername);
763
Bodo Möllerb1277b92006-01-02 23:29:12 +0000764 if (!p->servername)
Bodo Möller241520e2006-01-11 06:10:40 +0000765 return SSL_TLSEXT_ERR_NOACK;
Bodo Möllered3883d2006-01-02 23:14:37 +0000766
Bodo Möllerb1277b92006-01-02 23:29:12 +0000767 if (servername)
768 {
Bodo Möllered3883d2006-01-02 23:14:37 +0000769 if (strcmp(servername,p->servername))
Bodo Möller241520e2006-01-11 06:10:40 +0000770 return p->extension_error;
771 if (ctx2)
772 {
Dr. Stephen Henson8711efb2009-04-20 11:33:12 +0000773 BIO_printf(p->biodebug,"Switching server context.\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000774 SSL_set_SSL_CTX(s,ctx2);
Bodo Möllera13c20f2006-01-09 19:49:05 +0000775 }
Bodo Möllerb1277b92006-01-02 23:29:12 +0000776 }
Bodo Möller241520e2006-01-11 06:10:40 +0000777 return SSL_TLSEXT_ERR_OK;
Bodo Möllered3883d2006-01-02 23:14:37 +0000778}
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000779
780/* Structure passed to cert status callback */
781
782typedef struct tlsextstatusctx_st {
783 /* Default responder to use */
784 char *host, *path, *port;
785 int use_ssl;
786 int timeout;
787 BIO *err;
788 int verbose;
789} tlsextstatusctx;
790
791static tlsextstatusctx tlscstatp = {NULL, NULL, NULL, 0, -1, NULL, 0};
792
793/* Certificate Status callback. This is called when a client includes a
794 * certificate status request extension.
795 *
796 * This is a simplified version. It examines certificates each time and
797 * makes one OCSP responder query for each request.
798 *
799 * A full version would store details such as the OCSP certificate IDs and
800 * minimise the number of OCSP responses by caching them until they were
801 * considered "expired".
802 */
803
804static int cert_status_cb(SSL *s, void *arg)
805 {
806 tlsextstatusctx *srctx = arg;
807 BIO *err = srctx->err;
808 char *host, *port, *path;
809 int use_ssl;
810 unsigned char *rspder = NULL;
811 int rspderlen;
Dr. Stephen Hensonc869da82009-07-27 21:10:00 +0000812 STACK_OF(OPENSSL_STRING) *aia = NULL;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000813 X509 *x = NULL;
814 X509_STORE_CTX inctx;
815 X509_OBJECT obj;
816 OCSP_REQUEST *req = NULL;
817 OCSP_RESPONSE *resp = NULL;
818 OCSP_CERTID *id = NULL;
819 STACK_OF(X509_EXTENSION) *exts;
820 int ret = SSL_TLSEXT_ERR_NOACK;
821 int i;
822#if 0
823STACK_OF(OCSP_RESPID) *ids;
824SSL_get_tlsext_status_ids(s, &ids);
825BIO_printf(err, "cert_status: received %d ids\n", sk_OCSP_RESPID_num(ids));
826#endif
827 if (srctx->verbose)
828 BIO_puts(err, "cert_status: callback called\n");
829 /* Build up OCSP query from server certificate */
830 x = SSL_get_certificate(s);
831 aia = X509_get1_ocsp(x);
832 if (aia)
833 {
Dr. Stephen Hensonc869da82009-07-27 21:10:00 +0000834 if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0),
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000835 &host, &port, &path, &use_ssl))
836 {
837 BIO_puts(err, "cert_status: can't parse AIA URL\n");
838 goto err;
839 }
840 if (srctx->verbose)
841 BIO_printf(err, "cert_status: AIA URL: %s\n",
Dr. Stephen Hensonc869da82009-07-27 21:10:00 +0000842 sk_OPENSSL_STRING_value(aia, 0));
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000843 }
844 else
845 {
846 if (!srctx->host)
847 {
848 BIO_puts(srctx->err, "cert_status: no AIA and no default responder URL\n");
849 goto done;
850 }
851 host = srctx->host;
852 path = srctx->path;
853 port = srctx->port;
854 use_ssl = srctx->use_ssl;
855 }
856
857 if (!X509_STORE_CTX_init(&inctx,
858 SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)),
859 NULL, NULL))
860 goto err;
861 if (X509_STORE_get_by_subject(&inctx,X509_LU_X509,
862 X509_get_issuer_name(x),&obj) <= 0)
863 {
864 BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n");
865 X509_STORE_CTX_cleanup(&inctx);
866 goto done;
867 }
868 req = OCSP_REQUEST_new();
869 if (!req)
870 goto err;
871 id = OCSP_cert_to_id(NULL, x, obj.data.x509);
872 X509_free(obj.data.x509);
873 X509_STORE_CTX_cleanup(&inctx);
874 if (!id)
875 goto err;
876 if (!OCSP_request_add0_id(req, id))
877 goto err;
878 id = NULL;
879 /* Add any extensions to the request */
880 SSL_get_tlsext_status_exts(s, &exts);
881 for (i = 0; i < sk_X509_EXTENSION_num(exts); i++)
882 {
883 X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
884 if (!OCSP_REQUEST_add_ext(req, ext, -1))
885 goto err;
886 }
Dr. Stephen Henson18e503f2009-09-30 21:40:55 +0000887 resp = process_responder(err, req, host, path, port, use_ssl, NULL,
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000888 srctx->timeout);
889 if (!resp)
890 {
891 BIO_puts(err, "cert_status: error querying responder\n");
892 goto done;
893 }
894 rspderlen = i2d_OCSP_RESPONSE(resp, &rspder);
895 if (rspderlen <= 0)
896 goto err;
897 SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen);
898 if (srctx->verbose)
899 {
900 BIO_puts(err, "cert_status: ocsp response sent:\n");
901 OCSP_RESPONSE_print(err, resp, 2);
902 }
903 ret = SSL_TLSEXT_ERR_OK;
904 done:
905 if (ret != SSL_TLSEXT_ERR_OK)
906 ERR_print_errors(err);
907 if (aia)
908 {
909 OPENSSL_free(host);
910 OPENSSL_free(path);
911 OPENSSL_free(port);
912 X509_email_free(aia);
913 }
914 if (id)
915 OCSP_CERTID_free(id);
916 if (req)
917 OCSP_REQUEST_free(req);
918 if (resp)
919 OCSP_RESPONSE_free(resp);
920 return ret;
921 err:
922 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
923 goto done;
924 }
Ben Laurieee2ffc22010-07-28 10:06:55 +0000925
Ben Lauriebf488362010-09-05 17:14:01 +0000926# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000927/* This is the context that we pass to next_proto_cb */
928typedef struct tlsextnextprotoctx_st {
929 unsigned char *data;
930 unsigned int len;
931} tlsextnextprotoctx;
932
933static int next_proto_cb(SSL *s, const unsigned char **data, unsigned int *len, void *arg)
934 {
935 tlsextnextprotoctx *next_proto = arg;
936
937 *data = next_proto->data;
938 *len = next_proto->len;
939
940 return SSL_TLSEXT_ERR_OK;
941 }
Ben Laurie71fa4512012-06-03 22:00:21 +0000942# endif /* ndef OPENSSL_NO_NEXTPROTONEG */
Adam Langley6f017a82013-04-15 18:07:47 -0400943
944/* This the context that we pass to alpn_cb */
945typedef struct tlsextalpnctx_st {
946 unsigned char *data;
947 unsigned short len;
948} tlsextalpnctx;
949
950static int alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
951 {
952 tlsextalpnctx *alpn_ctx = arg;
953
954 if (!s_quiet)
955 {
956 /* We can assume that |in| is syntactically valid. */
957 unsigned i;
958 BIO_printf(bio_s_out, "ALPN protocols advertised by the client: ");
959 for (i = 0; i < inlen; )
960 {
961 if (i)
962 BIO_write(bio_s_out, ", ", 2);
963 BIO_write(bio_s_out, &in[i + 1], in[i]);
964 i += in[i] + 1;
965 }
966 BIO_write(bio_s_out, "\n", 1);
967 }
968
969 if (SSL_select_next_proto((unsigned char**) out, outlen, alpn_ctx->data, alpn_ctx->len, in, inlen) !=
970 OPENSSL_NPN_NEGOTIATED)
971 {
972 return SSL_TLSEXT_ERR_NOACK;
973 }
974
975 if (!s_quiet)
976 {
977 BIO_printf(bio_s_out, "ALPN protocols selected: ");
978 BIO_write(bio_s_out, *out, *outlen);
979 BIO_write(bio_s_out, "\n", 1);
980 }
981
982 return SSL_TLSEXT_ERR_OK;
983 }
984#endif /* ndef OPENSSL_NO_TLSEXT */
Bodo Möllered3883d2006-01-02 23:14:37 +0000985
Bodo Möller7c2d4fe2010-08-26 15:15:47 +0000986static int not_resumable_sess_cb(SSL *s, int is_forward_secure)
987 {
988 /* disable resumption for sessions with forward secure ciphers */
989 return is_forward_secure;
990 }
991
Ralf S. Engelschall667ac4e2000-02-11 09:47:18 +0000992int MAIN(int, char **);
993
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000994#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +0000995static char *jpake_secret = NULL;
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +0000996#define no_jpake !jpake_secret
997#else
998#define no_jpake 1
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +0000999#endif
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00001000#ifndef OPENSSL_NO_SRP
1001 static srpsrvparm srp_callback_parm;
1002#endif
Ben Laurie333f9262011-11-15 22:59:20 +00001003static char *srtp_profiles = NULL;
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001004
Ulf Möller6b691a51999-04-19 21:31:43 +00001005int MAIN(int argc, char *argv[])
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001006 {
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001007 X509_VERIFY_PARAM *vpm = NULL;
1008 int badarg = 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001009 short port=PORT;
1010 char *CApath=NULL,*CAfile=NULL;
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001011 char *chCApath=NULL,*chCAfile=NULL;
1012 char *vfyCApath=NULL,*vfyCAfile=NULL;
Dr. Stephen Henson4e321ff2005-04-26 17:43:53 +00001013 unsigned char *context = NULL;
Dr. Stephen Henson3908cdf1999-10-04 23:56:06 +00001014 char *dhfile = NULL;
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001015 int badop=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001016 int ret=1;
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001017 int build_chain = 0;
Bodo Möllerea262262002-08-09 08:56:08 +00001018 int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001019 int state=0;
Nils Larsch4ebb3422005-08-14 21:48:33 +00001020 const SSL_METHOD *meth=NULL;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001021 int socket_type=SOCK_STREAM;
Richard Levitte5270e702000-10-26 21:07:28 +00001022 ENGINE *e=NULL;
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001023 char *inrand=NULL;
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001024 int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
1025 char *passarg = NULL, *pass = NULL;
1026 char *dpassarg = NULL, *dpass = NULL;
1027 int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
1028 X509 *s_cert = NULL, *s_dcert = NULL;
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001029 STACK_OF(X509) *s_chain = NULL, *s_dchain = NULL;
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001030 EVP_PKEY *s_key = NULL, *s_dkey = NULL;
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00001031 int no_cache = 0, ext_cache = 0;
Dr. Stephen Hensonb5cadfb2012-11-18 15:45:16 +00001032 int rev = 0, naccept = -1;
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +00001033 int sdebug = 0;
Bodo Möllered3883d2006-01-02 23:14:37 +00001034#ifndef OPENSSL_NO_TLSEXT
1035 EVP_PKEY *s_key2 = NULL;
1036 X509 *s_cert2 = NULL;
Bodo Möller241520e2006-01-11 06:10:40 +00001037 tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING};
Ben Lauriebf488362010-09-05 17:14:01 +00001038# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +00001039 const char *next_proto_neg_in = NULL;
Scott Deboyb0d27cb2013-09-11 17:22:00 -07001040 tlsextnextprotoctx next_proto = { NULL, 0};
Piotr Sikora29115752013-11-13 15:20:22 -08001041# endif
Adam Langley6f017a82013-04-15 18:07:47 -04001042 const char *alpn_in = NULL;
1043 tlsextalpnctx alpn_ctx = { NULL, 0};
Bodo Möllered3883d2006-01-02 23:14:37 +00001044#endif
Nils Larschddac1972006-03-10 23:06:27 +00001045#ifndef OPENSSL_NO_PSK
1046 /* by default do not send a PSK identity hint */
1047 static char *psk_identity_hint=NULL;
1048#endif
Ben Laurieedc032b2011-03-12 17:01:19 +00001049#ifndef OPENSSL_NO_SRP
1050 char *srpuserseed = NULL;
1051 char *srp_verifier_file = NULL;
Ben Laurieedc032b2011-03-12 17:01:19 +00001052#endif
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00001053 SSL_EXCERT *exc = NULL;
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001054 SSL_CONF_CTX *cctx = NULL;
1055 STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
Dr. Stephen Hensona70da5b2012-10-08 15:10:07 +00001056
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001057 char *crl_file = NULL;
1058 int crl_format = FORMAT_PEM;
Dr. Stephen Henson60938ae2012-12-12 03:35:31 +00001059 int crl_download = 0;
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001060 STACK_OF(X509_CRL) *crls = NULL;
1061
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001062 meth=SSLv23_server_method();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001063
1064 local_argc=argc;
1065 local_argv=argv;
1066
1067 apps_startup();
Bodo Möllerb74ba291999-09-03 23:08:45 +00001068#ifdef MONOLITH
1069 s_server_init();
1070#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001071
1072 if (bio_err == NULL)
1073 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
1074
Dr. Stephen Henson3647bee2002-02-22 14:01:21 +00001075 if (!load_config(bio_err, NULL))
1076 goto end;
1077
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001078 cctx = SSL_CONF_CTX_new();
1079 if (!cctx)
1080 goto end;
1081 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SERVER);
Dr. Stephen Henson55b66f02012-11-26 12:51:12 +00001082 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001083
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001084 verify_depth=0;
1085#ifdef FIONBIO
1086 s_nbio=0;
1087#endif
1088 s_nbio_test=0;
1089
1090 argc--;
1091 argv++;
1092
1093 while (argc >= 1)
1094 {
1095 if ((strcmp(*argv,"-port") == 0) ||
1096 (strcmp(*argv,"-accept") == 0))
1097 {
1098 if (--argc < 1) goto bad;
1099 if (!extract_port(*(++argv),&port))
1100 goto bad;
1101 }
Dr. Stephen Hensonb5cadfb2012-11-18 15:45:16 +00001102 else if (strcmp(*argv,"-naccept") == 0)
1103 {
1104 if (--argc < 1) goto bad;
1105 naccept = atol(*(++argv));
1106 if (naccept <= 0)
1107 {
1108 BIO_printf(bio_err, "bad accept value %s\n",
1109 *argv);
1110 goto bad;
1111 }
1112 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001113 else if (strcmp(*argv,"-verify") == 0)
1114 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001115 s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001116 if (--argc < 1) goto bad;
1117 verify_depth=atoi(*(++argv));
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +00001118 if (!s_quiet)
1119 BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001120 }
1121 else if (strcmp(*argv,"-Verify") == 0)
1122 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001123 s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001124 SSL_VERIFY_CLIENT_ONCE;
1125 if (--argc < 1) goto bad;
1126 verify_depth=atoi(*(++argv));
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +00001127 if (!s_quiet)
1128 BIO_printf(bio_err,"verify depth is %d, must return a certificate\n",verify_depth);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001129 }
Ben Laurieb4cadc61999-03-22 12:22:14 +00001130 else if (strcmp(*argv,"-context") == 0)
1131 {
1132 if (--argc < 1) goto bad;
Dr. Stephen Henson4e321ff2005-04-26 17:43:53 +00001133 context= (unsigned char *)*(++argv);
Ben Laurieb4cadc61999-03-22 12:22:14 +00001134 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001135 else if (strcmp(*argv,"-cert") == 0)
1136 {
1137 if (--argc < 1) goto bad;
1138 s_cert_file= *(++argv);
1139 }
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001140 else if (strcmp(*argv,"-CRL") == 0)
1141 {
1142 if (--argc < 1) goto bad;
1143 crl_file= *(++argv);
1144 }
Dr. Stephen Henson60938ae2012-12-12 03:35:31 +00001145 else if (strcmp(*argv,"-crl_download") == 0)
1146 crl_download = 1;
Ben Lauriea9e1c502012-05-30 10:10:58 +00001147#ifndef OPENSSL_NO_TLSEXT
Trevora398f822013-05-12 18:55:27 -07001148 else if (strcmp(*argv,"-serverinfo") == 0)
1149 {
1150 if (--argc < 1) goto bad;
1151 s_serverinfo_file = *(++argv);
1152 }
Scott Deboy36086182013-06-18 14:34:38 -07001153 else if (strcmp(*argv,"-auth") == 0)
1154 {
1155 c_auth = 1;
1156 }
Ben Lauriea9e1c502012-05-30 10:10:58 +00001157#endif
Scott Deboy36086182013-06-18 14:34:38 -07001158 else if (strcmp(*argv,"-auth_require_reneg") == 0)
1159 {
1160 c_auth_require_reneg = 1;
1161 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001162 else if (strcmp(*argv,"-certform") == 0)
1163 {
1164 if (--argc < 1) goto bad;
1165 s_cert_format = str2fmt(*(++argv));
1166 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001167 else if (strcmp(*argv,"-key") == 0)
1168 {
1169 if (--argc < 1) goto bad;
1170 s_key_file= *(++argv);
1171 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001172 else if (strcmp(*argv,"-keyform") == 0)
1173 {
1174 if (--argc < 1) goto bad;
1175 s_key_format = str2fmt(*(++argv));
1176 }
1177 else if (strcmp(*argv,"-pass") == 0)
1178 {
1179 if (--argc < 1) goto bad;
1180 passarg = *(++argv);
1181 }
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001182 else if (strcmp(*argv,"-cert_chain") == 0)
1183 {
1184 if (--argc < 1) goto bad;
1185 s_chain_file= *(++argv);
1186 }
Dr. Stephen Henson3908cdf1999-10-04 23:56:06 +00001187 else if (strcmp(*argv,"-dhparam") == 0)
1188 {
1189 if (--argc < 1) goto bad;
1190 dhfile = *(++argv);
1191 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001192 else if (strcmp(*argv,"-dcertform") == 0)
1193 {
1194 if (--argc < 1) goto bad;
1195 s_dcert_format = str2fmt(*(++argv));
1196 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001197 else if (strcmp(*argv,"-dcert") == 0)
1198 {
1199 if (--argc < 1) goto bad;
1200 s_dcert_file= *(++argv);
1201 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001202 else if (strcmp(*argv,"-dkeyform") == 0)
1203 {
1204 if (--argc < 1) goto bad;
1205 s_dkey_format = str2fmt(*(++argv));
1206 }
1207 else if (strcmp(*argv,"-dpass") == 0)
1208 {
1209 if (--argc < 1) goto bad;
1210 dpassarg = *(++argv);
1211 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001212 else if (strcmp(*argv,"-dkey") == 0)
1213 {
1214 if (--argc < 1) goto bad;
1215 s_dkey_file= *(++argv);
1216 }
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001217 else if (strcmp(*argv,"-dcert_chain") == 0)
1218 {
1219 if (--argc < 1) goto bad;
1220 s_dchain_file= *(++argv);
1221 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001222 else if (strcmp(*argv,"-nocert") == 0)
1223 {
1224 nocert=1;
1225 }
1226 else if (strcmp(*argv,"-CApath") == 0)
1227 {
1228 if (--argc < 1) goto bad;
1229 CApath= *(++argv);
1230 }
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001231 else if (strcmp(*argv,"-chainCApath") == 0)
1232 {
1233 if (--argc < 1) goto bad;
1234 chCApath= *(++argv);
1235 }
1236 else if (strcmp(*argv,"-verifyCApath") == 0)
1237 {
1238 if (--argc < 1) goto bad;
1239 vfyCApath= *(++argv);
1240 }
Dr. Stephen Hensond4be9282009-10-28 17:49:30 +00001241 else if (strcmp(*argv,"-no_cache") == 0)
1242 no_cache = 1;
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00001243 else if (strcmp(*argv,"-ext_cache") == 0)
1244 ext_cache = 1;
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001245 else if (strcmp(*argv,"-CRLform") == 0)
1246 {
1247 if (--argc < 1) goto bad;
1248 crl_format = str2fmt(*(++argv));
1249 }
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001250 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
Dr. Stephen Hensonbdee69f2001-05-09 00:30:39 +00001251 {
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001252 if (badarg)
1253 goto bad;
1254 continue;
Dr. Stephen Hensonbdee69f2001-05-09 00:30:39 +00001255 }
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00001256 else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
1257 {
1258 if (badarg)
1259 goto bad;
1260 continue;
1261 }
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001262 else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
1263 {
1264 if (badarg)
1265 goto bad;
1266 continue;
1267 }
Dr. Stephen Henson5d20c4f2006-09-17 17:16:28 +00001268 else if (strcmp(*argv,"-verify_return_error") == 0)
1269 verify_return_error = 1;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00001270 else if (strcmp(*argv,"-verify_quiet") == 0)
1271 verify_quiet = 1;
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001272 else if (strcmp(*argv,"-build_chain") == 0)
1273 build_chain = 1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001274 else if (strcmp(*argv,"-CAfile") == 0)
1275 {
1276 if (--argc < 1) goto bad;
1277 CAfile= *(++argv);
1278 }
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001279 else if (strcmp(*argv,"-chainCAfile") == 0)
1280 {
1281 if (--argc < 1) goto bad;
1282 chCAfile= *(++argv);
1283 }
1284 else if (strcmp(*argv,"-verifyCAfile") == 0)
1285 {
1286 if (--argc < 1) goto bad;
1287 vfyCAfile= *(++argv);
1288 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001289#ifdef FIONBIO
1290 else if (strcmp(*argv,"-nbio") == 0)
1291 { s_nbio=1; }
1292#endif
1293 else if (strcmp(*argv,"-nbio_test") == 0)
1294 {
1295#ifdef FIONBIO
1296 s_nbio=1;
1297#endif
1298 s_nbio_test=1;
1299 }
Dr. Stephen Henson68575592012-11-19 23:41:24 +00001300 else if (strcmp(*argv,"-ign_eof") == 0)
1301 s_ign_eof=1;
1302 else if (strcmp(*argv,"-no_ign_eof") == 0)
1303 s_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001304 else if (strcmp(*argv,"-debug") == 0)
1305 { s_debug=1; }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001306#ifndef OPENSSL_NO_TLSEXT
1307 else if (strcmp(*argv,"-tlsextdebug") == 0)
1308 s_tlsextdebug=1;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00001309 else if (strcmp(*argv,"-status") == 0)
1310 s_tlsextstatus=1;
1311 else if (strcmp(*argv,"-status_verbose") == 0)
1312 {
1313 s_tlsextstatus=1;
1314 tlscstatp.verbose = 1;
1315 }
1316 else if (!strcmp(*argv, "-status_timeout"))
1317 {
1318 s_tlsextstatus=1;
1319 if (--argc < 1) goto bad;
1320 tlscstatp.timeout = atoi(*(++argv));
1321 }
1322 else if (!strcmp(*argv, "-status_url"))
1323 {
1324 s_tlsextstatus=1;
1325 if (--argc < 1) goto bad;
1326 if (!OCSP_parse_url(*(++argv),
1327 &tlscstatp.host,
1328 &tlscstatp.port,
1329 &tlscstatp.path,
1330 &tlscstatp.use_ssl))
1331 {
1332 BIO_printf(bio_err, "Error parsing URL\n");
1333 goto bad;
1334 }
1335 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001336#endif
Bodo Möllera661b652001-10-20 17:56:36 +00001337 else if (strcmp(*argv,"-msg") == 0)
1338 { s_msg=1; }
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00001339 else if (strcmp(*argv,"-msgfile") == 0)
1340 {
1341 if (--argc < 1) goto bad;
1342 bio_s_msg = BIO_new_file(*(++argv), "w");
1343 }
1344#ifndef OPENSSL_NO_SSL_TRACE
1345 else if (strcmp(*argv,"-trace") == 0)
1346 { s_msg=2; }
1347#endif
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +00001348 else if (strcmp(*argv,"-security_debug") == 0)
1349 { sdebug=1; }
1350 else if (strcmp(*argv,"-security_debug_verbose") == 0)
1351 { sdebug=2; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001352 else if (strcmp(*argv,"-hack") == 0)
1353 { hack=1; }
1354 else if (strcmp(*argv,"-state") == 0)
1355 { state=1; }
Bodo Möller1bdb8631999-08-07 02:51:10 +00001356 else if (strcmp(*argv,"-crlf") == 0)
1357 { s_crlf=1; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001358 else if (strcmp(*argv,"-quiet") == 0)
1359 { s_quiet=1; }
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00001360 else if (strcmp(*argv,"-brief") == 0)
1361 {
1362 s_quiet=1;
1363 s_brief=1;
1364 verify_quiet=1;
1365 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001366 else if (strcmp(*argv,"-no_tmp_rsa") == 0)
1367 { no_tmp_rsa=1; }
Bodo Möller50596581999-07-12 17:15:42 +00001368 else if (strcmp(*argv,"-no_dhe") == 0)
1369 { no_dhe=1; }
Bodo Möllerea262262002-08-09 08:56:08 +00001370 else if (strcmp(*argv,"-no_ecdhe") == 0)
1371 { no_ecdhe=1; }
Bodo Möller7c2d4fe2010-08-26 15:15:47 +00001372 else if (strcmp(*argv,"-no_resume_ephemeral") == 0)
1373 { no_resume_ephemeral = 1; }
Nils Larschddac1972006-03-10 23:06:27 +00001374#ifndef OPENSSL_NO_PSK
1375 else if (strcmp(*argv,"-psk_hint") == 0)
1376 {
1377 if (--argc < 1) goto bad;
1378 psk_identity_hint= *(++argv);
1379 }
1380 else if (strcmp(*argv,"-psk") == 0)
1381 {
Nils Larscha0aa8b42006-03-11 12:18:11 +00001382 size_t i;
Nils Larschddac1972006-03-10 23:06:27 +00001383
1384 if (--argc < 1) goto bad;
1385 psk_key=*(++argv);
1386 for (i=0; i<strlen(psk_key); i++)
1387 {
Andy Polyakova50bce82012-01-12 16:21:35 +00001388 if (isxdigit((unsigned char)psk_key[i]))
Nils Larschddac1972006-03-10 23:06:27 +00001389 continue;
1390 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
1391 goto bad;
1392 }
1393 }
1394#endif
Ben Laurieedc032b2011-03-12 17:01:19 +00001395#ifndef OPENSSL_NO_SRP
1396 else if (strcmp(*argv, "-srpvfile") == 0)
1397 {
1398 if (--argc < 1) goto bad;
1399 srp_verifier_file = *(++argv);
1400 meth = TLSv1_server_method();
1401 }
1402 else if (strcmp(*argv, "-srpuserseed") == 0)
1403 {
1404 if (--argc < 1) goto bad;
1405 srpuserseed = *(++argv);
1406 meth = TLSv1_server_method();
1407 }
1408#endif
Dr. Stephen Henson4f3df8b2012-09-14 13:27:05 +00001409 else if (strcmp(*argv,"-rev") == 0)
1410 { rev=1; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001411 else if (strcmp(*argv,"-www") == 0)
1412 { www=1; }
1413 else if (strcmp(*argv,"-WWW") == 0)
1414 { www=2; }
Richard Levitte251cb4c2001-03-10 16:20:52 +00001415 else if (strcmp(*argv,"-HTTP") == 0)
1416 { www=3; }
Richard Levittecf1b7d92001-02-19 16:06:34 +00001417#ifndef OPENSSL_NO_SSL2
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001418 else if (strcmp(*argv,"-ssl2") == 0)
1419 { meth=SSLv2_server_method(); }
1420#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +00001421#ifndef OPENSSL_NO_SSL3
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001422 else if (strcmp(*argv,"-ssl3") == 0)
1423 { meth=SSLv3_server_method(); }
1424#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +00001425#ifndef OPENSSL_NO_TLS1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001426 else if (strcmp(*argv,"-tls1") == 0)
1427 { meth=TLSv1_server_method(); }
Dr. Stephen Hensonf7d2f172010-11-16 14:16:00 +00001428 else if (strcmp(*argv,"-tls1_1") == 0)
1429 { meth=TLSv1_1_server_method(); }
Ben Laurie71fa4512012-06-03 22:00:21 +00001430 else if (strcmp(*argv,"-tls1_2") == 0)
1431 { meth=TLSv1_2_server_method(); }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001432#endif
Ben Laurie36d16f82005-04-26 16:02:40 +00001433#ifndef OPENSSL_NO_DTLS1
Dr. Stephen Hensonc6913ee2013-04-06 15:50:12 +01001434 else if (strcmp(*argv,"-dtls") == 0)
1435 {
1436 meth=DTLS_server_method();
1437 socket_type = SOCK_DGRAM;
1438 }
Ben Laurie36d16f82005-04-26 16:02:40 +00001439 else if (strcmp(*argv,"-dtls1") == 0)
1440 {
1441 meth=DTLSv1_server_method();
Bodo Möllerb1277b92006-01-02 23:29:12 +00001442 socket_type = SOCK_DGRAM;
Ben Laurie36d16f82005-04-26 16:02:40 +00001443 }
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00001444 else if (strcmp(*argv,"-dtls1_2") == 0)
1445 {
1446 meth=DTLSv1_2_server_method();
1447 socket_type = SOCK_DGRAM;
1448 }
Ben Laurie36d16f82005-04-26 16:02:40 +00001449 else if (strcmp(*argv,"-timeout") == 0)
1450 enable_timeouts = 1;
1451 else if (strcmp(*argv,"-mtu") == 0)
1452 {
1453 if (--argc < 1) goto bad;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001454 socket_mtu = atol(*(++argv));
Ben Laurie36d16f82005-04-26 16:02:40 +00001455 }
1456 else if (strcmp(*argv, "-chain") == 0)
1457 cert_chain = 1;
1458#endif
Geoff Thorpe1aa0d942001-02-21 18:38:48 +00001459 else if (strcmp(*argv, "-id_prefix") == 0)
1460 {
1461 if (--argc < 1) goto bad;
1462 session_id_prefix = *(++argv);
1463 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001464#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +00001465 else if (strcmp(*argv,"-engine") == 0)
1466 {
1467 if (--argc < 1) goto bad;
1468 engine_id= *(++argv);
1469 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001470#endif
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001471 else if (strcmp(*argv,"-rand") == 0)
1472 {
1473 if (--argc < 1) goto bad;
1474 inrand= *(++argv);
1475 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001476#ifndef OPENSSL_NO_TLSEXT
1477 else if (strcmp(*argv,"-servername") == 0)
1478 {
1479 if (--argc < 1) goto bad;
1480 tlsextcbp.servername= *(++argv);
Bodo Möllered3883d2006-01-02 23:14:37 +00001481 }
Bodo Möller241520e2006-01-11 06:10:40 +00001482 else if (strcmp(*argv,"-servername_fatal") == 0)
1483 { tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL; }
Bodo Möllered3883d2006-01-02 23:14:37 +00001484 else if (strcmp(*argv,"-cert2") == 0)
1485 {
1486 if (--argc < 1) goto bad;
1487 s_cert_file2= *(++argv);
1488 }
1489 else if (strcmp(*argv,"-key2") == 0)
1490 {
1491 if (--argc < 1) goto bad;
1492 s_key_file2= *(++argv);
1493 }
Ben Lauriebf488362010-09-05 17:14:01 +00001494# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +00001495 else if (strcmp(*argv,"-nextprotoneg") == 0)
1496 {
1497 if (--argc < 1) goto bad;
1498 next_proto_neg_in = *(++argv);
1499 }
Piotr Sikora29115752013-11-13 15:20:22 -08001500# endif
Adam Langley6f017a82013-04-15 18:07:47 -04001501 else if (strcmp(*argv,"-alpn") == 0)
1502 {
1503 if (--argc < 1) goto bad;
1504 alpn_in = *(++argv);
1505 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001506#endif
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001507#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001508 else if (strcmp(*argv,"-jpake") == 0)
1509 {
1510 if (--argc < 1) goto bad;
1511 jpake_secret = *(++argv);
1512 }
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +00001513#endif
Ben Laurie333f9262011-11-15 22:59:20 +00001514 else if (strcmp(*argv,"-use_srtp") == 0)
1515 {
1516 if (--argc < 1) goto bad;
1517 srtp_profiles = *(++argv);
1518 }
Ben Lauriee0af0402011-11-15 23:50:52 +00001519 else if (strcmp(*argv,"-keymatexport") == 0)
1520 {
1521 if (--argc < 1) goto bad;
1522 keymatexportlabel= *(++argv);
1523 }
1524 else if (strcmp(*argv,"-keymatexportlen") == 0)
1525 {
1526 if (--argc < 1) goto bad;
1527 keymatexportlen=atoi(*(++argv));
1528 if (keymatexportlen == 0) goto bad;
1529 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001530 else
1531 {
1532 BIO_printf(bio_err,"unknown option %s\n",*argv);
1533 badop=1;
1534 break;
1535 }
1536 argc--;
1537 argv++;
1538 }
1539 if (badop)
1540 {
1541bad:
1542 sv_usage();
1543 goto end;
1544 }
1545
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001546#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
Ben Laurief3b7bda2008-11-16 12:47:12 +00001547 if (jpake_secret)
1548 {
1549 if (psk_key)
1550 {
1551 BIO_printf(bio_err,
1552 "Can't use JPAKE and PSK together\n");
1553 goto end;
1554 }
1555 psk_identity = "JPAKE";
1556 }
Ben Laurief3b7bda2008-11-16 12:47:12 +00001557#endif
Dr. Stephen Henson2900fc82008-11-30 22:01:31 +00001558
Richard Levittecead7f32002-07-16 06:52:03 +00001559 SSL_load_error_strings();
1560 OpenSSL_add_ssl_algorithms();
1561
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001562#ifndef OPENSSL_NO_ENGINE
Richard Levittecead7f32002-07-16 06:52:03 +00001563 e = setup_engine(bio_err, engine_id, 1);
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001564#endif
Richard Levittecead7f32002-07-16 06:52:03 +00001565
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001566 if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass))
1567 {
1568 BIO_printf(bio_err, "Error getting password\n");
1569 goto end;
1570 }
1571
1572
1573 if (s_key_file == NULL)
1574 s_key_file = s_cert_file;
Bodo Möllered3883d2006-01-02 23:14:37 +00001575#ifndef OPENSSL_NO_TLSEXT
1576 if (s_key_file2 == NULL)
1577 s_key_file2 = s_cert_file2;
1578#endif
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001579
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00001580 if (!load_excert(&exc, bio_err))
1581 goto end;
1582
Nils Larsch33ac8b32005-09-02 12:44:59 +00001583 if (nocert == 0)
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001584 {
Nils Larsch33ac8b32005-09-02 12:44:59 +00001585 s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
1586 "server certificate private key file");
1587 if (!s_key)
1588 {
1589 ERR_print_errors(bio_err);
1590 goto end;
1591 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001592
Nils Larsch33ac8b32005-09-02 12:44:59 +00001593 s_cert = load_cert(bio_err,s_cert_file,s_cert_format,
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001594 NULL, e, "server certificate file");
1595
Nils Larsch33ac8b32005-09-02 12:44:59 +00001596 if (!s_cert)
1597 {
1598 ERR_print_errors(bio_err);
1599 goto end;
1600 }
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001601 if (s_chain_file)
1602 {
1603 s_chain = load_certs(bio_err, s_chain_file,FORMAT_PEM,
1604 NULL, e, "server certificate chain");
1605 if (!s_chain)
1606 goto end;
1607 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001608
1609#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001610 if (tlsextcbp.servername)
Bodo Möllered3883d2006-01-02 23:14:37 +00001611 {
1612 s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
Bodo Möllerb1277b92006-01-02 23:29:12 +00001613 "second server certificate private key file");
Bodo Möllered3883d2006-01-02 23:14:37 +00001614 if (!s_key2)
1615 {
1616 ERR_print_errors(bio_err);
1617 goto end;
1618 }
Bodo Möllerb1277b92006-01-02 23:29:12 +00001619
Bodo Möllered3883d2006-01-02 23:14:37 +00001620 s_cert2 = load_cert(bio_err,s_cert_file2,s_cert_format,
1621 NULL, e, "second server certificate file");
Bodo Möllerb1277b92006-01-02 23:29:12 +00001622
Bodo Möllered3883d2006-01-02 23:14:37 +00001623 if (!s_cert2)
1624 {
1625 ERR_print_errors(bio_err);
1626 goto end;
1627 }
1628 }
Ben Lauriea9e1c502012-05-30 10:10:58 +00001629#endif /* OPENSSL_NO_TLSEXT */
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001630 }
1631
Adam Langley6f017a82013-04-15 18:07:47 -04001632#if !defined(OPENSSL_NO_TLSEXT)
1633# if !defined(OPENSSL_NO_NEXTPROTONEG)
Dr. Stephen Hensondd251652012-07-03 16:37:50 +00001634 if (next_proto_neg_in)
1635 {
1636 unsigned short len;
1637 next_proto.data = next_protos_parse(&len, next_proto_neg_in);
1638 if (next_proto.data == NULL)
1639 goto end;
1640 next_proto.len = len;
1641 }
1642 else
1643 {
1644 next_proto.data = NULL;
1645 }
Adam Langley6f017a82013-04-15 18:07:47 -04001646# endif
1647 alpn_ctx.data = NULL;
1648 if (alpn_in)
1649 {
1650 unsigned short len;
1651 alpn_ctx.data = next_protos_parse(&len, alpn_in);
1652 if (alpn_ctx.data == NULL)
1653 goto end;
1654 alpn_ctx.len = len;
1655 }
Dr. Stephen Hensondd251652012-07-03 16:37:50 +00001656#endif
1657
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001658 if (crl_file)
1659 {
1660 X509_CRL *crl;
1661 crl = load_crl(crl_file, crl_format);
1662 if (!crl)
1663 {
1664 BIO_puts(bio_err, "Error loading CRL\n");
1665 ERR_print_errors(bio_err);
1666 goto end;
1667 }
1668 crls = sk_X509_CRL_new_null();
1669 if (!crls || !sk_X509_CRL_push(crls, crl))
1670 {
1671 BIO_puts(bio_err, "Error adding CRL\n");
1672 ERR_print_errors(bio_err);
1673 X509_CRL_free(crl);
1674 goto end;
1675 }
1676 }
1677
Bodo Möllered3883d2006-01-02 23:14:37 +00001678
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001679 if (s_dcert_file)
1680 {
1681
1682 if (s_dkey_file == NULL)
1683 s_dkey_file = s_dcert_file;
1684
1685 s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
1686 0, dpass, e,
1687 "second certificate private key file");
1688 if (!s_dkey)
1689 {
1690 ERR_print_errors(bio_err);
1691 goto end;
1692 }
1693
1694 s_dcert = load_cert(bio_err,s_dcert_file,s_dcert_format,
1695 NULL, e, "second server certificate file");
1696
1697 if (!s_dcert)
1698 {
1699 ERR_print_errors(bio_err);
1700 goto end;
1701 }
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001702 if (s_dchain_file)
1703 {
1704 s_dchain = load_certs(bio_err, s_dchain_file,FORMAT_PEM,
1705 NULL, e, "second server certificate chain");
1706 if (!s_dchain)
1707 goto end;
1708 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001709
1710 }
1711
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001712 if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1713 && !RAND_status())
1714 {
1715 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1716 }
1717 if (inrand != NULL)
1718 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1719 app_RAND_load_files(inrand));
Bodo Möllera31011e1999-10-26 01:56:29 +00001720
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001721 if (bio_s_out == NULL)
1722 {
Dr. Stephen Henson1740c9f2012-11-21 17:11:42 +00001723 if (s_quiet && !s_debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001724 {
1725 bio_s_out=BIO_new(BIO_s_null());
Dr. Stephen Henson1740c9f2012-11-21 17:11:42 +00001726 if (s_msg && !bio_s_msg)
1727 bio_s_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001728 }
1729 else
1730 {
1731 if (bio_s_out == NULL)
1732 bio_s_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1733 }
1734 }
1735
Bodo Möller4d94ae02002-02-13 18:21:51 +00001736#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001737 if (nocert)
1738#endif
1739 {
1740 s_cert_file=NULL;
1741 s_key_file=NULL;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001742 s_dcert_file=NULL;
1743 s_dkey_file=NULL;
Bodo Möllered3883d2006-01-02 23:14:37 +00001744#ifndef OPENSSL_NO_TLSEXT
1745 s_cert_file2=NULL;
1746 s_key_file2=NULL;
1747#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001748 }
1749
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001750 ctx=SSL_CTX_new(meth);
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +00001751 if (sdebug)
1752 ssl_ctx_security_debug(ctx, bio_err, sdebug);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001753 if (ctx == NULL)
1754 {
1755 ERR_print_errors(bio_err);
1756 goto end;
1757 }
Geoff Thorpe1aa0d942001-02-21 18:38:48 +00001758 if (session_id_prefix)
1759 {
1760 if(strlen(session_id_prefix) >= 32)
1761 BIO_printf(bio_err,
1762"warning: id_prefix is too long, only one new session will be possible\n");
1763 else if(strlen(session_id_prefix) >= 16)
1764 BIO_printf(bio_err,
1765"warning: id_prefix is too long if you use SSLv2\n");
1766 if(!SSL_CTX_set_generate_session_id(ctx, generate_session_id))
1767 {
1768 BIO_printf(bio_err,"error setting 'id_prefix'\n");
1769 ERR_print_errors(bio_err);
1770 goto end;
1771 }
1772 BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1773 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001774 SSL_CTX_set_quiet_shutdown(ctx,1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001775 if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00001776 if (exc) ssl_ctx_set_excert(ctx, exc);
Ben Laurie36d16f82005-04-26 16:02:40 +00001777 /* DTLS: partial reads end up discarding unread UDP bytes :-(
1778 * Setting read ahead solves this problem.
1779 */
Bodo Möllerb1277b92006-01-02 23:29:12 +00001780 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001781
1782 if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
Dr. Stephen Hensond4be9282009-10-28 17:49:30 +00001783 if (no_cache)
1784 SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00001785 else if (ext_cache)
1786 init_session_cache_ctx(ctx);
Dr. Stephen Hensond4be9282009-10-28 17:49:30 +00001787 else
1788 SSL_CTX_sess_set_cache_size(ctx,128);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001789
Ben Laurie333f9262011-11-15 22:59:20 +00001790 if (srtp_profiles != NULL)
1791 SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1792
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001793#if 0
1794 if (cipher == NULL) cipher=getenv("SSL_CIPHER");
1795#endif
1796
1797#if 0
1798 if (s_cert_file == NULL)
1799 {
1800 BIO_printf(bio_err,"You must specify a certificate file for the server to use\n");
1801 goto end;
1802 }
1803#endif
1804
1805 if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1806 (!SSL_CTX_set_default_verify_paths(ctx)))
1807 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001808 /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001809 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001810 /* goto end; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001811 }
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001812 if (vpm)
1813 SSL_CTX_set1_param(ctx, vpm);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001814
Dr. Stephen Henson0090a682012-12-06 18:43:40 +00001815 ssl_ctx_add_crls(ctx, crls, 0);
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +00001816 if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001817 goto end;
1818
Dr. Stephen Henson60938ae2012-12-12 03:35:31 +00001819 if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1820 crls, crl_download))
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001821 {
1822 BIO_printf(bio_err, "Error loading store locations\n");
1823 ERR_print_errors(bio_err);
1824 goto end;
1825 }
1826
Bodo Möllered3883d2006-01-02 23:14:37 +00001827#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001828 if (s_cert2)
Bodo Möllered3883d2006-01-02 23:14:37 +00001829 {
Bodo Möllerb1277b92006-01-02 23:29:12 +00001830 ctx2=SSL_CTX_new(meth);
1831 if (ctx2 == NULL)
Bodo Möllered3883d2006-01-02 23:14:37 +00001832 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001833 ERR_print_errors(bio_err);
1834 goto end;
1835 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001836 }
Bodo Möllerb1277b92006-01-02 23:29:12 +00001837
1838 if (ctx2)
Bodo Möllered3883d2006-01-02 23:14:37 +00001839 {
Bodo Möllerb1277b92006-01-02 23:29:12 +00001840 BIO_printf(bio_s_out,"Setting secondary ctx parameters\n");
Bodo Möllered3883d2006-01-02 23:14:37 +00001841
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +00001842 if (sdebug)
1843 ssl_ctx_security_debug(ctx, bio_err, sdebug);
1844
Bodo Möllerb1277b92006-01-02 23:29:12 +00001845 if (session_id_prefix)
1846 {
1847 if(strlen(session_id_prefix) >= 32)
1848 BIO_printf(bio_err,
1849 "warning: id_prefix is too long, only one new session will be possible\n");
1850 else if(strlen(session_id_prefix) >= 16)
1851 BIO_printf(bio_err,
1852 "warning: id_prefix is too long if you use SSLv2\n");
1853 if(!SSL_CTX_set_generate_session_id(ctx2, generate_session_id))
1854 {
1855 BIO_printf(bio_err,"error setting 'id_prefix'\n");
1856 ERR_print_errors(bio_err);
1857 goto end;
1858 }
1859 BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1860 }
1861 SSL_CTX_set_quiet_shutdown(ctx2,1);
Bodo Möllerb1277b92006-01-02 23:29:12 +00001862 if (hack) SSL_CTX_set_options(ctx2,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00001863 if (exc) ssl_ctx_set_excert(ctx2, exc);
Bodo Möllerb1277b92006-01-02 23:29:12 +00001864 /* DTLS: partial reads end up discarding unread UDP bytes :-(
1865 * Setting read ahead solves this problem.
1866 */
1867 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx2, 1);
1868
1869 if (state) SSL_CTX_set_info_callback(ctx2,apps_ssl_info_callback);
1870
Dr. Stephen Hensond4be9282009-10-28 17:49:30 +00001871 if (no_cache)
1872 SSL_CTX_set_session_cache_mode(ctx2,SSL_SESS_CACHE_OFF);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00001873 else if (ext_cache)
1874 init_session_cache_ctx(ctx2);
Dr. Stephen Hensond4be9282009-10-28 17:49:30 +00001875 else
1876 SSL_CTX_sess_set_cache_size(ctx2,128);
Bodo Möllerb1277b92006-01-02 23:29:12 +00001877
1878 if ((!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) ||
1879 (!SSL_CTX_set_default_verify_paths(ctx2)))
1880 {
1881 ERR_print_errors(bio_err);
1882 }
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001883 if (vpm)
1884 SSL_CTX_set1_param(ctx2, vpm);
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001885
Dr. Stephen Henson0090a682012-12-06 18:43:40 +00001886 ssl_ctx_add_crls(ctx2, crls, 0);
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +00001887 if (!args_ssl_call(ctx2, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001888 goto end;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001889 }
Ben Laurieee2ffc22010-07-28 10:06:55 +00001890
Ben Lauriebf488362010-09-05 17:14:01 +00001891# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +00001892 if (next_proto.data)
1893 SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb, &next_proto);
1894# endif
Adam Langley6f017a82013-04-15 18:07:47 -04001895 if (alpn_ctx.data)
1896 SSL_CTX_set_alpn_select_cb(ctx, alpn_cb, &alpn_ctx);
Bodo Möllered3883d2006-01-02 23:14:37 +00001897#endif
Bodo Möllerb1277b92006-01-02 23:29:12 +00001898
Richard Levittecf1b7d92001-02-19 16:06:34 +00001899#ifndef OPENSSL_NO_DH
Bodo Möller50596581999-07-12 17:15:42 +00001900 if (!no_dhe)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001901 {
Bodo Möller15d52dd2000-11-02 10:35:10 +00001902 DH *dh=NULL;
1903
1904 if (dhfile)
1905 dh = load_dh_param(dhfile);
1906 else if (s_cert_file)
1907 dh = load_dh_param(s_cert_file);
1908
Bodo Möller50596581999-07-12 17:15:42 +00001909 if (dh != NULL)
1910 {
1911 BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1912 }
1913 else
1914 {
1915 BIO_printf(bio_s_out,"Using default temp DH parameters\n");
Bodo Möller50596581999-07-12 17:15:42 +00001916 }
1917 (void)BIO_flush(bio_s_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001918
Dr. Stephen Henson09599b52014-01-22 16:22:48 +00001919 if (dh == NULL)
1920 SSL_CTX_set_dh_auto(ctx, 1);
1921 else if (!SSL_CTX_set_tmp_dh(ctx,dh))
1922 {
1923 BIO_puts(bio_err, "Error setting temp DH parameters\n");
1924 ERR_print_errors(bio_err);
1925 DH_free(dh);
1926 goto end;
1927 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001928#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001929 if (ctx2)
1930 {
1931 if (!dhfile)
1932 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001933 DH *dh2=load_dh_param(s_cert_file2);
1934 if (dh2 != NULL)
Bodo Möllerb1277b92006-01-02 23:29:12 +00001935 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001936 BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1937 (void)BIO_flush(bio_s_out);
1938
1939 DH_free(dh);
1940 dh = dh2;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001941 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001942 }
Dr. Stephen Henson09599b52014-01-22 16:22:48 +00001943 if (dh == NULL)
1944 SSL_CTX_set_dh_auto(ctx2, 1);
1945 else if (!SSL_CTX_set_tmp_dh(ctx2,dh))
1946 {
1947 BIO_puts(bio_err, "Error setting temp DH parameters\n");
1948 ERR_print_errors(bio_err);
1949 DH_free(dh);
1950 goto end;
1951 }
Bodo Möllerb1277b92006-01-02 23:29:12 +00001952 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001953#endif
Bodo Möller50596581999-07-12 17:15:42 +00001954 DH_free(dh);
1955 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001956#endif
Bodo Möllerea262262002-08-09 08:56:08 +00001957
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001958 if (!set_cert_key_stuff(ctx, s_cert, s_key, s_chain, build_chain))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001959 goto end;
Bodo Möllered3883d2006-01-02 23:14:37 +00001960#ifndef OPENSSL_NO_TLSEXT
Trevora398f822013-05-12 18:55:27 -07001961 if (s_serverinfo_file != NULL
1962 && !SSL_CTX_use_serverinfo_file(ctx, s_serverinfo_file))
Ben Laurie9725bda2013-09-24 23:13:22 +01001963 {
1964 ERR_print_errors(bio_err);
Trevora398f822013-05-12 18:55:27 -07001965 goto end;
Ben Laurie9725bda2013-09-24 23:13:22 +01001966 }
Scott Deboy36086182013-06-18 14:34:38 -07001967 if (c_auth)
1968 {
1969 SSL_CTX_set_custom_srv_ext(ctx, TLSEXT_TYPE_client_authz, authz_tlsext_cb, authz_tlsext_generate_cb, bio_err);
1970 SSL_CTX_set_custom_srv_ext(ctx, TLSEXT_TYPE_server_authz, authz_tlsext_cb, authz_tlsext_generate_cb, bio_err);
1971 SSL_CTX_set_srv_supp_data(ctx, TLSEXT_SUPPLEMENTALDATATYPE_authz_data, auth_suppdata_generate_cb, suppdata_cb, bio_err);
1972 }
Ben Lauriea9e1c502012-05-30 10:10:58 +00001973#endif
1974#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001975 if (ctx2 && !set_cert_key_stuff(ctx2,s_cert2,s_key2, NULL, build_chain))
Bodo Möllered3883d2006-01-02 23:14:37 +00001976 goto end;
1977#endif
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001978 if (s_dcert != NULL)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001979 {
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001980 if (!set_cert_key_stuff(ctx, s_dcert, s_dkey, s_dchain, build_chain))
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001981 goto end;
1982 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001983
Richard Levittecf1b7d92001-02-19 16:06:34 +00001984#ifndef OPENSSL_NO_RSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001985#if 1
Bodo Möllerb1277b92006-01-02 23:29:12 +00001986 if (!no_tmp_rsa)
1987 {
Bodo Möllerff055b52001-02-20 12:59:48 +00001988 SSL_CTX_set_tmp_rsa_callback(ctx,tmp_rsa_cb);
Bodo Möllered3883d2006-01-02 23:14:37 +00001989#ifndef OPENSSL_NO_TLSEXT
1990 if (ctx2)
1991 SSL_CTX_set_tmp_rsa_callback(ctx2,tmp_rsa_cb);
1992#endif
Bodo Möllerb1277b92006-01-02 23:29:12 +00001993 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001994#else
1995 if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx))
1996 {
1997 RSA *rsa;
1998
1999 BIO_printf(bio_s_out,"Generating temp (512 bit) RSA key...");
2000 BIO_flush(bio_s_out);
2001
2002 rsa=RSA_generate_key(512,RSA_F4,NULL);
2003
2004 if (!SSL_CTX_set_tmp_rsa(ctx,rsa))
2005 {
2006 ERR_print_errors(bio_err);
2007 goto end;
2008 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002009#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00002010 if (ctx2)
Bodo Möllered3883d2006-01-02 23:14:37 +00002011 {
Bodo Möllerb1277b92006-01-02 23:29:12 +00002012 if (!SSL_CTX_set_tmp_rsa(ctx2,rsa))
2013 {
Bodo Möllered3883d2006-01-02 23:14:37 +00002014 ERR_print_errors(bio_err);
2015 goto end;
Bodo Möllerb1277b92006-01-02 23:29:12 +00002016 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002017 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002018#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002019 RSA_free(rsa);
2020 BIO_printf(bio_s_out,"\n");
2021 }
2022#endif
Ulf Möllerf5d7a031999-04-27 01:14:46 +00002023#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002024
Bodo Möller7c2d4fe2010-08-26 15:15:47 +00002025 if (no_resume_ephemeral)
2026 {
2027 SSL_CTX_set_not_resumable_session_callback(ctx, not_resumable_sess_cb);
2028#ifndef OPENSSL_NO_TLSEXT
2029 if (ctx2)
2030 SSL_CTX_set_not_resumable_session_callback(ctx2, not_resumable_sess_cb);
2031#endif
2032 }
2033
Nils Larschddac1972006-03-10 23:06:27 +00002034#ifndef OPENSSL_NO_PSK
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00002035#ifdef OPENSSL_NO_JPAKE
2036 if (psk_key != NULL)
2037#else
Ben Laurief3b7bda2008-11-16 12:47:12 +00002038 if (psk_key != NULL || jpake_secret)
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00002039#endif
Nils Larschddac1972006-03-10 23:06:27 +00002040 {
2041 if (s_debug)
Ben Laurief3b7bda2008-11-16 12:47:12 +00002042 BIO_printf(bio_s_out, "PSK key given or JPAKE in use, setting server callback\n");
Nils Larschddac1972006-03-10 23:06:27 +00002043 SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
2044 }
2045
2046 if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint))
2047 {
2048 BIO_printf(bio_err,"error setting PSK identity hint to context\n");
2049 ERR_print_errors(bio_err);
2050 goto end;
2051 }
2052#endif
2053
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002054 SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
Bodo Möllerb56bce41999-05-13 15:09:38 +00002055 SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,
2056 sizeof s_server_session_id_context);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002057
Dr. Stephen Henson07a9d1a2009-09-04 17:42:53 +00002058 /* Set DTLS cookie generation and verification callbacks */
2059 SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback);
2060 SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback);
2061
Bodo Möllered3883d2006-01-02 23:14:37 +00002062#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00002063 if (ctx2)
2064 {
Bodo Möllered3883d2006-01-02 23:14:37 +00002065 SSL_CTX_set_verify(ctx2,s_server_verify,verify_callback);
2066 SSL_CTX_set_session_id_context(ctx2,(void*)&s_server_session_id_context,
2067 sizeof s_server_session_id_context);
2068
Bodo Möllerf1fd4542006-01-03 03:27:19 +00002069 tlsextcbp.biodebug = bio_s_out;
2070 SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
2071 SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
2072 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
2073 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
Bodo Möllerb1277b92006-01-02 23:29:12 +00002074 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002075#endif
Bodo Möllerf1fd4542006-01-03 03:27:19 +00002076
Ben Laurieedc032b2011-03-12 17:01:19 +00002077#ifndef OPENSSL_NO_SRP
2078 if (srp_verifier_file != NULL)
2079 {
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002080 srp_callback_parm.vb = SRP_VBASE_new(srpuserseed);
2081 srp_callback_parm.user = NULL;
2082 srp_callback_parm.login = NULL;
2083 if ((ret = SRP_VBASE_init(srp_callback_parm.vb, srp_verifier_file)) != SRP_NO_ERROR)
Ben Laurieedc032b2011-03-12 17:01:19 +00002084 {
2085 BIO_printf(bio_err,
Ben Laurie71fa4512012-06-03 22:00:21 +00002086 "Cannot initialize SRP verifier file \"%s\":ret=%d\n",
2087 srp_verifier_file, ret);
Ben Laurieedc032b2011-03-12 17:01:19 +00002088 goto end;
2089 }
2090 SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE,verify_callback);
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002091 SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm);
Ben Laurieedc032b2011-03-12 17:01:19 +00002092 SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb);
2093 }
2094 else
2095#endif
Bodo Möllerb1277b92006-01-02 23:29:12 +00002096 if (CAfile != NULL)
2097 {
2098 SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
Bodo Möllered3883d2006-01-02 23:14:37 +00002099#ifndef OPENSSL_NO_TLSEXT
2100 if (ctx2)
Bodo Möllerb1277b92006-01-02 23:29:12 +00002101 SSL_CTX_set_client_CA_list(ctx2,SSL_load_client_CA_file(CAfile));
Bodo Möllered3883d2006-01-02 23:14:37 +00002102#endif
Bodo Möllerb1277b92006-01-02 23:29:12 +00002103 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002104
2105 BIO_printf(bio_s_out,"ACCEPT\n");
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00002106 (void)BIO_flush(bio_s_out);
Dr. Stephen Henson4f3df8b2012-09-14 13:27:05 +00002107 if (rev)
Dr. Stephen Hensonb5cadfb2012-11-18 15:45:16 +00002108 do_server(port,socket_type,&accept_socket,rev_body, context, naccept);
Dr. Stephen Henson4f3df8b2012-09-14 13:27:05 +00002109 else if (www)
Dr. Stephen Hensonb5cadfb2012-11-18 15:45:16 +00002110 do_server(port,socket_type,&accept_socket,www_body, context, naccept);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002111 else
Dr. Stephen Hensonb5cadfb2012-11-18 15:45:16 +00002112 do_server(port,socket_type,&accept_socket,sv_body, context, naccept);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002113 print_stats(bio_s_out,ctx);
2114 ret=0;
2115end:
2116 if (ctx != NULL) SSL_CTX_free(ctx);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002117 if (s_cert)
2118 X509_free(s_cert);
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00002119 if (crls)
2120 sk_X509_CRL_pop_free(crls, X509_CRL_free);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002121 if (s_dcert)
2122 X509_free(s_dcert);
2123 if (s_key)
2124 EVP_PKEY_free(s_key);
2125 if (s_dkey)
2126 EVP_PKEY_free(s_dkey);
Dr. Stephen Henson147d4c92012-09-09 21:19:32 +00002127 if (s_chain)
2128 sk_X509_pop_free(s_chain, X509_free);
2129 if (s_dchain)
2130 sk_X509_pop_free(s_dchain, X509_free);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002131 if (pass)
2132 OPENSSL_free(pass);
2133 if (dpass)
2134 OPENSSL_free(dpass);
Dr. Stephen Henson22b5d7c2012-11-20 00:24:52 +00002135 if (vpm)
2136 X509_VERIFY_PARAM_free(vpm);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00002137 free_sessions();
Bodo Möllered3883d2006-01-02 23:14:37 +00002138#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Henson0a17b8d2012-09-11 13:43:57 +00002139 if (tlscstatp.host)
2140 OPENSSL_free(tlscstatp.host);
2141 if (tlscstatp.port)
2142 OPENSSL_free(tlscstatp.port);
2143 if (tlscstatp.path)
2144 OPENSSL_free(tlscstatp.path);
Bodo Möllered3883d2006-01-02 23:14:37 +00002145 if (ctx2 != NULL) SSL_CTX_free(ctx2);
2146 if (s_cert2)
2147 X509_free(s_cert2);
2148 if (s_key2)
2149 EVP_PKEY_free(s_key2);
Trevora398f822013-05-12 18:55:27 -07002150 if (serverinfo_in != NULL)
2151 BIO_free(serverinfo_in);
Piotr Sikora29115752013-11-13 15:20:22 -08002152# ifndef OPENSSL_NO_NEXTPROTONEG
Adam Langley6f017a82013-04-15 18:07:47 -04002153 if (next_proto.data)
2154 OPENSSL_free(next_proto.data);
Piotr Sikora29115752013-11-13 15:20:22 -08002155# endif
Adam Langley6f017a82013-04-15 18:07:47 -04002156 if (alpn_ctx.data)
2157 OPENSSL_free(alpn_ctx.data);
Bodo Möllered3883d2006-01-02 23:14:37 +00002158#endif
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00002159 ssl_excert_free(exc);
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00002160 if (ssl_args)
2161 sk_OPENSSL_STRING_free(ssl_args);
2162 if (cctx)
2163 SSL_CONF_CTX_free(cctx);
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +00002164#ifndef OPENSSL_NO_JPAKE
2165 if (jpake_secret && psk_key)
2166 OPENSSL_free(psk_key);
2167#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002168 if (bio_s_out != NULL)
2169 {
Dr. Stephen Henson89a5e2f2012-12-26 19:12:57 +00002170 BIO_free(bio_s_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002171 bio_s_out=NULL;
2172 }
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00002173 if (bio_s_msg != NULL)
2174 {
2175 BIO_free(bio_s_msg);
2176 bio_s_msg = NULL;
2177 }
Richard Levittec04f8cf2001-06-23 16:37:32 +00002178 apps_shutdown();
Richard Levitte1c3e4a32002-12-03 16:33:03 +00002179 OPENSSL_EXIT(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002180 }
2181
Ulf Möller6b691a51999-04-19 21:31:43 +00002182static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002183 {
2184 BIO_printf(bio,"%4ld items in the session cache\n",
2185 SSL_CTX_sess_number(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002186 BIO_printf(bio,"%4ld client connects (SSL_connect())\n",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002187 SSL_CTX_sess_connect(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002188 BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002189 SSL_CTX_sess_connect_renegotiate(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002190 BIO_printf(bio,"%4ld client connects that finished\n",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002191 SSL_CTX_sess_connect_good(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002192 BIO_printf(bio,"%4ld server accepts (SSL_accept())\n",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002193 SSL_CTX_sess_accept(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002194 BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002195 SSL_CTX_sess_accept_renegotiate(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002196 BIO_printf(bio,"%4ld server accepts that finished\n",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002197 SSL_CTX_sess_accept_good(ssl_ctx));
Richard Levitte3ae70932003-04-03 23:39:48 +00002198 BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
2199 BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
2200 BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
2201 BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
2202 BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002203 SSL_CTX_sess_cache_full(ssl_ctx),
2204 SSL_CTX_sess_get_cache_size(ssl_ctx));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002205 }
2206
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00002207static int sv_body(char *hostname, int s, int stype, unsigned char *context)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002208 {
2209 char *buf=NULL;
2210 fd_set readfds;
2211 int ret=1,width;
2212 int k,i;
2213 unsigned long l;
2214 SSL *con=NULL;
2215 BIO *sbio;
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002216#ifndef OPENSSL_NO_KRB5
2217 KSSL_CTX *kctx;
2218#endif
Dr. Stephen Hensonba4526e2009-08-18 11:15:33 +00002219 struct timeval timeout;
Ulf Möller4700aea2006-04-11 21:34:21 +00002220#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002221 struct timeval tv;
Dr. Stephen Hensonba4526e2009-08-18 11:15:33 +00002222#else
2223 struct timeval *timeoutp;
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002224#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002225
Richard Levitte26a3a482000-06-01 22:19:21 +00002226 if ((buf=OPENSSL_malloc(bufsize)) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002227 {
2228 BIO_printf(bio_err,"out of memory\n");
2229 goto err;
2230 }
2231#ifdef FIONBIO
2232 if (s_nbio)
2233 {
2234 unsigned long sl=1;
2235
2236 if (!s_quiet)
2237 BIO_printf(bio_err,"turning on non blocking io\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002238 if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
2239 ERR_print_errors(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002240 }
2241#endif
2242
Ben Laurieb4cadc61999-03-22 12:22:14 +00002243 if (con == NULL) {
Dr. Stephen Henson82fc1d92000-02-03 02:56:48 +00002244 con=SSL_new(ctx);
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002245#ifndef OPENSSL_NO_TLSEXT
2246 if (s_tlsextdebug)
2247 {
2248 SSL_set_tlsext_debug_callback(con, tlsext_cb);
2249 SSL_set_tlsext_debug_arg(con, bio_s_out);
2250 }
Dr. Stephen Hensonb7fcc082007-09-28 17:18:18 +00002251 if (s_tlsextstatus)
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00002252 {
2253 SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb);
2254 tlscstatp.err = bio_err;
2255 SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp);
2256 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002257#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +00002258#ifndef OPENSSL_NO_KRB5
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002259 if ((kctx = kssl_ctx_new()) != NULL)
Richard Levittef9b3bff2000-11-30 22:53:34 +00002260 {
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002261 SSL_set0_kssl_ctx(con, kctx);
2262 kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
2263 kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
Richard Levittef9b3bff2000-11-30 22:53:34 +00002264 }
Richard Levittecf1b7d92001-02-19 16:06:34 +00002265#endif /* OPENSSL_NO_KRB5 */
Ben Laurieb4cadc61999-03-22 12:22:14 +00002266 if(context)
Ben Laurie61f5b6f1999-04-23 15:01:15 +00002267 SSL_set_session_id_context(con, context,
2268 strlen((char *)context));
Ben Laurieb4cadc61999-03-22 12:22:14 +00002269 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002270 SSL_clear(con);
Bodo Möller761772d2007-09-21 06:54:24 +00002271#if 0
2272#ifdef TLSEXT_TYPE_opaque_prf_input
Bodo Möller86d4bc32007-09-23 11:08:59 +00002273 SSL_set_tlsext_opaque_prf_input(con, "Test server", 11);
Bodo Möller761772d2007-09-21 06:54:24 +00002274#endif
2275#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002276
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00002277 if (stype == SOCK_DGRAM)
Ben Laurie36d16f82005-04-26 16:02:40 +00002278 {
Ben Laurie36d16f82005-04-26 16:02:40 +00002279
2280 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
2281
Bodo Möllerb1277b92006-01-02 23:29:12 +00002282 if (enable_timeouts)
Ben Laurie36d16f82005-04-26 16:02:40 +00002283 {
2284 timeout.tv_sec = 0;
2285 timeout.tv_usec = DGRAM_RCV_TIMEOUT;
2286 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
2287
2288 timeout.tv_sec = 0;
2289 timeout.tv_usec = DGRAM_SND_TIMEOUT;
2290 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
2291 }
2292
Dr. Stephen Henson046f2102009-05-17 16:04:58 +00002293 if (socket_mtu > 28)
Ben Laurie36d16f82005-04-26 16:02:40 +00002294 {
2295 SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
Dr. Stephen Henson046f2102009-05-17 16:04:58 +00002296 SSL_set_mtu(con, socket_mtu - 28);
Ben Laurie36d16f82005-04-26 16:02:40 +00002297 }
2298 else
2299 /* want to do MTU discovery */
2300 BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
2301
2302 /* turn on cookie exchange */
2303 SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
2304 }
2305 else
2306 sbio=BIO_new_socket(s,BIO_NOCLOSE);
2307
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002308 if (s_nbio_test)
2309 {
2310 BIO *test;
2311
2312 test=BIO_new(BIO_f_nbio_test());
2313 sbio=BIO_push(test,sbio);
2314 }
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00002315#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +00002316 if(jpake_secret)
2317 jpake_server_auth(bio_s_out, sbio, jpake_secret);
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +00002318#endif
Ben Laurie6caa4ed2008-10-26 18:40:52 +00002319
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002320 SSL_set_bio(con,sbio,sbio);
2321 SSL_set_accept_state(con);
2322 /* SSL_set_fd(con,s); */
2323
2324 if (s_debug)
2325 {
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00002326 SSL_set_debug(con, 1);
Richard Levitte25495642004-08-12 08:58:55 +00002327 BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
Nils Larsch7806f3d2006-11-29 20:54:57 +00002328 BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002329 }
Bodo Möllera661b652001-10-20 17:56:36 +00002330 if (s_msg)
2331 {
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00002332#ifndef OPENSSL_NO_SSL_TRACE
2333 if (s_msg == 2)
2334 SSL_set_msg_callback(con, SSL_trace);
2335 else
2336#endif
2337 SSL_set_msg_callback(con, msg_cb);
2338 SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
Bodo Möllera661b652001-10-20 17:56:36 +00002339 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002340#ifndef OPENSSL_NO_TLSEXT
2341 if (s_tlsextdebug)
2342 {
2343 SSL_set_tlsext_debug_callback(con, tlsext_cb);
2344 SSL_set_tlsext_debug_arg(con, bio_s_out);
2345 }
2346#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002347
2348 width=s+1;
2349 for (;;)
2350 {
Bodo Möllera2a01582000-02-21 17:09:54 +00002351 int read_from_terminal;
2352 int read_from_sslcon;
2353
2354 read_from_terminal = 0;
2355 read_from_sslcon = SSL_pending(con);
2356
2357 if (!read_from_sslcon)
2358 {
2359 FD_ZERO(&readfds);
Ulf Möller4700aea2006-04-11 21:34:21 +00002360#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00002361 openssl_fdset(fileno(stdin),&readfds);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002362#endif
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00002363 openssl_fdset(s,&readfds);
Bodo Möllera2a01582000-02-21 17:09:54 +00002364 /* Note: under VMS with SOCKETSHR the second parameter is
2365 * currently of type (int *) whereas under other systems
2366 * it is (void *) if you don't have a cast it will choke
2367 * the compiler: if you do have a cast then you can either
2368 * go for (int *) or (void *).
2369 */
Richard Levitte4d8743f2003-11-28 13:10:58 +00002370#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
Richard Levitte3d7c4a52003-09-27 21:56:08 +00002371 /* Under DOS (non-djgpp) and Windows we can't select on stdin: only
Bodo Möllera2a01582000-02-21 17:09:54 +00002372 * on sockets. As a workaround we timeout the select every
2373 * second and check for any keypress. In a proper Windows
2374 * application we wouldn't do this because it is inefficient.
2375 */
2376 tv.tv_sec = 1;
2377 tv.tv_usec = 0;
2378 i=select(width,(void *)&readfds,NULL,NULL,&tv);
2379 if((i < 0) || (!i && !_kbhit() ) )continue;
2380 if(_kbhit())
2381 read_from_terminal = 1;
Ulf Möller4700aea2006-04-11 21:34:21 +00002382#elif defined(OPENSSL_SYS_BEOS_R5)
2383 /* Under BeOS-R5 the situation is similar to DOS */
2384 tv.tv_sec = 1;
2385 tv.tv_usec = 0;
2386 (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
2387 i=select(width,(void *)&readfds,NULL,NULL,&tv);
2388 if ((i < 0) || (!i && read(fileno(stdin), buf, 0) < 0))
2389 continue;
2390 if (read(fileno(stdin), buf, 0) >= 0)
2391 read_from_terminal = 1;
2392 (void)fcntl(fileno(stdin), F_SETFL, 0);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002393#else
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00002394 if ((SSL_version(con) == DTLS1_VERSION) &&
2395 DTLSv1_get_timeout(con, &timeout))
2396 timeoutp = &timeout;
2397 else
2398 timeoutp = NULL;
2399
2400 i=select(width,(void *)&readfds,NULL,NULL,timeoutp);
2401
2402 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
2403 {
Veres Lajos478b50c2013-06-13 00:22:32 +01002404 BIO_printf(bio_err,"TIMEOUT occurred\n");
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00002405 }
2406
Bodo Möllera2a01582000-02-21 17:09:54 +00002407 if (i <= 0) continue;
2408 if (FD_ISSET(fileno(stdin),&readfds))
2409 read_from_terminal = 1;
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002410#endif
Bodo Möllera2a01582000-02-21 17:09:54 +00002411 if (FD_ISSET(s,&readfds))
2412 read_from_sslcon = 1;
2413 }
2414 if (read_from_terminal)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002415 {
Bodo Möller1bdb8631999-08-07 02:51:10 +00002416 if (s_crlf)
2417 {
2418 int j, lf_num;
2419
Andy Polyakovffa10182005-11-04 09:30:55 +00002420 i=raw_read_stdin(buf, bufsize/2);
Bodo Möller1bdb8631999-08-07 02:51:10 +00002421 lf_num = 0;
2422 /* both loops are skipped when i <= 0 */
2423 for (j = 0; j < i; j++)
2424 if (buf[j] == '\n')
2425 lf_num++;
2426 for (j = i-1; j >= 0; j--)
2427 {
2428 buf[j+lf_num] = buf[j];
2429 if (buf[j] == '\n')
2430 {
2431 lf_num--;
2432 i++;
2433 buf[j+lf_num] = '\r';
2434 }
2435 }
2436 assert(lf_num == 0);
2437 }
2438 else
Andy Polyakovffa10182005-11-04 09:30:55 +00002439 i=raw_read_stdin(buf,bufsize);
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00002440 if (!s_quiet && !s_brief)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002441 {
2442 if ((i <= 0) || (buf[0] == 'Q'))
2443 {
2444 BIO_printf(bio_s_out,"DONE\n");
2445 SHUTDOWN(s);
2446 close_accept_socket();
2447 ret= -11;
2448 goto err;
2449 }
2450 if ((i <= 0) || (buf[0] == 'q'))
2451 {
2452 BIO_printf(bio_s_out,"DONE\n");
Ben Laurie36d16f82005-04-26 16:02:40 +00002453 if (SSL_version(con) != DTLS1_VERSION)
2454 SHUTDOWN(s);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002455 /* close_accept_socket();
2456 ret= -11;*/
2457 goto err;
2458 }
Bodo Möllera13c20f2006-01-09 19:49:05 +00002459
Dr. Stephen Henson48175042011-12-31 22:59:57 +00002460#ifndef OPENSSL_NO_HEARTBEATS
2461 if ((buf[0] == 'B') &&
2462 ((buf[1] == '\n') || (buf[1] == '\r')))
2463 {
2464 BIO_printf(bio_err,"HEARTBEATING\n");
2465 SSL_heartbeat(con);
2466 i=0;
2467 continue;
2468 }
2469#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002470 if ((buf[0] == 'r') &&
2471 ((buf[1] == '\n') || (buf[1] == '\r')))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002472 {
2473 SSL_renegotiate(con);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002474 i=SSL_do_handshake(con);
2475 printf("SSL_do_handshake -> %d\n",i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002476 i=0; /*13; */
2477 continue;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002478 /* strcpy(buf,"server side RE-NEGOTIATE\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002479 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002480 if ((buf[0] == 'R') &&
Ben Lauriec13d4791999-01-07 00:16:37 +00002481 ((buf[1] == '\n') || (buf[1] == '\r')))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002482 {
2483 SSL_set_verify(con,
2484 SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
2485 SSL_renegotiate(con);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002486 i=SSL_do_handshake(con);
2487 printf("SSL_do_handshake -> %d\n",i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002488 i=0; /* 13; */
2489 continue;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002490 /* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002491 }
2492 if (buf[0] == 'P')
2493 {
Nils Larsch7d727232005-04-05 19:11:19 +00002494 static const char *str="Lets print some clear text\n";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002495 BIO_write(SSL_get_wbio(con),str,strlen(str));
2496 }
2497 if (buf[0] == 'S')
2498 {
2499 print_stats(bio_s_out,SSL_get_SSL_CTX(con));
2500 }
2501 }
Ulf Möllera53955d1999-06-04 21:35:58 +00002502#ifdef CHARSET_EBCDIC
2503 ebcdic2ascii(buf,buf,i);
2504#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002505 l=k=0;
2506 for (;;)
2507 {
2508 /* should do a select for the write */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002509#ifdef RENEG
2510{ static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002511#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002512 k=SSL_write(con,&(buf[l]),(unsigned int)i);
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002513#ifndef OPENSSL_NO_SRP
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002514 while (SSL_get_error(con,k) == SSL_ERROR_WANT_X509_LOOKUP)
2515 {
2516 BIO_printf(bio_s_out,"LOOKUP renego during write\n");
2517 srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2518 if (srp_callback_parm.user)
2519 BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2520 else
2521 BIO_printf(bio_s_out,"LOOKUP not successful\n");
2522 k=SSL_write(con,&(buf[l]),(unsigned int)i);
2523 }
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002524#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002525 switch (SSL_get_error(con,k))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002526 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002527 case SSL_ERROR_NONE:
2528 break;
2529 case SSL_ERROR_WANT_WRITE:
2530 case SSL_ERROR_WANT_READ:
2531 case SSL_ERROR_WANT_X509_LOOKUP:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002532 BIO_printf(bio_s_out,"Write BLOCK\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002533 break;
2534 case SSL_ERROR_SYSCALL:
2535 case SSL_ERROR_SSL:
2536 BIO_printf(bio_s_out,"ERROR\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002537 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002538 ret=1;
2539 goto err;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002540 /* break; */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002541 case SSL_ERROR_ZERO_RETURN:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002542 BIO_printf(bio_s_out,"DONE\n");
2543 ret=1;
2544 goto err;
2545 }
2546 l+=k;
2547 i-=k;
2548 if (i <= 0) break;
2549 }
2550 }
Bodo Möllera2a01582000-02-21 17:09:54 +00002551 if (read_from_sslcon)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002552 {
2553 if (!SSL_is_init_finished(con))
2554 {
2555 i=init_ssl_connection(con);
2556
2557 if (i < 0)
2558 {
2559 ret=0;
2560 goto err;
2561 }
2562 else if (i == 0)
2563 {
2564 ret=1;
2565 goto err;
2566 }
2567 }
2568 else
2569 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002570again:
2571 i=SSL_read(con,(char *)buf,bufsize);
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002572#ifndef OPENSSL_NO_SRP
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002573 while (SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2574 {
2575 BIO_printf(bio_s_out,"LOOKUP renego during read\n");
2576 srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2577 if (srp_callback_parm.user)
2578 BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2579 else
2580 BIO_printf(bio_s_out,"LOOKUP not successful\n");
2581 i=SSL_read(con,(char *)buf,bufsize);
2582 }
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002583#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002584 switch (SSL_get_error(con,i))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002585 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002586 case SSL_ERROR_NONE:
Ulf Möllera53955d1999-06-04 21:35:58 +00002587#ifdef CHARSET_EBCDIC
2588 ascii2ebcdic(buf,buf,i);
2589#endif
Andy Polyakovffa10182005-11-04 09:30:55 +00002590 raw_write_stdout(buf,
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002591 (unsigned int)i);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002592 if (SSL_pending(con)) goto again;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002593 break;
2594 case SSL_ERROR_WANT_WRITE:
2595 case SSL_ERROR_WANT_READ:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002596 BIO_printf(bio_s_out,"Read BLOCK\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002597 break;
2598 case SSL_ERROR_SYSCALL:
2599 case SSL_ERROR_SSL:
2600 BIO_printf(bio_s_out,"ERROR\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002601 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002602 ret=1;
2603 goto err;
2604 case SSL_ERROR_ZERO_RETURN:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002605 BIO_printf(bio_s_out,"DONE\n");
2606 ret=1;
2607 goto err;
2608 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002609 }
2610 }
2611 }
2612err:
Nils Larschd916ba12006-03-18 14:24:02 +00002613 if (con != NULL)
2614 {
2615 BIO_printf(bio_s_out,"shutting down SSL\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002616#if 1
Nils Larschd916ba12006-03-18 14:24:02 +00002617 SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002618#else
Nils Larschd916ba12006-03-18 14:24:02 +00002619 SSL_shutdown(con);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002620#endif
Nils Larschd916ba12006-03-18 14:24:02 +00002621 SSL_free(con);
2622 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002623 BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
2624 if (buf != NULL)
2625 {
Richard Levitte45799242002-11-28 08:04:36 +00002626 OPENSSL_cleanse(buf,bufsize);
Richard Levitte26a3a482000-06-01 22:19:21 +00002627 OPENSSL_free(buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002628 }
2629 if (ret >= 0)
2630 BIO_printf(bio_s_out,"ACCEPT\n");
2631 return(ret);
2632 }
2633
Ulf Möller6b691a51999-04-19 21:31:43 +00002634static void close_accept_socket(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002635 {
2636 BIO_printf(bio_err,"shutdown accept socket\n");
2637 if (accept_socket >= 0)
2638 {
2639 SHUTDOWN2(accept_socket);
2640 }
2641 }
2642
Ulf Möller6b691a51999-04-19 21:31:43 +00002643static int init_ssl_connection(SSL *con)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002644 {
2645 int i;
Ben Lauriee7788021999-04-17 21:25:43 +00002646 const char *str;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002647 X509 *peer;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002648 long verify_error;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002649 MS_STATIC char buf[BUFSIZ];
Ben Laurie71fa4512012-06-03 22:00:21 +00002650#ifndef OPENSSL_NO_KRB5
2651 char *client_princ;
2652#endif
Ben Lauriebf488362010-09-05 17:14:01 +00002653#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00002654 const unsigned char *next_proto_neg;
2655 unsigned next_proto_neg_len;
2656#endif
Ben Lauriee0af0402011-11-15 23:50:52 +00002657 unsigned char *exportedkeymat;
2658
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002659
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002660 i=SSL_accept(con);
Dr. Stephen Henson33233142014-01-26 00:51:09 +00002661#ifdef CERT_CB_TEST_RETRY
2662 {
2663 while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP && SSL_state(con) == SSL3_ST_SR_CLNT_HELLO_C)
2664 {
2665 fprintf(stderr, "LOOKUP from certificate callback during accept\n");
2666 i=SSL_accept(con);
2667 }
2668 }
2669#endif
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002670#ifndef OPENSSL_NO_SRP
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002671 while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2672 {
2673 BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login);
2674 srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2675 if (srp_callback_parm.user)
2676 BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2677 else
2678 BIO_printf(bio_s_out,"LOOKUP not successful\n");
2679 i=SSL_accept(con);
2680 }
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002681#endif
Scott Deboy67c408c2013-08-01 11:54:09 -07002682 /*handshake is complete - free the generated supp data allocated in the callback */
2683 if (generated_supp_data)
2684 {
2685 OPENSSL_free(generated_supp_data);
2686 generated_supp_data = NULL;
2687 }
2688
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002689 if (i <= 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002690 {
2691 if (BIO_sock_should_retry(i))
2692 {
2693 BIO_printf(bio_s_out,"DELAY\n");
2694 return(1);
2695 }
2696
2697 BIO_printf(bio_err,"ERROR\n");
2698 verify_error=SSL_get_verify_result(con);
2699 if (verify_error != X509_V_OK)
2700 {
2701 BIO_printf(bio_err,"verify error:%s\n",
2702 X509_verify_cert_error_string(verify_error));
2703 }
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +00002704 /* Always print any error messages */
2705 ERR_print_errors(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002706 return(0);
2707 }
2708
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00002709 if (s_brief)
2710 print_ssl_summary(bio_err, con);
2711
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002712 PEM_write_bio_SSL_SESSION(bio_s_out,SSL_get_session(con));
2713
2714 peer=SSL_get_peer_certificate(con);
2715 if (peer != NULL)
2716 {
2717 BIO_printf(bio_s_out,"Client certificate\n");
2718 PEM_write_bio_X509(bio_s_out,peer);
Ben Laurie54a656e2002-11-13 15:43:43 +00002719 X509_NAME_oneline(X509_get_subject_name(peer),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002720 BIO_printf(bio_s_out,"subject=%s\n",buf);
Ben Laurie54a656e2002-11-13 15:43:43 +00002721 X509_NAME_oneline(X509_get_issuer_name(peer),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002722 BIO_printf(bio_s_out,"issuer=%s\n",buf);
2723 X509_free(peer);
2724 }
2725
Ben Laurie54a656e2002-11-13 15:43:43 +00002726 if (SSL_get_shared_ciphers(con,buf,sizeof buf) != NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002727 BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf);
2728 str=SSL_CIPHER_get_name(SSL_get_current_cipher(con));
Dr. Stephen Henson9f27b1e2012-07-08 14:22:45 +00002729 ssl_print_sigalgs(bio_s_out, con);
Dr. Stephen Henson14536c82013-08-17 17:40:08 +01002730#ifndef OPENSSL_NO_EC
Dr. Stephen Henson20b431e2012-11-22 15:20:53 +00002731 ssl_print_point_formats(bio_s_out, con);
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00002732 ssl_print_curves(bio_s_out, con, 0);
Dr. Stephen Henson14536c82013-08-17 17:40:08 +01002733#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002734 BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)");
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00002735
Ben Lauriebf488362010-09-05 17:14:01 +00002736#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00002737 SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len);
2738 if (next_proto_neg)
2739 {
2740 BIO_printf(bio_s_out,"NEXTPROTO is ");
2741 BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len);
2742 BIO_printf(bio_s_out, "\n");
2743 }
2744#endif
Ben Laurie333f9262011-11-15 22:59:20 +00002745 {
2746 SRTP_PROTECTION_PROFILE *srtp_profile
2747 = SSL_get_selected_srtp_profile(con);
2748
2749 if(srtp_profile)
2750 BIO_printf(bio_s_out,"SRTP Extension negotiated, profile=%s\n",
2751 srtp_profile->name);
2752 }
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00002753 if (SSL_cache_hit(con)) BIO_printf(bio_s_out,"Reused session-id\n");
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002754 if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
2755 TLS1_FLAGS_TLS_PADDING_BUG)
Ben Laurie333f9262011-11-15 22:59:20 +00002756 BIO_printf(bio_s_out,
2757 "Peer has incorrect TLSv1 block padding\n");
Richard Levitte253e8932003-09-27 17:55:13 +00002758#ifndef OPENSSL_NO_KRB5
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002759 client_princ = kssl_ctx_get0_client_princ(SSL_get0_kssl_ctx(con));
2760 if (client_princ != NULL)
Richard Levitte253e8932003-09-27 17:55:13 +00002761 {
2762 BIO_printf(bio_s_out,"Kerberos peer principal is %s\n",
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002763 client_princ);
Richard Levitte253e8932003-09-27 17:55:13 +00002764 }
2765#endif /* OPENSSL_NO_KRB5 */
Dr. Stephen Henson54302002009-12-08 13:42:08 +00002766 BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n",
2767 SSL_get_secure_renegotiation_support(con) ? "" : " NOT");
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002768 if (keymatexportlabel != NULL)
2769 {
2770 BIO_printf(bio_s_out, "Keying material exporter:\n");
2771 BIO_printf(bio_s_out, " Label: '%s'\n", keymatexportlabel);
2772 BIO_printf(bio_s_out, " Length: %i bytes\n",
Ben Lauriee0af0402011-11-15 23:50:52 +00002773 keymatexportlen);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002774 exportedkeymat = OPENSSL_malloc(keymatexportlen);
2775 if (exportedkeymat != NULL)
2776 {
2777 if (!SSL_export_keying_material(con, exportedkeymat,
2778 keymatexportlen,
2779 keymatexportlabel,
2780 strlen(keymatexportlabel),
2781 NULL, 0, 0))
2782 {
2783 BIO_printf(bio_s_out, " Error\n");
2784 }
2785 else
2786 {
2787 BIO_printf(bio_s_out, " Keying material: ");
2788 for (i=0; i<keymatexportlen; i++)
2789 BIO_printf(bio_s_out, "%02X",
Ben Lauriee0af0402011-11-15 23:50:52 +00002790 exportedkeymat[i]);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002791 BIO_printf(bio_s_out, "\n");
2792 }
2793 OPENSSL_free(exportedkeymat);
2794 }
2795 }
Ben Lauriee0af0402011-11-15 23:50:52 +00002796
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002797 return(1);
2798 }
2799
Richard Levittecf1b7d92001-02-19 16:06:34 +00002800#ifndef OPENSSL_NO_DH
Nils Larscheb3eab22005-04-07 22:48:33 +00002801static DH *load_dh_param(const char *dhfile)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002802 {
2803 DH *ret=NULL;
2804 BIO *bio;
2805
Ben Lauriee9ad6662005-04-23 06:05:24 +00002806 if ((bio=BIO_new_file(dhfile,"r")) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002807 goto err;
Bodo Möller74678cc1999-07-21 20:57:16 +00002808 ret=PEM_read_bio_DHparams(bio,NULL,NULL,NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002809err:
2810 if (bio != NULL) BIO_free(bio);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002811 return(ret);
2812 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002813#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002814
2815#if 0
Ulf Möller6b691a51999-04-19 21:31:43 +00002816static int load_CA(SSL_CTX *ctx, char *file)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002817 {
2818 FILE *in;
2819 X509 *x=NULL;
2820
2821 if ((in=fopen(file,"r")) == NULL)
2822 return(0);
2823
2824 for (;;)
2825 {
2826 if (PEM_read_X509(in,&x,NULL) == NULL)
2827 break;
2828 SSL_CTX_add_client_CA(ctx,x);
2829 }
2830 if (x != NULL) X509_free(x);
2831 fclose(in);
2832 return(1);
2833 }
2834#endif
2835
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00002836static int www_body(char *hostname, int s, int stype, unsigned char *context)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002837 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002838 char *buf=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002839 int ret=1;
Ben Lauriec8bbd982010-06-12 14:13:23 +00002840 int i,j,k,dot;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002841 SSL *con;
Ben Lauriebabb3792008-10-12 14:32:47 +00002842 const SSL_CIPHER *c;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002843 BIO *io,*ssl_bio,*sbio;
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002844#ifndef OPENSSL_NO_KRB5
2845 KSSL_CTX *kctx;
2846#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002847
Richard Levitte26a3a482000-06-01 22:19:21 +00002848 buf=OPENSSL_malloc(bufsize);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002849 if (buf == NULL) return(0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002850 io=BIO_new(BIO_f_buffer());
2851 ssl_bio=BIO_new(BIO_f_ssl());
2852 if ((io == NULL) || (ssl_bio == NULL)) goto err;
2853
2854#ifdef FIONBIO
2855 if (s_nbio)
2856 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002857 unsigned long sl=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002858
2859 if (!s_quiet)
2860 BIO_printf(bio_err,"turning on non blocking io\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002861 if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
2862 ERR_print_errors(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002863 }
2864#endif
2865
2866 /* lets make the output buffer a reasonable size */
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002867 if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002868
Dr. Stephen Henson82fc1d92000-02-03 02:56:48 +00002869 if ((con=SSL_new(ctx)) == NULL) goto err;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002870#ifndef OPENSSL_NO_TLSEXT
2871 if (s_tlsextdebug)
2872 {
2873 SSL_set_tlsext_debug_callback(con, tlsext_cb);
2874 SSL_set_tlsext_debug_arg(con, bio_s_out);
2875 }
2876#endif
Richard Levitte2a1ef752001-07-09 21:46:58 +00002877#ifndef OPENSSL_NO_KRB5
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002878 if ((kctx = kssl_ctx_new()) != NULL)
Richard Levitte2a1ef752001-07-09 21:46:58 +00002879 {
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00002880 kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
2881 kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
Richard Levitte2a1ef752001-07-09 21:46:58 +00002882 }
2883#endif /* OPENSSL_NO_KRB5 */
Ben Laurie61f5b6f1999-04-23 15:01:15 +00002884 if(context) SSL_set_session_id_context(con, context,
2885 strlen((char *)context));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002886
2887 sbio=BIO_new_socket(s,BIO_NOCLOSE);
2888 if (s_nbio_test)
2889 {
2890 BIO *test;
2891
2892 test=BIO_new(BIO_f_nbio_test());
2893 sbio=BIO_push(test,sbio);
2894 }
2895 SSL_set_bio(con,sbio,sbio);
2896 SSL_set_accept_state(con);
Ben Laurie71fa4512012-06-03 22:00:21 +00002897
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002898 /* SSL_set_fd(con,s); */
2899 BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
2900 BIO_push(io,ssl_bio);
Ulf Möllera53955d1999-06-04 21:35:58 +00002901#ifdef CHARSET_EBCDIC
2902 io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
2903#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002904
2905 if (s_debug)
2906 {
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00002907 SSL_set_debug(con, 1);
Richard Levitte25495642004-08-12 08:58:55 +00002908 BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
Nils Larsch7806f3d2006-11-29 20:54:57 +00002909 BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002910 }
Bodo Möllera661b652001-10-20 17:56:36 +00002911 if (s_msg)
2912 {
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00002913#ifndef OPENSSL_NO_SSL_TRACE
2914 if (s_msg == 2)
2915 SSL_set_msg_callback(con, SSL_trace);
2916 else
2917#endif
2918 SSL_set_msg_callback(con, msg_cb);
2919 SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
Bodo Möllera661b652001-10-20 17:56:36 +00002920 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002921
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002922 for (;;)
2923 {
2924 if (hack)
2925 {
2926 i=SSL_accept(con);
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002927#ifndef OPENSSL_NO_SRP
Dr. Stephen Hensonc79f22c2011-12-27 14:21:45 +00002928 while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2929 {
2930 BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login);
2931 srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2932 if (srp_callback_parm.user)
2933 BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2934 else
2935 BIO_printf(bio_s_out,"LOOKUP not successful\n");
2936 i=SSL_accept(con);
2937 }
Dr. Stephen Henson9641be22012-02-10 19:43:14 +00002938#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002939 switch (SSL_get_error(con,i))
2940 {
2941 case SSL_ERROR_NONE:
2942 break;
2943 case SSL_ERROR_WANT_WRITE:
2944 case SSL_ERROR_WANT_READ:
2945 case SSL_ERROR_WANT_X509_LOOKUP:
2946 continue;
2947 case SSL_ERROR_SYSCALL:
2948 case SSL_ERROR_SSL:
2949 case SSL_ERROR_ZERO_RETURN:
2950 ret=1;
2951 goto err;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002952 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002953 }
2954
2955 SSL_renegotiate(con);
2956 SSL_write(con,NULL,0);
2957 }
2958
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002959 i=BIO_gets(io,buf,bufsize-1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002960 if (i < 0) /* error */
2961 {
2962 if (!BIO_should_retry(io))
2963 {
2964 if (!s_quiet)
2965 ERR_print_errors(bio_err);
2966 goto err;
2967 }
2968 else
2969 {
2970 BIO_printf(bio_s_out,"read R BLOCK\n");
Richard Levitte4d8743f2003-11-28 13:10:58 +00002971#if defined(OPENSSL_SYS_NETWARE)
2972 delay(1000);
2973#elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002974 sleep(1);
2975#endif
2976 continue;
2977 }
2978 }
2979 else if (i == 0) /* end of input */
2980 {
2981 ret=1;
2982 goto end;
2983 }
2984
Dr. Stephen Hensonc2963f52010-01-27 17:49:33 +00002985 /* else we have data */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002986 if ( ((www == 1) && (strncmp("GET ",buf,4) == 0)) ||
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002987 ((www == 2) && (strncmp("GET /stats ",buf,10) == 0)))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002988 {
2989 char *p;
2990 X509 *peer;
Ben Laurief73e07c1999-04-12 17:23:57 +00002991 STACK_OF(SSL_CIPHER) *sk;
Nils Larsch7d727232005-04-05 19:11:19 +00002992 static const char *space=" ";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002993
Dr. Stephen Henson08c23972010-01-28 19:48:36 +00002994 if (www == 1 && strncmp("GET /reneg", buf, 10) == 0)
2995 {
2996 if (strncmp("GET /renegcert", buf, 14) == 0)
2997 SSL_set_verify(con,
2998 SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
2999 i=SSL_renegotiate(con);
3000 BIO_printf(bio_s_out, "SSL_renegotiate -> %d\n",i);
3001 i=SSL_do_handshake(con);
3002 if (i <= 0)
3003 {
3004 BIO_printf(bio_s_out, "SSL_do_handshake() Retval %d\n", SSL_get_error(con, i));
3005 ERR_print_errors(bio_err);
3006 goto err;
3007 }
3008 /* EVIL HACK! */
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00003009 SSL_set_state(con, SSL_ST_ACCEPT);
Dr. Stephen Henson08c23972010-01-28 19:48:36 +00003010 i=SSL_do_handshake(con);
3011 BIO_printf(bio_s_out, "SSL_do_handshake -> %d\n",i);
3012 if (i <= 0)
3013 {
3014 BIO_printf(bio_s_out, "SSL_do_handshake() Retval %d\n", SSL_get_error(con, i));
3015 ERR_print_errors(bio_err);
3016 goto err;
3017 }
3018 }
3019
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003020 BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
Ulf Möllera53955d1999-06-04 21:35:58 +00003021 BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003022 BIO_puts(io,"<pre>\n");
3023/* BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
3024 BIO_puts(io,"\n");
3025 for (i=0; i<local_argc; i++)
3026 {
3027 BIO_puts(io,local_argv[i]);
3028 BIO_write(io," ",1);
3029 }
3030 BIO_puts(io,"\n");
3031
Dr. Stephen Henson08c23972010-01-28 19:48:36 +00003032 BIO_printf(io,
3033 "Secure Renegotiation IS%s supported\n",
3034 SSL_get_secure_renegotiation_support(con) ?
3035 "" : " NOT");
3036
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003037 /* The following is evil and should not really
3038 * be done */
3039 BIO_printf(io,"Ciphers supported in s_server binary\n");
3040 sk=SSL_get_ciphers(con);
Ben Laurief73e07c1999-04-12 17:23:57 +00003041 j=sk_SSL_CIPHER_num(sk);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003042 for (i=0; i<j; i++)
3043 {
Ben Laurief73e07c1999-04-12 17:23:57 +00003044 c=sk_SSL_CIPHER_value(sk,i);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003045 BIO_printf(io,"%-11s:%-25s",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003046 SSL_CIPHER_get_version(c),
3047 SSL_CIPHER_get_name(c));
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003048 if ((((i+1)%2) == 0) && (i+1 != j))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003049 BIO_puts(io,"\n");
3050 }
3051 BIO_puts(io,"\n");
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00003052 p=SSL_get_shared_ciphers(con,buf,bufsize);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003053 if (p != NULL)
3054 {
3055 BIO_printf(io,"---\nCiphers common between both SSL end points:\n");
3056 j=i=0;
3057 while (*p)
3058 {
3059 if (*p == ':')
3060 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003061 BIO_write(io,space,26-j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003062 i++;
3063 j=0;
3064 BIO_write(io,((i%3)?" ":"\n"),1);
3065 }
3066 else
3067 {
3068 BIO_write(io,p,1);
3069 j++;
3070 }
3071 p++;
3072 }
3073 BIO_puts(io,"\n");
3074 }
Dr. Stephen Henson9f27b1e2012-07-08 14:22:45 +00003075 ssl_print_sigalgs(io, con);
Dr. Stephen Henson14536c82013-08-17 17:40:08 +01003076#ifndef OPENSSL_NO_EC
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00003077 ssl_print_curves(io, con, 0);
Dr. Stephen Henson14536c82013-08-17 17:40:08 +01003078#endif
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00003079 BIO_printf(io,(SSL_cache_hit(con)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003080 ?"---\nReused, "
3081 :"---\nNew, "));
3082 c=SSL_get_current_cipher(con);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003083 BIO_printf(io,"%s, Cipher is %s\n",
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003084 SSL_CIPHER_get_version(c),
3085 SSL_CIPHER_get_name(c));
3086 SSL_SESSION_print(io,SSL_get_session(con));
3087 BIO_printf(io,"---\n");
3088 print_stats(io,SSL_get_SSL_CTX(con));
3089 BIO_printf(io,"---\n");
3090 peer=SSL_get_peer_certificate(con);
3091 if (peer != NULL)
3092 {
3093 BIO_printf(io,"Client certificate\n");
3094 X509_print(io,peer);
3095 PEM_write_bio_X509(io,peer);
3096 }
3097 else
3098 BIO_puts(io,"no client certificate available\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003099 BIO_puts(io,"</BODY></HTML>\r\n\r\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003100 break;
3101 }
Richard Levitte251cb4c2001-03-10 16:20:52 +00003102 else if ((www == 2 || www == 3)
3103 && (strncmp("GET /",buf,5) == 0))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003104 {
3105 BIO *file;
3106 char *p,*e;
Nils Larsch7d727232005-04-05 19:11:19 +00003107 static const char *text="HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003108
3109 /* skip the '/' */
3110 p= &(buf[5]);
Bodo Möller5d3ab9b2001-03-30 10:47:21 +00003111
3112 dot = 1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003113 for (e=p; *e != '\0'; e++)
3114 {
Bodo Möller5d3ab9b2001-03-30 10:47:21 +00003115 if (e[0] == ' ')
3116 break;
3117
3118 switch (dot)
3119 {
Bodo Möller5d3ab9b2001-03-30 10:47:21 +00003120 case 1:
3121 dot = (e[0] == '.') ? 2 : 0;
3122 break;
3123 case 2:
3124 dot = (e[0] == '.') ? 3 : 0;
3125 break;
3126 case 3:
3127 dot = (e[0] == '/') ? -1 : 0;
3128 break;
3129 }
Bodo Möllerb10ae322001-03-30 14:55:50 +00003130 if (dot == 0)
3131 dot = (e[0] == '/') ? 1 : 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003132 }
Bodo Möller5d3ab9b2001-03-30 10:47:21 +00003133 dot = (dot == 3) || (dot == -1); /* filename contains ".." component */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003134
3135 if (*e == '\0')
3136 {
3137 BIO_puts(io,text);
3138 BIO_printf(io,"'%s' is an invalid file name\r\n",p);
3139 break;
3140 }
3141 *e='\0';
3142
3143 if (dot)
3144 {
3145 BIO_puts(io,text);
3146 BIO_printf(io,"'%s' contains '..' reference\r\n",p);
3147 break;
3148 }
3149
3150 if (*p == '/')
3151 {
3152 BIO_puts(io,text);
3153 BIO_printf(io,"'%s' is an invalid path\r\n",p);
3154 break;
3155 }
3156
Bodo Möller50b8ba02001-03-31 07:48:07 +00003157#if 0
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003158 /* append if a directory lookup */
3159 if (e[-1] == '/')
3160 strcat(p,"index.html");
Bodo Möller50b8ba02001-03-31 07:48:07 +00003161#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003162
3163 /* if a directory, do the index thang */
Andy Polyakovffa10182005-11-04 09:30:55 +00003164 if (app_isdir(p)>0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003165 {
Bodo Möller50b8ba02001-03-31 07:48:07 +00003166#if 0 /* must check buffer size */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003167 strcat(p,"/index.html");
Bodo Möller50b8ba02001-03-31 07:48:07 +00003168#else
3169 BIO_puts(io,text);
3170 BIO_printf(io,"'%s' is a directory\r\n",p);
3171 break;
3172#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003173 }
3174
3175 if ((file=BIO_new_file(p,"r")) == NULL)
3176 {
3177 BIO_puts(io,text);
3178 BIO_printf(io,"Error opening '%s'\r\n",p);
3179 ERR_print_errors(io);
3180 break;
3181 }
3182
3183 if (!s_quiet)
3184 BIO_printf(bio_err,"FILE:%s\n",p);
3185
Richard Levitte251cb4c2001-03-10 16:20:52 +00003186 if (www == 2)
3187 {
3188 i=strlen(p);
3189 if ( ((i > 5) && (strcmp(&(p[i-5]),".html") == 0)) ||
3190 ((i > 4) && (strcmp(&(p[i-4]),".php") == 0)) ||
3191 ((i > 4) && (strcmp(&(p[i-4]),".htm") == 0)))
3192 BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
3193 else
3194 BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
3195 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003196 /* send the file */
3197 for (;;)
3198 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00003199 i=BIO_read(file,buf,bufsize);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003200 if (i <= 0) break;
3201
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00003202#ifdef RENEG
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003203 total_bytes+=i;
3204 fprintf(stderr,"%d\n",i);
3205 if (total_bytes > 3*1024)
3206 {
3207 total_bytes=0;
3208 fprintf(stderr,"RENEGOTIATE\n");
3209 SSL_renegotiate(con);
3210 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00003211#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003212
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003213 for (j=0; j<i; )
3214 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003215#ifdef RENEG
3216{ static count=0; if (++count == 13) { SSL_renegotiate(con); } }
3217#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003218 k=BIO_write(io,&(buf[j]),i-j);
3219 if (k <= 0)
3220 {
3221 if (!BIO_should_retry(io))
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003222 goto write_error;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003223 else
3224 {
3225 BIO_printf(bio_s_out,"rwrite W BLOCK\n");
3226 }
3227 }
3228 else
3229 {
3230 j+=k;
3231 }
3232 }
3233 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003234write_error:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003235 BIO_free(file);
3236 break;
3237 }
3238 }
3239
3240 for (;;)
3241 {
3242 i=(int)BIO_flush(io);
3243 if (i <= 0)
3244 {
3245 if (!BIO_should_retry(io))
3246 break;
3247 }
3248 else
3249 break;
3250 }
3251end:
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003252#if 1
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003253 /* make sure we re-use sessions */
3254 SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
3255#else
Ulf Möller657e60f2000-02-03 23:23:24 +00003256 /* This kills performance */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003257/* SSL_shutdown(con); A shutdown gets sent in the
3258 * BIO_free_all(io) procession */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003259#endif
3260
3261err:
Dr. Stephen Hensonc2963f52010-01-27 17:49:33 +00003262
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003263 if (ret >= 0)
3264 BIO_printf(bio_s_out,"ACCEPT\n");
3265
Richard Levitte26a3a482000-06-01 22:19:21 +00003266 if (buf != NULL) OPENSSL_free(buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003267 if (io != NULL) BIO_free_all(io);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003268/* if (ssl_bio != NULL) BIO_free(ssl_bio);*/
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003269 return(ret);
3270 }
3271
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00003272static int rev_body(char *hostname, int s, int stype, unsigned char *context)
Dr. Stephen Henson4f3df8b2012-09-14 13:27:05 +00003273 {
3274 char *buf=NULL;
3275 int i;
3276 int ret=1;
3277 SSL *con;
3278 BIO *io,*ssl_bio,*sbio;
3279#ifndef OPENSSL_NO_KRB5
3280 KSSL_CTX *kctx;
3281#endif
3282
3283 buf=OPENSSL_malloc(bufsize);
3284 if (buf == NULL) return(0);
3285 io=BIO_new(BIO_f_buffer());
3286 ssl_bio=BIO_new(BIO_f_ssl());
3287 if ((io == NULL) || (ssl_bio == NULL)) goto err;
3288
3289 /* lets make the output buffer a reasonable size */
3290 if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
3291
3292 if ((con=SSL_new(ctx)) == NULL) goto err;
3293#ifndef OPENSSL_NO_TLSEXT
3294 if (s_tlsextdebug)
3295 {
3296 SSL_set_tlsext_debug_callback(con, tlsext_cb);
3297 SSL_set_tlsext_debug_arg(con, bio_s_out);
3298 }
3299#endif
3300#ifndef OPENSSL_NO_KRB5
3301 if ((kctx = kssl_ctx_new()) != NULL)
3302 {
3303 kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
3304 kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
3305 }
3306#endif /* OPENSSL_NO_KRB5 */
3307 if(context) SSL_set_session_id_context(con, context,
3308 strlen((char *)context));
3309
3310 sbio=BIO_new_socket(s,BIO_NOCLOSE);
3311 SSL_set_bio(con,sbio,sbio);
3312 SSL_set_accept_state(con);
3313
3314 BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
3315 BIO_push(io,ssl_bio);
3316#ifdef CHARSET_EBCDIC
3317 io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
3318#endif
3319
3320 if (s_debug)
3321 {
3322 SSL_set_debug(con, 1);
3323 BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
3324 BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
3325 }
3326 if (s_msg)
3327 {
3328#ifndef OPENSSL_NO_SSL_TRACE
3329 if (s_msg == 2)
3330 SSL_set_msg_callback(con, SSL_trace);
3331 else
3332#endif
3333 SSL_set_msg_callback(con, msg_cb);
3334 SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
3335 }
3336
3337 for (;;)
3338 {
3339 i = BIO_do_handshake(io);
3340 if (i > 0)
3341 break;
3342 if (!BIO_should_retry(io))
3343 {
3344 BIO_puts(bio_err, "CONNECTION FAILURE\n");
3345 ERR_print_errors(bio_err);
3346 goto end;
3347 }
3348 }
3349 BIO_printf(bio_err, "CONNECTION ESTABLISHED\n");
3350 print_ssl_summary(bio_err, con);
3351
3352 for (;;)
3353 {
3354 i=BIO_gets(io,buf,bufsize-1);
3355 if (i < 0) /* error */
3356 {
3357 if (!BIO_should_retry(io))
3358 {
3359 if (!s_quiet)
3360 ERR_print_errors(bio_err);
3361 goto err;
3362 }
3363 else
3364 {
3365 BIO_printf(bio_s_out,"read R BLOCK\n");
3366#if defined(OPENSSL_SYS_NETWARE)
3367 delay(1000);
3368#elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
3369 sleep(1);
3370#endif
3371 continue;
3372 }
3373 }
3374 else if (i == 0) /* end of input */
3375 {
3376 ret=1;
3377 BIO_printf(bio_err, "CONNECTION CLOSED\n");
3378 goto end;
3379 }
3380 else
3381 {
3382 char *p = buf + i - 1;
3383 while(i && (*p == '\n' || *p == '\r'))
3384 {
3385 p--;
3386 i--;
3387 }
Dr. Stephen Henson68575592012-11-19 23:41:24 +00003388 if (!s_ign_eof && i == 5 && !strncmp(buf, "CLOSE", 5))
3389 {
3390 ret = 1;
3391 BIO_printf(bio_err, "CONNECTION CLOSED\n");
3392 goto end;
3393 }
Dr. Stephen Henson4f3df8b2012-09-14 13:27:05 +00003394 BUF_reverse((unsigned char *)buf, NULL, i);
3395 buf[i] = '\n';
3396 BIO_write(io, buf, i + 1);
3397 for (;;)
3398 {
3399 i = BIO_flush(io);
3400 if (i > 0)
3401 break;
3402 if (!BIO_should_retry(io))
3403 goto end;
3404 }
3405 }
3406 }
3407end:
3408 /* make sure we re-use sessions */
3409 SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
3410
3411err:
3412
3413 if (buf != NULL) OPENSSL_free(buf);
3414 if (io != NULL) BIO_free_all(io);
3415 return(ret);
3416 }
3417
Richard Levittecf1b7d92001-02-19 16:06:34 +00003418#ifndef OPENSSL_NO_RSA
Ulf Möllerdf63a381999-06-09 16:33:18 +00003419static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003420 {
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003421 BIGNUM *bn = NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003422 static RSA *rsa_tmp=NULL;
3423
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003424 if (!rsa_tmp && ((bn = BN_new()) == NULL))
3425 BIO_printf(bio_err,"Allocation error in generating RSA key\n");
3426 if (!rsa_tmp && bn)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003427 {
3428 if (!s_quiet)
3429 {
Ben Laurie60e31c31999-02-21 21:58:59 +00003430 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
Bodo Möllerd58d0921999-06-10 16:29:32 +00003431 (void)BIO_flush(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003432 }
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003433 if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
3434 !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL))
Geoff Thorpe2aaec9c2003-10-29 04:14:08 +00003435 {
3436 if(rsa_tmp) RSA_free(rsa_tmp);
3437 rsa_tmp = NULL;
3438 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003439 if (!s_quiet)
3440 {
3441 BIO_printf(bio_err,"\n");
Bodo Möllerd58d0921999-06-10 16:29:32 +00003442 (void)BIO_flush(bio_err);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003443 }
Geoff Thorpebcfea9f2004-04-26 15:31:35 +00003444 BN_free(bn);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003445 }
3446 return(rsa_tmp);
3447 }
Ulf Möllerf5d7a031999-04-27 01:14:46 +00003448#endif
Geoff Thorpe1aa0d942001-02-21 18:38:48 +00003449
3450#define MAX_SESSION_ID_ATTEMPTS 10
3451static int generate_session_id(const SSL *ssl, unsigned char *id,
3452 unsigned int *id_len)
3453 {
3454 unsigned int count = 0;
3455 do {
3456 RAND_pseudo_bytes(id, *id_len);
3457 /* Prefix the session_id with the required prefix. NB: If our
3458 * prefix is too long, clip it - but there will be worse effects
3459 * anyway, eg. the server could only possibly create 1 session
3460 * ID (ie. the prefix!) so all future session negotiations will
3461 * fail due to conflicts. */
3462 memcpy(id, session_id_prefix,
3463 (strlen(session_id_prefix) < *id_len) ?
3464 strlen(session_id_prefix) : *id_len);
3465 }
Geoff Thorpee3a91642001-02-23 00:09:50 +00003466 while(SSL_has_matching_session_id(ssl, id, *id_len) &&
Geoff Thorpe1aa0d942001-02-21 18:38:48 +00003467 (++count < MAX_SESSION_ID_ATTEMPTS));
3468 if(count >= MAX_SESSION_ID_ATTEMPTS)
3469 return 0;
3470 return 1;
3471 }
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003472
3473/* By default s_server uses an in-memory cache which caches SSL_SESSION
3474 * structures without any serialisation. This hides some bugs which only
3475 * become apparent in deployed servers. By implementing a basic external
3476 * session cache some issues can be debugged using s_server.
3477 */
3478
3479typedef struct simple_ssl_session_st
3480 {
3481 unsigned char *id;
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00003482 unsigned int idlen;
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003483 unsigned char *der;
3484 int derlen;
3485 struct simple_ssl_session_st *next;
3486 } simple_ssl_session;
3487
3488static simple_ssl_session *first = NULL;
3489
3490static int add_session(SSL *ssl, SSL_SESSION *session)
3491 {
3492 simple_ssl_session *sess;
3493 unsigned char *p;
3494
3495 sess = OPENSSL_malloc(sizeof(simple_ssl_session));
3496
Dr. Stephen Hensonf9b0b452011-12-22 15:14:32 +00003497 SSL_SESSION_get_id(session, &sess->idlen);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003498 sess->derlen = i2d_SSL_SESSION(session, NULL);
3499
Dr. Stephen Hensonf9b0b452011-12-22 15:14:32 +00003500 sess->id = BUF_memdup(SSL_SESSION_get_id(session, NULL), sess->idlen);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003501
3502 sess->der = OPENSSL_malloc(sess->derlen);
3503 p = sess->der;
3504 i2d_SSL_SESSION(session, &p);
3505
3506 sess->next = first;
3507 first = sess;
3508 BIO_printf(bio_err, "New session added to external cache\n");
3509 return 0;
3510 }
3511
3512static SSL_SESSION *get_session(SSL *ssl, unsigned char *id, int idlen,
3513 int *do_copy)
3514 {
3515 simple_ssl_session *sess;
3516 *do_copy = 0;
3517 for (sess = first; sess; sess = sess->next)
3518 {
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00003519 if (idlen == (int)sess->idlen && !memcmp(sess->id, id, idlen))
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003520 {
3521 const unsigned char *p = sess->der;
3522 BIO_printf(bio_err, "Lookup session: cache hit\n");
3523 return d2i_SSL_SESSION(NULL, &p, sess->derlen);
3524 }
3525 }
3526 BIO_printf(bio_err, "Lookup session: cache miss\n");
3527 return NULL;
3528 }
3529
3530static void del_session(SSL_CTX *sctx, SSL_SESSION *session)
3531 {
3532 simple_ssl_session *sess, *prev = NULL;
Dr. Stephen Hensonf9b0b452011-12-22 15:14:32 +00003533 const unsigned char *id;
3534 unsigned int idlen;
3535 id = SSL_SESSION_get_id(session, &idlen);
Dr. Stephen Henson35b0ea42009-12-27 23:24:45 +00003536 for (sess = first; sess; sess = sess->next)
3537 {
3538 if (idlen == sess->idlen && !memcmp(sess->id, id, idlen))
3539 {
3540 if(prev)
3541 prev->next = sess->next;
3542 else
3543 first = sess->next;
3544 OPENSSL_free(sess->id);
3545 OPENSSL_free(sess->der);
3546 OPENSSL_free(sess);
3547 return;
3548 }
3549 prev = sess;
3550 }
3551 }
3552
3553static void init_session_cache_ctx(SSL_CTX *sctx)
3554 {
3555 SSL_CTX_set_session_cache_mode(sctx,
3556 SSL_SESS_CACHE_NO_INTERNAL|SSL_SESS_CACHE_SERVER);
3557 SSL_CTX_sess_set_new_cb(sctx, add_session);
3558 SSL_CTX_sess_set_get_cb(sctx, get_session);
3559 SSL_CTX_sess_set_remove_cb(sctx, del_session);
3560 }
3561
3562static void free_sessions(void)
3563 {
3564 simple_ssl_session *sess, *tsess;
3565 for (sess = first; sess;)
3566 {
3567 OPENSSL_free(sess->id);
3568 OPENSSL_free(sess->der);
3569 tsess = sess;
3570 sess = sess->next;
3571 OPENSSL_free(tsess);
3572 }
3573 first = NULL;
3574 }
Scott Deboy36086182013-06-18 14:34:38 -07003575
3576#ifndef OPENSSL_NO_TLSEXT
3577static int authz_tlsext_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +00003578 const unsigned char *in,
3579 unsigned short inlen, int *al,
3580 void *arg)
Scott Deboy36086182013-06-18 14:34:38 -07003581 {
3582 if (TLSEXT_TYPE_server_authz == ext_type)
Ben Laurie5eda2132013-08-01 12:33:15 +01003583 client_provided_server_authz
3584 = memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL;
Scott Deboy36086182013-06-18 14:34:38 -07003585
3586 if (TLSEXT_TYPE_client_authz == ext_type)
Ben Laurie5eda2132013-08-01 12:33:15 +01003587 client_provided_client_authz
3588 = memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL;
Scott Deboy36086182013-06-18 14:34:38 -07003589
3590 return 1;
3591 }
3592
3593static int authz_tlsext_generate_cb(SSL *s, unsigned short ext_type,
Ben Laurie0a602872014-02-04 23:16:46 +00003594 const unsigned char **out, unsigned short *outlen,
3595 int *al, void *arg)
Scott Deboy36086182013-06-18 14:34:38 -07003596 {
3597 if (c_auth && client_provided_client_authz && client_provided_server_authz)
3598 {
Scott Deboy67c408c2013-08-01 11:54:09 -07003599 /*if auth_require_reneg flag is set, only send extensions if
3600 renegotiation has occurred */
Ben Laurie5eda2132013-08-01 12:33:15 +01003601 if (!c_auth_require_reneg
3602 || (c_auth_require_reneg && SSL_num_renegotiations(s)))
Scott Deboy36086182013-06-18 14:34:38 -07003603 {
3604 *out = auth_ext_data;
3605 *outlen = 1;
3606 return 1;
3607 }
3608 }
Ben Lauriea6a48e82013-08-01 11:14:23 +01003609 /* no auth extension to send */
Scott Deboy36086182013-06-18 14:34:38 -07003610 return -1;
3611 }
3612
3613static int suppdata_cb(SSL *s, unsigned short supp_data_type,
Ben Laurie0a602872014-02-04 23:16:46 +00003614 const unsigned char *in,
3615 unsigned short inlen, int *al,
3616 void *arg)
Scott Deboy36086182013-06-18 14:34:38 -07003617 {
3618 if (supp_data_type == TLSEXT_SUPPLEMENTALDATATYPE_authz_data)
3619 {
3620 most_recent_supplemental_data = in;
3621 most_recent_supplemental_data_length = inlen;
3622 }
3623 return 1;
3624 }
3625
3626static int auth_suppdata_generate_cb(SSL *s, unsigned short supp_data_type,
Ben Laurie0a602872014-02-04 23:16:46 +00003627 const unsigned char **out,
3628 unsigned short *outlen, int *al, void *arg)
Scott Deboy36086182013-06-18 14:34:38 -07003629 {
Scott Deboy36086182013-06-18 14:34:38 -07003630 if (c_auth && client_provided_client_authz && client_provided_server_authz)
3631 {
Scott Deboy67c408c2013-08-01 11:54:09 -07003632 /*if auth_require_reneg flag is set, only send supplemental data if
3633 renegotiation has occurred */
Ben Laurie5eda2132013-08-01 12:33:15 +01003634 if (!c_auth_require_reneg
3635 || (c_auth_require_reneg && SSL_num_renegotiations(s)))
Scott Deboy36086182013-06-18 14:34:38 -07003636 {
Scott Deboy67c408c2013-08-01 11:54:09 -07003637 generated_supp_data = OPENSSL_malloc(10);
3638 memcpy(generated_supp_data, "1234512345", 10);
3639 *out = generated_supp_data;
Scott Deboy36086182013-06-18 14:34:38 -07003640 *outlen = 10;
3641 return 1;
3642 }
3643 }
Ben Lauriea6a48e82013-08-01 11:14:23 +01003644 /* no supplemental data to send */
Scott Deboy36086182013-06-18 14:34:38 -07003645 return -1;
3646 }
3647#endif
3648