blob: 199a587dcb7c3794c1af7a28c91813dabf0e2745 [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* apps/s_client.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 */
Nils Larschddac1972006-03-10 23:06:27 +0000111/* ====================================================================
112 * Copyright 2005 Nokia. All rights reserved.
113 *
114 * The portions of the attached software ("Contribution") is developed by
115 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116 * license.
117 *
118 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120 * support (see RFC 4279) to OpenSSL.
121 *
122 * No patent licenses or other rights except those expressly stated in
123 * the OpenSSL open source license shall be deemed granted or received
124 * expressly, by implication, estoppel, or otherwise.
125 *
126 * No assurances are provided by Nokia that the Contribution does not
127 * infringe the patent or other intellectual property rights of any third
128 * party or that the license provides you with all the necessary rights
129 * to make use of the Contribution.
130 *
131 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135 * OTHERWISE.
136 */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000137
Bodo Möller1b1a6e71999-08-09 13:01:48 +0000138#include <assert.h>
Nils Larschddac1972006-03-10 23:06:27 +0000139#include <ctype.h>
Ulf Möller8c197cc1999-07-28 23:25:59 +0000140#include <stdio.h>
141#include <stdlib.h>
142#include <string.h>
Richard Levittebe1bd922001-02-20 14:07:03 +0000143#include <openssl/e_os2.h>
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000144/* With IPv6, it looks like Digital has mixed up the proper order of
145 recursive header file inclusion, resulting in the compiler complaining
146 that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
147 is needed to have fileno() declared correctly... So let's define u_int */
Richard Levittebc36ee62001-02-20 08:13:47 +0000148#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000149#define __U_INT
150typedef unsigned int u_int;
151#endif
152
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000153#define USE_SOCKETS
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000154#include "apps.h"
Bodo Möllerec577821999-04-23 22:13:45 +0000155#include <openssl/x509.h>
156#include <openssl/ssl.h>
157#include <openssl/err.h>
158#include <openssl/pem.h>
Geoff Thorpe13729652001-09-12 02:39:06 +0000159#include <openssl/rand.h>
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000160#include <openssl/ocsp.h>
Geoff Thorpe1e26a8b2008-03-16 21:05:46 +0000161#include <openssl/bn.h>
Ben Laurieedc032b2011-03-12 17:01:19 +0000162#ifndef OPENSSL_NO_SRP
163#include <openssl/srp.h>
164#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000165#include "s_apps.h"
Ben Laurie36d16f82005-04-26 16:02:40 +0000166#include "timeouts.h"
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000167
Richard Levittebc36ee62001-02-20 08:13:47 +0000168#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
Ulf Möller75e07701999-05-13 13:21:17 +0000169/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000170#undef FIONBIO
171#endif
172
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000173#undef PROG
174#define PROG s_client_main
175
176/*#define SSL_HOST_NAME "www.netscape.com" */
177/*#define SSL_HOST_NAME "193.118.187.102" */
178#define SSL_HOST_NAME "localhost"
179
180/*#define TEST_CERT "client.pem" */ /* no default cert. */
181
182#undef BUFSIZZ
183#define BUFSIZZ 1024*8
184
185extern int verify_depth;
186extern int verify_error;
Dr. Stephen Henson5d20c4f2006-09-17 17:16:28 +0000187extern int verify_return_error;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000188extern int verify_quiet;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000189
190#ifdef FIONBIO
191static int c_nbio=0;
192#endif
193static int c_Pause=0;
194static int c_debug=0;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000195#ifndef OPENSSL_NO_TLSEXT
196static int c_tlsextdebug=0;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000197static int c_status_req=0;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000198#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000199static int c_msg=0;
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000200static int c_showcerts=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000201
Ben Lauriee0af0402011-11-15 23:50:52 +0000202static char *keymatexportlabel=NULL;
203static int keymatexportlen=20;
204
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000205static void sc_usage(void);
206static void print_stuff(BIO *berr,SSL *con,int full);
Dr. Stephen Henson07021502008-09-03 12:29:57 +0000207#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000208static int ocsp_resp_cb(SSL *s, void *arg);
Dr. Stephen Henson07021502008-09-03 12:29:57 +0000209#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000210static BIO *bio_c_out=NULL;
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +0000211static BIO *bio_c_msg=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000212static int c_quiet=0;
Richard Levittece301b62000-03-10 12:18:28 +0000213static int c_ign_eof=0;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000214static int c_brief=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000215
Nils Larschddac1972006-03-10 23:06:27 +0000216#ifndef OPENSSL_NO_PSK
217/* Default PSK identity and key */
218static char *psk_identity="Client_identity";
Ben Laurief3b7bda2008-11-16 12:47:12 +0000219/*char *psk_key=NULL; by default PSK is not used */
Nils Larschddac1972006-03-10 23:06:27 +0000220
221static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
222 unsigned int max_identity_len, unsigned char *psk,
223 unsigned int max_psk_len)
224 {
225 unsigned int psk_len = 0;
226 int ret;
227 BIGNUM *bn=NULL;
228
229 if (c_debug)
230 BIO_printf(bio_c_out, "psk_client_cb\n");
231 if (!hint)
232 {
233 /* no ServerKeyExchange message*/
234 if (c_debug)
235 BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
236 }
237 else if (c_debug)
238 BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
239
240 /* lookup PSK identity and PSK key based on the given identity hint here */
Dr. Stephen Henson0ed6b522009-02-15 15:29:59 +0000241 ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
Nils Larscha0aa8b42006-03-11 12:18:11 +0000242 if (ret < 0 || (unsigned int)ret > max_identity_len)
Nils Larschddac1972006-03-10 23:06:27 +0000243 goto out_err;
244 if (c_debug)
245 BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
246 ret=BN_hex2bn(&bn, psk_key);
247 if (!ret)
248 {
249 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
250 if (bn)
251 BN_free(bn);
252 return 0;
253 }
254
Nils Larscha0aa8b42006-03-11 12:18:11 +0000255 if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
Nils Larschddac1972006-03-10 23:06:27 +0000256 {
257 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
258 max_psk_len, BN_num_bytes(bn));
259 BN_free(bn);
260 return 0;
261 }
262
263 psk_len=BN_bn2bin(bn, psk);
264 BN_free(bn);
265 if (psk_len == 0)
266 goto out_err;
267
268 if (c_debug)
269 BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
270
271 return psk_len;
272 out_err:
273 if (c_debug)
274 BIO_printf(bio_err, "Error in PSK client callback\n");
275 return 0;
276 }
277#endif
278
Ulf Möller6b691a51999-04-19 21:31:43 +0000279static void sc_usage(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000280 {
Ralf S. Engelschallb6cff931999-01-28 14:44:08 +0000281 BIO_printf(bio_err,"usage: s_client args\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000282 BIO_printf(bio_err,"\n");
283 BIO_printf(bio_err," -host host - use -connect instead\n");
284 BIO_printf(bio_err," -port port - use -connect instead\n");
Geoff Thorpea9351322014-04-26 01:22:54 -0400285 BIO_printf(bio_err," -connect host:port - connect over TCP/IP (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
286 BIO_printf(bio_err," -unix path - connect over unix domain sockets\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000287 BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n");
Dr. Stephen Hensonee724df2014-07-06 22:33:35 +0100288 BIO_printf(bio_err," -verify_return_error - return verification errors\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000289 BIO_printf(bio_err," -cert arg - certificate file to use, PEM format assumed\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000290 BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
291 BIO_printf(bio_err," -key arg - Private key file to use, in cert file if\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000292 BIO_printf(bio_err," not specified but cert file is.\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000293 BIO_printf(bio_err," -keyform arg - key format (PEM or DER) PEM default\n");
294 BIO_printf(bio_err," -pass arg - private key file pass phrase source\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000295 BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
296 BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
Hubert Kario6d3d5792014-06-18 19:55:03 +0200297 BIO_printf(bio_err," -trusted_first - Use local CA's first when building trust chain\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000298 BIO_printf(bio_err," -reconnect - Drop and re-make the connection with the same Session-ID\n");
299 BIO_printf(bio_err," -pause - sleep(1) after each read(2) and write(2) system call\n");
Dr. Stephen Hensonee724df2014-07-06 22:33:35 +0100300 BIO_printf(bio_err," -prexit - print session information even on connection failure\n");
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000301 BIO_printf(bio_err," -showcerts - show all certificates in the chain\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000302 BIO_printf(bio_err," -debug - extra output\n");
Rich Salzf642ebc2014-08-09 08:02:20 -0400303#ifdef WATT32
304 BIO_printf(bio_err," -wdebug - WATT-32 tcp debugging\n");
305#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000306 BIO_printf(bio_err," -msg - Show protocol messages\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000307 BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n");
308 BIO_printf(bio_err," -state - print the 'ssl' states\n");
309#ifdef FIONBIO
310 BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
311#endif
Bodo Möller1bdb8631999-08-07 02:51:10 +0000312 BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000313 BIO_printf(bio_err," -quiet - no s_client output\n");
Richard Levittece301b62000-03-10 12:18:28 +0000314 BIO_printf(bio_err," -ign_eof - ignore input eof (default when -quiet)\n");
Lutz Jänicke020d67f2008-10-22 06:46:14 +0000315 BIO_printf(bio_err," -no_ign_eof - don't ignore input eof\n");
Nils Larschddac1972006-03-10 23:06:27 +0000316#ifndef OPENSSL_NO_PSK
317 BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
318 BIO_printf(bio_err," -psk arg - PSK in hex (without 0x)\n");
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000319# ifndef OPENSSL_NO_JPAKE
Ben Laurief3b7bda2008-11-16 12:47:12 +0000320 BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n");
321# endif
Nils Larschddac1972006-03-10 23:06:27 +0000322#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000323#ifndef OPENSSL_NO_SRP
324 BIO_printf(bio_err," -srpuser user - SRP authentification for 'user'\n");
325 BIO_printf(bio_err," -srppass arg - password for 'user'\n");
326 BIO_printf(bio_err," -srp_lateuser - SRP username into second ClientHello message\n");
327 BIO_printf(bio_err," -srp_moregroups - Tolerate other than the known g N values.\n");
Dominik Neubauer2a9338e2014-03-04 22:22:29 +0100328 BIO_printf(bio_err," -srp_strength int - minimal length in bits for N (default %d).\n",SRP_MINIMAL_N);
Ben Laurieedc032b2011-03-12 17:01:19 +0000329#endif
Dr. Stephen Henson3881d812014-10-29 12:51:31 +0000330#ifndef OPENSSL_NO_SSL3_METHOD
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000331 BIO_printf(bio_err," -ssl3 - just use SSLv3\n");
Dr. Stephen Henson3881d812014-10-29 12:51:31 +0000332#endif
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000333 BIO_printf(bio_err," -tls1_2 - just use TLSv1.2\n");
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000334 BIO_printf(bio_err," -tls1_1 - just use TLSv1.1\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000335 BIO_printf(bio_err," -tls1 - just use TLSv1\n");
Ben Laurie36d16f82005-04-26 16:02:40 +0000336 BIO_printf(bio_err," -dtls1 - just use DTLSv1\n");
Bodo Moellercf6da052014-10-15 04:03:28 +0200337 BIO_printf(bio_err," -fallback_scsv - send TLS_FALLBACK_SCSV\n");
Dr. Stephen Henson046f2102009-05-17 16:04:58 +0000338 BIO_printf(bio_err," -mtu - set the link layer MTU\n");
Kurt Roeckx45f55f62014-11-30 15:35:22 +0100339 BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3 - turn off that protocol\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000340 BIO_printf(bio_err," -bugs - Switch on all SSL implementation bug workarounds\n");
Ulf Möller657e60f2000-02-03 23:23:24 +0000341 BIO_printf(bio_err," -cipher - preferred cipher to use, use the 'openssl ciphers'\n");
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000342 BIO_printf(bio_err," command to see what is available\n");
Richard Levitte135c0af2001-11-14 13:57:52 +0000343 BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
344 BIO_printf(bio_err," for those protocols that support it, where\n");
345 BIO_printf(bio_err," 'prot' defines which one to assume. Currently,\n");
Ben Lauried5bbead2008-10-14 19:11:26 +0000346 BIO_printf(bio_err," only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
347 BIO_printf(bio_err," are supported.\n");
Carlos Alberto Lopez Perezb98af492012-08-06 02:24:51 +0200348 BIO_printf(bio_err," -xmpphost host - When used with \"-starttls xmpp\" specifies the virtual host.\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000349#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000350 BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000351#endif
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000352 BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
Dr. Stephen Henson014f62b2007-08-23 12:20:36 +0000353 BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
354 BIO_printf(bio_err," -sess_in arg - file to read SSL session from\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000355#ifndef OPENSSL_NO_TLSEXT
356 BIO_printf(bio_err," -servername host - Set TLS extension servername in ClientHello\n");
Dr. Stephen Hensond24a9c82007-08-23 11:34:48 +0000357 BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n");
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000358 BIO_printf(bio_err," -status - request certificate status from server\n");
Dr. Stephen Hensond24a9c82007-08-23 11:34:48 +0000359 BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n");
Scott Deboy36086182013-06-18 14:34:38 -0700360 BIO_printf(bio_err," -serverinfo types - send empty ClientHello extensions (comma-separated numbers)\n");
Ben Lauriebf488362010-09-05 17:14:01 +0000361# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000362 BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
363# endif
Piotr Sikora29115752013-11-13 15:20:22 -0800364 BIO_printf(bio_err," -alpn arg - enable ALPN extension, considering named protocols supported (comma-separated list)\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000365#endif
Dr. Stephen Henson2942dde2009-11-11 14:10:24 +0000366 BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
Piotr Sikorae783bae2014-12-22 11:15:51 +0000367#ifndef OPENSSL_NO_SRTP
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +0000368 BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
Piotr Sikorae783bae2014-12-22 11:15:51 +0000369#endif
Ben Lauriee0af0402011-11-15 23:50:52 +0000370 BIO_printf(bio_err," -keymatexport label - Export keying material using label\n");
371 BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000372 }
373
Bodo Möllered3883d2006-01-02 23:14:37 +0000374#ifndef OPENSSL_NO_TLSEXT
375
376/* This is a context that we pass to callbacks */
377typedef struct tlsextctx_st {
378 BIO * biodebug;
379 int ack;
380} tlsextctx;
381
382
Rich Salz6d23cf92015-01-12 17:29:26 -0500383static int ssl_servername_cb(SSL *s, int *ad, void *arg)
Bodo Möllerb1277b92006-01-02 23:29:12 +0000384 {
Bodo Möllered3883d2006-01-02 23:14:37 +0000385 tlsextctx * p = (tlsextctx *) arg;
Richard Levitte8de5b7f2006-01-04 12:02:43 +0000386 const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Bodo Möllered3883d2006-01-02 23:14:37 +0000387 if (SSL_get_servername_type(s) != -1)
388 p->ack = !SSL_session_reused(s) && hn != NULL;
389 else
Bodo Möllerf1fd4542006-01-03 03:27:19 +0000390 BIO_printf(bio_err,"Can't use SSL_get_servername\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000391
Bodo Möller241520e2006-01-11 06:10:40 +0000392 return SSL_TLSEXT_ERR_OK;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000393 }
Ben Laurieee2ffc22010-07-28 10:06:55 +0000394
Ben Laurieedc032b2011-03-12 17:01:19 +0000395#ifndef OPENSSL_NO_SRP
396
397/* This is a context that we pass to all callbacks */
398typedef struct srp_arg_st
399 {
400 char *srppassin;
401 char *srplogin;
402 int msg; /* copy from c_msg */
403 int debug; /* copy from c_debug */
404 int amp; /* allow more groups */
405 int strength /* minimal size for N */ ;
406 } SRP_ARG;
407
408#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
409
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000410static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
Ben Laurieedc032b2011-03-12 17:01:19 +0000411 {
412 BN_CTX *bn_ctx = BN_CTX_new();
413 BIGNUM *p = BN_new();
414 BIGNUM *r = BN_new();
415 int ret =
416 g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000417 BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
Ben Laurieedc032b2011-03-12 17:01:19 +0000418 p != NULL && BN_rshift1(p, N) &&
419
420 /* p = (N-1)/2 */
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000421 BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
Ben Laurieedc032b2011-03-12 17:01:19 +0000422 r != NULL &&
423
424 /* verify g^((N-1)/2) == -1 (mod N) */
425 BN_mod_exp(r, g, p, N, bn_ctx) &&
426 BN_add_word(r, 1) &&
427 BN_cmp(r, N) == 0;
428
429 if(r)
430 BN_free(r);
431 if(p)
432 BN_free(p);
433 if(bn_ctx)
434 BN_CTX_free(bn_ctx);
435 return ret;
436 }
437
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000438/* This callback is used here for two purposes:
439 - extended debugging
440 - making some primality tests for unknown groups
441 The callback is only called for a non default group.
442
443 An application does not need the call back at all if
444 only the stanard groups are used. In real life situations,
445 client and server already share well known groups,
446 thus there is no need to verify them.
447 Furthermore, in case that a server actually proposes a group that
448 is not one of those defined in RFC 5054, it is more appropriate
449 to add the group to a static list and then compare since
450 primality tests are rather cpu consuming.
451*/
452
Rich Salz6d23cf92015-01-12 17:29:26 -0500453static int ssl_srp_verify_param_cb(SSL *s, void *arg)
Ben Laurieedc032b2011-03-12 17:01:19 +0000454 {
455 SRP_ARG *srp_arg = (SRP_ARG *)arg;
456 BIGNUM *N = NULL, *g = NULL;
457 if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
458 return 0;
459 if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
460 {
461 BIO_printf(bio_err, "SRP parameters:\n");
462 BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
463 BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
464 BIO_printf(bio_err,"\n");
465 }
466
467 if (SRP_check_known_gN_param(g,N))
468 return 1;
469
470 if (srp_arg->amp == 1)
471 {
472 if (srp_arg->debug)
473 BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
474
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000475/* The srp_moregroups is a real debugging feature.
Ben Laurieedc032b2011-03-12 17:01:19 +0000476 Implementors should rather add the value to the known ones.
477 The minimal size has already been tested.
478*/
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000479 if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
Ben Laurieedc032b2011-03-12 17:01:19 +0000480 return 1;
481 }
482 BIO_printf(bio_err, "SRP param N and g rejected.\n");
483 return 0;
484 }
485
486#define PWD_STRLEN 1024
487
Rich Salz6d23cf92015-01-12 17:29:26 -0500488static char * ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
Ben Laurieedc032b2011-03-12 17:01:19 +0000489 {
490 SRP_ARG *srp_arg = (SRP_ARG *)arg;
491 char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
492 PW_CB_DATA cb_tmp;
493 int l;
494
495 cb_tmp.password = (char *)srp_arg->srppassin;
496 cb_tmp.prompt_info = "SRP user";
497 if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
498 {
499 BIO_printf (bio_err, "Can't read Password\n");
500 OPENSSL_free(pass);
501 return NULL;
502 }
503 *(pass+l)= '\0';
504
505 return pass;
506 }
507
Ben Laurieedc032b2011-03-12 17:01:19 +0000508#endif
Piotr Sikorae783bae2014-12-22 11:15:51 +0000509#ifndef OPENSSL_NO_SRTP
Ben Laurie333f9262011-11-15 22:59:20 +0000510 char *srtp_profiles = NULL;
Piotr Sikorae783bae2014-12-22 11:15:51 +0000511#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000512
Ben Lauriebf488362010-09-05 17:14:01 +0000513# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000514/* This the context that we pass to next_proto_cb */
515typedef struct tlsextnextprotoctx_st {
516 unsigned char *data;
517 unsigned short len;
518 int status;
519} tlsextnextprotoctx;
520
521static tlsextnextprotoctx next_proto;
522
523static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
524 {
525 tlsextnextprotoctx *ctx = arg;
526
527 if (!c_quiet)
528 {
529 /* We can assume that |in| is syntactically valid. */
530 unsigned i;
531 BIO_printf(bio_c_out, "Protocols advertised by server: ");
532 for (i = 0; i < inlen; )
533 {
534 if (i)
535 BIO_write(bio_c_out, ", ", 2);
536 BIO_write(bio_c_out, &in[i + 1], in[i]);
537 i += in[i] + 1;
538 }
539 BIO_write(bio_c_out, "\n", 1);
540 }
541
542 ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
543 return SSL_TLSEXT_ERR_OK;
544 }
Ben Lauriebf488362010-09-05 17:14:01 +0000545# endif /* ndef OPENSSL_NO_NEXTPROTONEG */
Trevora398f822013-05-12 18:55:27 -0700546
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +0100547static int serverinfo_cli_parse_cb(SSL* s, unsigned int ext_type,
548 const unsigned char* in, size_t inlen,
549 int* al, void* arg)
Trevora398f822013-05-12 18:55:27 -0700550 {
551 char pem_name[100];
552 unsigned char ext_buf[4 + 65536];
553
554 /* Reconstruct the type/len fields prior to extension data */
555 ext_buf[0] = ext_type >> 8;
556 ext_buf[1] = ext_type & 0xFF;
557 ext_buf[2] = inlen >> 8;
558 ext_buf[3] = inlen & 0xFF;
559 memcpy(ext_buf+4, in, inlen);
560
Ben Laurie70d416e2013-09-25 13:55:06 +0100561 BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
562 ext_type);
Trevora398f822013-05-12 18:55:27 -0700563 PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
564 return 1;
565 }
566
Bodo Möllered3883d2006-01-02 23:14:37 +0000567#endif
568
Richard Levitte85c67492007-02-16 18:12:16 +0000569enum
570{
571 PROTO_OFF = 0,
572 PROTO_SMTP,
573 PROTO_POP3,
574 PROTO_IMAP,
Ben Lauried5bbead2008-10-14 19:11:26 +0000575 PROTO_FTP,
Dr. Stephen Henson640b86c2008-10-19 17:22:34 +0000576 PROTO_XMPP
Richard Levitte85c67492007-02-16 18:12:16 +0000577};
578
Ralf S. Engelschall667ac4e2000-02-11 09:47:18 +0000579int MAIN(int, char **);
580
Ulf Möller6b691a51999-04-19 21:31:43 +0000581int MAIN(int argc, char **argv)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000582 {
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +0000583 int build_chain = 0;
Nils Larsch67b6f1c2006-03-15 17:45:43 +0000584 SSL *con=NULL;
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +0000585#ifndef OPENSSL_NO_KRB5
586 KSSL_CTX *kctx;
587#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000588 int s,k,width,state=0;
Richard Levitte135c0af2001-11-14 13:57:52 +0000589 char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000590 int cbuf_len,cbuf_off;
591 int sbuf_len,sbuf_off;
592 fd_set readfds,writefds;
593 short port=PORT;
594 int full_log=1;
595 char *host=SSL_HOST_NAME;
Geoff Thorpea9351322014-04-26 01:22:54 -0400596 const char *unix_path = NULL;
Carlos Alberto Lopez Perezb98af492012-08-06 02:24:51 +0200597 char *xmpphost = NULL;
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +0000598 char *cert_file=NULL,*key_file=NULL,*chain_file=NULL;
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000599 int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
600 char *passarg = NULL, *pass = NULL;
601 X509 *cert = NULL;
602 EVP_PKEY *key = NULL;
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +0000603 STACK_OF(X509) *chain = NULL;
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +0000604 char *CApath=NULL,*CAfile=NULL;
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +0000605 char *chCApath=NULL,*chCAfile=NULL;
606 char *vfyCApath=NULL,*vfyCAfile=NULL;
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +0000607 int reconnect=0,badop=0,verify=SSL_VERIFY_NONE;
Bodo Möller1bdb8631999-08-07 02:51:10 +0000608 int crlf=0;
Bodo Möllerc7ac31e1999-04-09 20:54:25 +0000609 int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000610 SSL_CTX *ctx=NULL;
611 int ret=1,in_init=1,i,nbio_test=0;
Richard Levitte85c67492007-02-16 18:12:16 +0000612 int starttls_proto = PROTO_OFF;
Dr. Stephen Hensondb997792009-06-30 15:56:35 +0000613 int prexit = 0;
614 X509_VERIFY_PARAM *vpm = NULL;
615 int badarg = 0;
Nils Larsch4ebb3422005-08-14 21:48:33 +0000616 const SSL_METHOD *meth=NULL;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000617 int socket_type=SOCK_STREAM;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000618 BIO *sbio;
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000619 char *inrand=NULL;
Richard Levitte85c67492007-02-16 18:12:16 +0000620 int mbuf_len=0;
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +0000621 struct timeval timeout, *timeoutp;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000622#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000623 char *engine_id=NULL;
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +0000624 char *ssl_client_engine_id=NULL;
Dr. Stephen Henson70531c12008-12-20 17:04:40 +0000625 ENGINE *ssl_client_engine=NULL;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000626#endif
Dr. Stephen Henson70531c12008-12-20 17:04:40 +0000627 ENGINE *e=NULL;
Rich Salzb3178192014-12-17 17:24:51 -0500628#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
Dr. Stephen Henson06f45361999-09-20 22:09:17 +0000629 struct timeval tv;
630#endif
Bodo Möllered3883d2006-01-02 23:14:37 +0000631#ifndef OPENSSL_NO_TLSEXT
632 char *servername = NULL;
633 tlsextctx tlsextcbp =
634 {NULL,0};
Ben Lauriebf488362010-09-05 17:14:01 +0000635# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000636 const char *next_proto_neg_in = NULL;
637# endif
Piotr Sikora29115752013-11-13 15:20:22 -0800638 const char *alpn_in = NULL;
Trevora398f822013-05-12 18:55:27 -0700639# define MAX_SI_TYPES 100
640 unsigned short serverinfo_types[MAX_SI_TYPES];
641 int serverinfo_types_count = 0;
Bodo Möllered3883d2006-01-02 23:14:37 +0000642#endif
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000643 char *sess_in = NULL;
644 char *sess_out = NULL;
Ben Laurie36d16f82005-04-26 16:02:40 +0000645 struct sockaddr peer;
Dr. Stephen Henson6c617262005-04-27 16:27:14 +0000646 int peerlen = sizeof(peer);
Bodo Moellercf6da052014-10-15 04:03:28 +0200647 int fallback_scsv = 0;
Ben Laurie36d16f82005-04-26 16:02:40 +0000648 int enable_timeouts = 0 ;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000649 long socket_mtu = 0;
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000650#ifndef OPENSSL_NO_JPAKE
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +0000651static char *jpake_secret = NULL;
652#define no_jpake !jpake_secret
653#else
654#define no_jpake 1
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +0000655#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000656#ifndef OPENSSL_NO_SRP
657 char * srppass = NULL;
658 int srp_lateuser = 0;
659 SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
660#endif
Dr. Stephen Henson3208fc52012-07-03 14:53:27 +0000661 SSL_EXCERT *exc = NULL;
Ben Laurie36d16f82005-04-26 16:02:40 +0000662
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +0000663 SSL_CONF_CTX *cctx = NULL;
664 STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
Dr. Stephen Hensona70da5b2012-10-08 15:10:07 +0000665
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +0000666 char *crl_file = NULL;
667 int crl_format = FORMAT_PEM;
Dr. Stephen Henson0090a682012-12-06 18:43:40 +0000668 int crl_download = 0;
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +0000669 STACK_OF(X509_CRL) *crls = NULL;
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +0000670 int sdebug = 0;
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +0000671
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000672 meth=SSLv23_client_method();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000673
674 apps_startup();
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000675 c_Pause=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000676 c_quiet=0;
Richard Levittece301b62000-03-10 12:18:28 +0000677 c_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000678 c_debug=0;
Bodo Möllera661b652001-10-20 17:56:36 +0000679 c_msg=0;
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000680 c_showcerts=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000681
682 if (bio_err == NULL)
683 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
684
Dr. Stephen Henson3647bee2002-02-22 14:01:21 +0000685 if (!load_config(bio_err, NULL))
686 goto end;
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +0000687 cctx = SSL_CONF_CTX_new();
688 if (!cctx)
689 goto end;
690 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);
691 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
Dr. Stephen Henson3647bee2002-02-22 14:01:21 +0000692
Richard Levitte26a3a482000-06-01 22:19:21 +0000693 if ( ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
Richard Levitte135c0af2001-11-14 13:57:52 +0000694 ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
695 ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000696 {
697 BIO_printf(bio_err,"out of memory\n");
698 goto end;
699 }
700
701 verify_depth=0;
702 verify_error=X509_V_OK;
703#ifdef FIONBIO
704 c_nbio=0;
705#endif
706
707 argc--;
708 argv++;
709 while (argc >= 1)
710 {
711 if (strcmp(*argv,"-host") == 0)
712 {
713 if (--argc < 1) goto bad;
714 host= *(++argv);
715 }
716 else if (strcmp(*argv,"-port") == 0)
717 {
718 if (--argc < 1) goto bad;
719 port=atoi(*(++argv));
720 if (port == 0) goto bad;
721 }
722 else if (strcmp(*argv,"-connect") == 0)
723 {
724 if (--argc < 1) goto bad;
725 if (!extract_host_port(*(++argv),&host,NULL,&port))
726 goto bad;
727 }
Geoff Thorpea9351322014-04-26 01:22:54 -0400728 else if (strcmp(*argv,"-unix") == 0)
729 {
730 if (--argc < 1) goto bad;
731 unix_path = *(++argv);
732 }
Carlos Alberto Lopez Perezb98af492012-08-06 02:24:51 +0200733 else if (strcmp(*argv,"-xmpphost") == 0)
734 {
735 if (--argc < 1) goto bad;
736 xmpphost= *(++argv);
737 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000738 else if (strcmp(*argv,"-verify") == 0)
739 {
740 verify=SSL_VERIFY_PEER;
741 if (--argc < 1) goto bad;
742 verify_depth=atoi(*(++argv));
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000743 if (!c_quiet)
744 BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000745 }
746 else if (strcmp(*argv,"-cert") == 0)
747 {
748 if (--argc < 1) goto bad;
749 cert_file= *(++argv);
750 }
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +0000751 else if (strcmp(*argv,"-CRL") == 0)
752 {
753 if (--argc < 1) goto bad;
754 crl_file= *(++argv);
755 }
Dr. Stephen Henson0090a682012-12-06 18:43:40 +0000756 else if (strcmp(*argv,"-crl_download") == 0)
757 crl_download = 1;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000758 else if (strcmp(*argv,"-sess_out") == 0)
759 {
760 if (--argc < 1) goto bad;
761 sess_out = *(++argv);
762 }
763 else if (strcmp(*argv,"-sess_in") == 0)
764 {
765 if (--argc < 1) goto bad;
766 sess_in = *(++argv);
767 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000768 else if (strcmp(*argv,"-certform") == 0)
769 {
770 if (--argc < 1) goto bad;
771 cert_format = str2fmt(*(++argv));
772 }
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +0000773 else if (strcmp(*argv,"-CRLform") == 0)
774 {
775 if (--argc < 1) goto bad;
776 crl_format = str2fmt(*(++argv));
777 }
Dr. Stephen Hensondb997792009-06-30 15:56:35 +0000778 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
779 {
780 if (badarg)
781 goto bad;
782 continue;
783 }
Dr. Stephen Henson5d20c4f2006-09-17 17:16:28 +0000784 else if (strcmp(*argv,"-verify_return_error") == 0)
785 verify_return_error = 1;
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +0000786 else if (strcmp(*argv,"-verify_quiet") == 0)
787 verify_quiet = 1;
788 else if (strcmp(*argv,"-brief") == 0)
789 {
790 c_brief = 1;
791 verify_quiet = 1;
792 c_quiet = 1;
793 }
Dr. Stephen Henson3208fc52012-07-03 14:53:27 +0000794 else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
795 {
796 if (badarg)
797 goto bad;
798 continue;
799 }
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +0000800 else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
801 {
802 if (badarg)
803 goto bad;
804 continue;
805 }
Dr. Stephen Hensonc3ed3b62000-01-08 19:05:47 +0000806 else if (strcmp(*argv,"-prexit") == 0)
807 prexit=1;
Bodo Möller1bdb8631999-08-07 02:51:10 +0000808 else if (strcmp(*argv,"-crlf") == 0)
809 crlf=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000810 else if (strcmp(*argv,"-quiet") == 0)
Richard Levittece301b62000-03-10 12:18:28 +0000811 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000812 c_quiet=1;
Richard Levittece301b62000-03-10 12:18:28 +0000813 c_ign_eof=1;
814 }
815 else if (strcmp(*argv,"-ign_eof") == 0)
816 c_ign_eof=1;
Lutz Jänicke020d67f2008-10-22 06:46:14 +0000817 else if (strcmp(*argv,"-no_ign_eof") == 0)
818 c_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000819 else if (strcmp(*argv,"-pause") == 0)
820 c_Pause=1;
821 else if (strcmp(*argv,"-debug") == 0)
822 c_debug=1;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000823#ifndef OPENSSL_NO_TLSEXT
824 else if (strcmp(*argv,"-tlsextdebug") == 0)
825 c_tlsextdebug=1;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000826 else if (strcmp(*argv,"-status") == 0)
827 c_status_req=1;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000828#endif
Rich Salzf642ebc2014-08-09 08:02:20 -0400829#ifdef WATT32
830 else if (strcmp(*argv,"-wdebug") == 0)
831 dbug_init();
832#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000833 else if (strcmp(*argv,"-msg") == 0)
834 c_msg=1;
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +0000835 else if (strcmp(*argv,"-msgfile") == 0)
836 {
837 if (--argc < 1) goto bad;
838 bio_c_msg = BIO_new_file(*(++argv), "w");
839 }
840#ifndef OPENSSL_NO_SSL_TRACE
841 else if (strcmp(*argv,"-trace") == 0)
842 c_msg=2;
843#endif
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +0000844 else if (strcmp(*argv,"-security_debug") == 0)
845 { sdebug=1; }
846 else if (strcmp(*argv,"-security_debug_verbose") == 0)
847 { sdebug=2; }
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000848 else if (strcmp(*argv,"-showcerts") == 0)
849 c_showcerts=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000850 else if (strcmp(*argv,"-nbio_test") == 0)
851 nbio_test=1;
852 else if (strcmp(*argv,"-state") == 0)
853 state=1;
Nils Larschddac1972006-03-10 23:06:27 +0000854#ifndef OPENSSL_NO_PSK
855 else if (strcmp(*argv,"-psk_identity") == 0)
856 {
857 if (--argc < 1) goto bad;
858 psk_identity=*(++argv);
859 }
860 else if (strcmp(*argv,"-psk") == 0)
861 {
862 size_t j;
863
864 if (--argc < 1) goto bad;
865 psk_key=*(++argv);
866 for (j = 0; j < strlen(psk_key); j++)
867 {
Andy Polyakova50bce82012-01-12 16:21:35 +0000868 if (isxdigit((unsigned char)psk_key[j]))
Nils Larschddac1972006-03-10 23:06:27 +0000869 continue;
870 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
871 goto bad;
872 }
873 }
874#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000875#ifndef OPENSSL_NO_SRP
876 else if (strcmp(*argv,"-srpuser") == 0)
877 {
878 if (--argc < 1) goto bad;
879 srp_arg.srplogin= *(++argv);
880 meth=TLSv1_client_method();
881 }
882 else if (strcmp(*argv,"-srppass") == 0)
883 {
884 if (--argc < 1) goto bad;
885 srppass= *(++argv);
886 meth=TLSv1_client_method();
887 }
888 else if (strcmp(*argv,"-srp_strength") == 0)
889 {
890 if (--argc < 1) goto bad;
891 srp_arg.strength=atoi(*(++argv));
892 BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
893 meth=TLSv1_client_method();
894 }
895 else if (strcmp(*argv,"-srp_lateuser") == 0)
896 {
897 srp_lateuser= 1;
898 meth=TLSv1_client_method();
899 }
900 else if (strcmp(*argv,"-srp_moregroups") == 0)
901 {
902 srp_arg.amp=1;
903 meth=TLSv1_client_method();
904 }
905#endif
Dr. Stephen Henson3881d812014-10-29 12:51:31 +0000906#ifndef OPENSSL_NO_SSL3_METHOD
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000907 else if (strcmp(*argv,"-ssl3") == 0)
908 meth=SSLv3_client_method();
909#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +0000910#ifndef OPENSSL_NO_TLS1
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000911 else if (strcmp(*argv,"-tls1_2") == 0)
912 meth=TLSv1_2_client_method();
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000913 else if (strcmp(*argv,"-tls1_1") == 0)
914 meth=TLSv1_1_client_method();
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000915 else if (strcmp(*argv,"-tls1") == 0)
916 meth=TLSv1_client_method();
917#endif
Ben Laurie36d16f82005-04-26 16:02:40 +0000918#ifndef OPENSSL_NO_DTLS1
Dr. Stephen Hensonc6913ee2013-04-06 15:50:12 +0100919 else if (strcmp(*argv,"-dtls") == 0)
920 {
921 meth=DTLS_client_method();
922 socket_type=SOCK_DGRAM;
923 }
Ben Laurie36d16f82005-04-26 16:02:40 +0000924 else if (strcmp(*argv,"-dtls1") == 0)
925 {
926 meth=DTLSv1_client_method();
Bodo Möllerb1277b92006-01-02 23:29:12 +0000927 socket_type=SOCK_DGRAM;
Ben Laurie36d16f82005-04-26 16:02:40 +0000928 }
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +0000929 else if (strcmp(*argv,"-dtls1_2") == 0)
930 {
931 meth=DTLSv1_2_client_method();
932 socket_type=SOCK_DGRAM;
933 }
Ben Laurie36d16f82005-04-26 16:02:40 +0000934 else if (strcmp(*argv,"-timeout") == 0)
935 enable_timeouts=1;
936 else if (strcmp(*argv,"-mtu") == 0)
937 {
938 if (--argc < 1) goto bad;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000939 socket_mtu = atol(*(++argv));
Ben Laurie36d16f82005-04-26 16:02:40 +0000940 }
941#endif
Bodo Moellerfb0e87f2014-10-15 10:43:50 +0200942 else if (strcmp(*argv,"-fallback_scsv") == 0)
943 {
944 fallback_scsv = 1;
945 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000946 else if (strcmp(*argv,"-keyform") == 0)
947 {
948 if (--argc < 1) goto bad;
949 key_format = str2fmt(*(++argv));
950 }
951 else if (strcmp(*argv,"-pass") == 0)
952 {
953 if (--argc < 1) goto bad;
954 passarg = *(++argv);
955 }
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +0000956 else if (strcmp(*argv,"-cert_chain") == 0)
957 {
958 if (--argc < 1) goto bad;
959 chain_file= *(++argv);
960 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000961 else if (strcmp(*argv,"-key") == 0)
962 {
963 if (--argc < 1) goto bad;
964 key_file= *(++argv);
965 }
966 else if (strcmp(*argv,"-reconnect") == 0)
967 {
968 reconnect=5;
969 }
970 else if (strcmp(*argv,"-CApath") == 0)
971 {
972 if (--argc < 1) goto bad;
973 CApath= *(++argv);
974 }
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +0000975 else if (strcmp(*argv,"-chainCApath") == 0)
976 {
977 if (--argc < 1) goto bad;
978 chCApath= *(++argv);
979 }
980 else if (strcmp(*argv,"-verifyCApath") == 0)
981 {
982 if (--argc < 1) goto bad;
983 vfyCApath= *(++argv);
984 }
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +0000985 else if (strcmp(*argv,"-build_chain") == 0)
986 build_chain = 1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000987 else if (strcmp(*argv,"-CAfile") == 0)
988 {
989 if (--argc < 1) goto bad;
990 CAfile= *(++argv);
991 }
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +0000992 else if (strcmp(*argv,"-chainCAfile") == 0)
993 {
994 if (--argc < 1) goto bad;
995 chCAfile= *(++argv);
996 }
997 else if (strcmp(*argv,"-verifyCAfile") == 0)
998 {
999 if (--argc < 1) goto bad;
1000 vfyCAfile= *(++argv);
1001 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001002#ifndef OPENSSL_NO_TLSEXT
Ben Lauriebf488362010-09-05 17:14:01 +00001003# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +00001004 else if (strcmp(*argv,"-nextprotoneg") == 0)
1005 {
1006 if (--argc < 1) goto bad;
1007 next_proto_neg_in = *(++argv);
1008 }
Piotr Sikora29115752013-11-13 15:20:22 -08001009# endif
Adam Langley6f017a82013-04-15 18:07:47 -04001010 else if (strcmp(*argv,"-alpn") == 0)
1011 {
1012 if (--argc < 1) goto bad;
1013 alpn_in = *(++argv);
1014 }
Trevora398f822013-05-12 18:55:27 -07001015 else if (strcmp(*argv,"-serverinfo") == 0)
1016 {
1017 char *c;
1018 int start = 0;
1019 int len;
1020
1021 if (--argc < 1) goto bad;
1022 c = *(++argv);
1023 serverinfo_types_count = 0;
1024 len = strlen(c);
1025 for (i = 0; i <= len; ++i)
1026 {
1027 if (i == len || c[i] == ',')
1028 {
1029 serverinfo_types[serverinfo_types_count]
1030 = atoi(c+start);
1031 serverinfo_types_count++;
1032 start = i+1;
1033 }
1034 if (serverinfo_types_count == MAX_SI_TYPES)
1035 break;
1036 }
1037 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001038#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001039#ifdef FIONBIO
1040 else if (strcmp(*argv,"-nbio") == 0)
1041 { c_nbio=1; }
1042#endif
Richard Levitte135c0af2001-11-14 13:57:52 +00001043 else if (strcmp(*argv,"-starttls") == 0)
1044 {
1045 if (--argc < 1) goto bad;
1046 ++argv;
1047 if (strcmp(*argv,"smtp") == 0)
Richard Levitte85c67492007-02-16 18:12:16 +00001048 starttls_proto = PROTO_SMTP;
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +00001049 else if (strcmp(*argv,"pop3") == 0)
Richard Levitte85c67492007-02-16 18:12:16 +00001050 starttls_proto = PROTO_POP3;
1051 else if (strcmp(*argv,"imap") == 0)
1052 starttls_proto = PROTO_IMAP;
1053 else if (strcmp(*argv,"ftp") == 0)
1054 starttls_proto = PROTO_FTP;
Ben Lauried5bbead2008-10-14 19:11:26 +00001055 else if (strcmp(*argv, "xmpp") == 0)
1056 starttls_proto = PROTO_XMPP;
Richard Levitte135c0af2001-11-14 13:57:52 +00001057 else
1058 goto bad;
1059 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001060#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +00001061 else if (strcmp(*argv,"-engine") == 0)
1062 {
1063 if (--argc < 1) goto bad;
1064 engine_id = *(++argv);
1065 }
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +00001066 else if (strcmp(*argv,"-ssl_client_engine") == 0)
1067 {
1068 if (--argc < 1) goto bad;
1069 ssl_client_engine_id = *(++argv);
1070 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001071#endif
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001072 else if (strcmp(*argv,"-rand") == 0)
1073 {
1074 if (--argc < 1) goto bad;
1075 inrand= *(++argv);
1076 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001077#ifndef OPENSSL_NO_TLSEXT
1078 else if (strcmp(*argv,"-servername") == 0)
1079 {
1080 if (--argc < 1) goto bad;
1081 servername= *(++argv);
1082 /* meth=TLSv1_client_method(); */
1083 }
1084#endif
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001085#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001086 else if (strcmp(*argv,"-jpake") == 0)
1087 {
1088 if (--argc < 1) goto bad;
1089 jpake_secret = *++argv;
1090 }
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +00001091#endif
Piotr Sikorae783bae2014-12-22 11:15:51 +00001092#ifndef OPENSSL_NO_SRTP
Ben Laurie333f9262011-11-15 22:59:20 +00001093 else if (strcmp(*argv,"-use_srtp") == 0)
1094 {
1095 if (--argc < 1) goto bad;
1096 srtp_profiles = *(++argv);
1097 }
Piotr Sikorae783bae2014-12-22 11:15:51 +00001098#endif
Ben Lauriee0af0402011-11-15 23:50:52 +00001099 else if (strcmp(*argv,"-keymatexport") == 0)
1100 {
1101 if (--argc < 1) goto bad;
1102 keymatexportlabel= *(++argv);
1103 }
1104 else if (strcmp(*argv,"-keymatexportlen") == 0)
1105 {
1106 if (--argc < 1) goto bad;
1107 keymatexportlen=atoi(*(++argv));
1108 if (keymatexportlen == 0) goto bad;
1109 }
Ben Laurie333f9262011-11-15 22:59:20 +00001110 else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001111 {
1112 BIO_printf(bio_err,"unknown option %s\n",*argv);
1113 badop=1;
1114 break;
1115 }
1116 argc--;
1117 argv++;
1118 }
1119 if (badop)
1120 {
1121bad:
1122 sc_usage();
1123 goto end;
1124 }
1125
Geoff Thorpea9351322014-04-26 01:22:54 -04001126 if (unix_path && (socket_type != SOCK_STREAM))
1127 {
1128 BIO_printf(bio_err, "Can't use unix sockets and datagrams together\n");
1129 goto end;
1130 }
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001131#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
Ben Laurief3b7bda2008-11-16 12:47:12 +00001132 if (jpake_secret)
1133 {
1134 if (psk_key)
1135 {
1136 BIO_printf(bio_err,
1137 "Can't use JPAKE and PSK together\n");
1138 goto end;
1139 }
1140 psk_identity = "JPAKE";
1141 }
Ben Laurief3b7bda2008-11-16 12:47:12 +00001142#endif
1143
Richard Levittecead7f32002-07-16 06:52:03 +00001144 OpenSSL_add_ssl_algorithms();
1145 SSL_load_error_strings();
1146
Ben Lauriebf488362010-09-05 17:14:01 +00001147#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00001148 next_proto.status = -1;
1149 if (next_proto_neg_in)
1150 {
1151 next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1152 if (next_proto.data == NULL)
1153 {
1154 BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1155 goto end;
1156 }
1157 }
1158 else
1159 next_proto.data = NULL;
1160#endif
1161
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001162#ifndef OPENSSL_NO_ENGINE
Richard Levittecead7f32002-07-16 06:52:03 +00001163 e = setup_engine(bio_err, engine_id, 1);
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +00001164 if (ssl_client_engine_id)
1165 {
1166 ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1167 if (!ssl_client_engine)
1168 {
1169 BIO_printf(bio_err,
1170 "Error getting client auth engine\n");
1171 goto end;
1172 }
1173 }
1174
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001175#endif
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001176 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1177 {
1178 BIO_printf(bio_err, "Error getting password\n");
1179 goto end;
1180 }
1181
1182 if (key_file == NULL)
1183 key_file = cert_file;
1184
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001185
1186 if (key_file)
1187
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001188 {
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001189
1190 key = load_key(bio_err, key_file, key_format, 0, pass, e,
1191 "client certificate private key file");
1192 if (!key)
1193 {
1194 ERR_print_errors(bio_err);
1195 goto end;
1196 }
1197
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001198 }
1199
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001200 if (cert_file)
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001201
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001202 {
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001203 cert = load_cert(bio_err,cert_file,cert_format,
1204 NULL, e, "client certificate file");
1205
1206 if (!cert)
1207 {
1208 ERR_print_errors(bio_err);
1209 goto end;
1210 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001211 }
Richard Levittecead7f32002-07-16 06:52:03 +00001212
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +00001213 if (chain_file)
1214 {
1215 chain = load_certs(bio_err, chain_file,FORMAT_PEM,
1216 NULL, e, "client certificate chain");
1217 if (!chain)
1218 goto end;
1219 }
1220
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001221 if (crl_file)
1222 {
1223 X509_CRL *crl;
1224 crl = load_crl(crl_file, crl_format);
1225 if (!crl)
1226 {
1227 BIO_puts(bio_err, "Error loading CRL\n");
1228 ERR_print_errors(bio_err);
1229 goto end;
1230 }
1231 crls = sk_X509_CRL_new_null();
1232 if (!crls || !sk_X509_CRL_push(crls, crl))
1233 {
1234 BIO_puts(bio_err, "Error adding CRL\n");
1235 ERR_print_errors(bio_err);
1236 X509_CRL_free(crl);
1237 goto end;
1238 }
1239 }
1240
Dr. Stephen Henson3208fc52012-07-03 14:53:27 +00001241 if (!load_excert(&exc, bio_err))
1242 goto end;
1243
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001244 if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1245 && !RAND_status())
1246 {
1247 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1248 }
1249 if (inrand != NULL)
1250 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1251 app_RAND_load_files(inrand));
Bodo Möllera31011e1999-10-26 01:56:29 +00001252
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001253 if (bio_c_out == NULL)
1254 {
Dr. Stephen Henson1740c9f2012-11-21 17:11:42 +00001255 if (c_quiet && !c_debug)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001256 {
1257 bio_c_out=BIO_new(BIO_s_null());
Dr. Stephen Henson1740c9f2012-11-21 17:11:42 +00001258 if (c_msg && !bio_c_msg)
1259 bio_c_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001260 }
1261 else
1262 {
1263 if (bio_c_out == NULL)
1264 bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1265 }
1266 }
1267
Ben Laurieedc032b2011-03-12 17:01:19 +00001268#ifndef OPENSSL_NO_SRP
1269 if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1270 {
1271 BIO_printf(bio_err, "Error getting password\n");
1272 goto end;
1273 }
1274#endif
1275
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001276 ctx=SSL_CTX_new(meth);
1277 if (ctx == NULL)
1278 {
1279 ERR_print_errors(bio_err);
1280 goto end;
1281 }
1282
Dr. Stephen Hensone03c5b52014-02-17 00:10:00 +00001283 if (sdebug)
1284 ssl_ctx_security_debug(ctx, bio_err, sdebug);
1285
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001286 if (vpm)
1287 SSL_CTX_set1_param(ctx, vpm);
1288
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +00001289 if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, 1, no_jpake))
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00001290 {
1291 ERR_print_errors(bio_err);
1292 goto end;
1293 }
1294
Dr. Stephen Henson0090a682012-12-06 18:43:40 +00001295 if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1296 crls, crl_download))
Dr. Stephen Hensona5afc0a2012-11-23 18:56:25 +00001297 {
1298 BIO_printf(bio_err, "Error loading store locations\n");
1299 ERR_print_errors(bio_err);
1300 goto end;
1301 }
1302
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +00001303#ifndef OPENSSL_NO_ENGINE
1304 if (ssl_client_engine)
1305 {
1306 if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1307 {
1308 BIO_puts(bio_err, "Error setting client auth engine\n");
1309 ERR_print_errors(bio_err);
1310 ENGINE_free(ssl_client_engine);
1311 goto end;
1312 }
1313 ENGINE_free(ssl_client_engine);
1314 }
1315#endif
1316
Nils Larschddac1972006-03-10 23:06:27 +00001317#ifndef OPENSSL_NO_PSK
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001318#ifdef OPENSSL_NO_JPAKE
1319 if (psk_key != NULL)
1320#else
Ben Laurief3b7bda2008-11-16 12:47:12 +00001321 if (psk_key != NULL || jpake_secret)
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001322#endif
Nils Larschddac1972006-03-10 23:06:27 +00001323 {
1324 if (c_debug)
Ben Laurief3b7bda2008-11-16 12:47:12 +00001325 BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
Nils Larschddac1972006-03-10 23:06:27 +00001326 SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1327 }
Piotr Sikorae783bae2014-12-22 11:15:51 +00001328#endif
1329#ifndef OPENSSL_NO_SRTP
Ben Laurie333f9262011-11-15 22:59:20 +00001330 if (srtp_profiles != NULL)
1331 SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
Nils Larschddac1972006-03-10 23:06:27 +00001332#endif
Dr. Stephen Henson3208fc52012-07-03 14:53:27 +00001333 if (exc) ssl_ctx_set_excert(ctx, exc);
Ben Laurie36d16f82005-04-26 16:02:40 +00001334 /* DTLS: partial reads end up discarding unread UDP bytes :-(
1335 * Setting read ahead solves this problem.
1336 */
Bodo Möllerb1277b92006-01-02 23:29:12 +00001337 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001338
Adam Langley6f017a82013-04-15 18:07:47 -04001339#if !defined(OPENSSL_NO_TLSEXT)
1340# if !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00001341 if (next_proto.data)
1342 SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
Adam Langley6f017a82013-04-15 18:07:47 -04001343# endif
1344 if (alpn_in)
1345 {
1346 unsigned short alpn_len;
1347 unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);
1348
1349 if (alpn == NULL)
1350 {
1351 BIO_printf(bio_err, "Error parsing -alpn argument\n");
1352 goto end;
1353 }
1354 SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len);
Adam Langleya8989362013-07-15 15:57:16 -04001355 OPENSSL_free(alpn);
Adam Langley6f017a82013-04-15 18:07:47 -04001356 }
Ben Laurieee2ffc22010-07-28 10:06:55 +00001357#endif
Trevora398f822013-05-12 18:55:27 -07001358#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001359 for (i = 0; i < serverinfo_types_count; i++)
Trevora398f822013-05-12 18:55:27 -07001360 {
Dr. Stephen Henson0cfefe42014-08-19 14:02:50 +01001361 SSL_CTX_add_client_custom_ext(ctx,
1362 serverinfo_types[i],
1363 NULL, NULL, NULL,
1364 serverinfo_cli_parse_cb,
1365 NULL);
Trevora398f822013-05-12 18:55:27 -07001366 }
1367#endif
Ben Laurieee2ffc22010-07-28 10:06:55 +00001368
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001369 if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001370#if 0
1371 else
1372 SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1373#endif
1374
1375 SSL_CTX_set_verify(ctx,verify,verify_callback);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001376
1377 if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1378 (!SSL_CTX_set_default_verify_paths(ctx)))
1379 {
Ulf Möller657e60f2000-02-03 23:23:24 +00001380 /* BIO_printf(bio_err,"error setting default verify locations\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001381 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001382 /* goto end; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001383 }
1384
Dr. Stephen Henson0090a682012-12-06 18:43:40 +00001385 ssl_ctx_add_crls(ctx, crls, crl_download);
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00001386
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +00001387 if (!set_cert_key_stuff(ctx,cert,key,chain,build_chain))
Dr. Stephen Henson74ecfab2012-07-23 23:34:28 +00001388 goto end;
1389
Bodo Möllered3883d2006-01-02 23:14:37 +00001390#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001391 if (servername != NULL)
1392 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001393 tlsextcbp.biodebug = bio_err;
1394 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1395 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
Bodo Möllerb1277b92006-01-02 23:29:12 +00001396 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001397#ifndef OPENSSL_NO_SRP
1398 if (srp_arg.srplogin)
1399 {
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +00001400 if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
Ben Laurieedc032b2011-03-12 17:01:19 +00001401 {
1402 BIO_printf(bio_err,"Unable to set SRP username\n");
1403 goto end;
1404 }
1405 srp_arg.msg = c_msg;
1406 srp_arg.debug = c_debug ;
1407 SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1408 SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1409 SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1410 if (c_msg || c_debug || srp_arg.amp == 0)
1411 SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1412 }
1413
1414#endif
Bodo Möllered3883d2006-01-02 23:14:37 +00001415#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001416
Dr. Stephen Henson82fc1d92000-02-03 02:56:48 +00001417 con=SSL_new(ctx);
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001418 if (sess_in)
1419 {
1420 SSL_SESSION *sess;
1421 BIO *stmp = BIO_new_file(sess_in, "r");
1422 if (!stmp)
1423 {
1424 BIO_printf(bio_err, "Can't open session file %s\n",
1425 sess_in);
1426 ERR_print_errors(bio_err);
1427 goto end;
1428 }
1429 sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1430 BIO_free(stmp);
1431 if (!sess)
1432 {
1433 BIO_printf(bio_err, "Can't open session file %s\n",
1434 sess_in);
1435 ERR_print_errors(bio_err);
1436 goto end;
1437 }
1438 SSL_set_session(con, sess);
1439 SSL_SESSION_free(sess);
1440 }
Bodo Moellercf6da052014-10-15 04:03:28 +02001441
1442 if (fallback_scsv)
1443 SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
1444
Bodo Möllered3883d2006-01-02 23:14:37 +00001445#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001446 if (servername != NULL)
1447 {
Bodo Möllera13c20f2006-01-09 19:49:05 +00001448 if (!SSL_set_tlsext_host_name(con,servername))
Bodo Möllerb1277b92006-01-02 23:29:12 +00001449 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001450 BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1451 ERR_print_errors(bio_err);
1452 goto end;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001453 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001454 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001455#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +00001456#ifndef OPENSSL_NO_KRB5
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00001457 if (con && (kctx = kssl_ctx_new()) != NULL)
Richard Levittef9b3bff2000-11-30 22:53:34 +00001458 {
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00001459 SSL_set0_kssl_ctx(con, kctx);
1460 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
Richard Levittef9b3bff2000-11-30 22:53:34 +00001461 }
Richard Levittecf1b7d92001-02-19 16:06:34 +00001462#endif /* OPENSSL_NO_KRB5 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001463/* SSL_set_cipher_list(con,"RC4-MD5"); */
Bodo Möller761772d2007-09-21 06:54:24 +00001464#if 0
1465#ifdef TLSEXT_TYPE_opaque_prf_input
Bodo Möller86d4bc32007-09-23 11:08:59 +00001466 SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
Bodo Möller761772d2007-09-21 06:54:24 +00001467#endif
1468#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001469
1470re_start:
Dr. Stephen Henson9cd86ab2014-07-01 12:44:00 +01001471#ifdef NO_SYS_UN_H
1472 if (init_client(&s,host,port,socket_type) == 0)
1473#else
Geoff Thorpea9351322014-04-26 01:22:54 -04001474 if ((!unix_path && (init_client(&s,host,port,socket_type) == 0)) ||
1475 (unix_path && (init_client_unix(&s,unix_path) == 0)))
Dr. Stephen Henson9cd86ab2014-07-01 12:44:00 +01001476#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001477 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001478 BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001479 SHUTDOWN(s);
1480 goto end;
1481 }
1482 BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1483
1484#ifdef FIONBIO
1485 if (c_nbio)
1486 {
1487 unsigned long l=1;
1488 BIO_printf(bio_c_out,"turning on non blocking io\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001489 if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1490 {
1491 ERR_print_errors(bio_err);
1492 goto end;
1493 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001494 }
1495#endif
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00001496 if (c_Pause & 0x01) SSL_set_debug(con, 1);
Ben Laurie36d16f82005-04-26 16:02:40 +00001497
Dr. Stephen Hensonc3b344e2013-03-20 15:49:14 +00001498 if (socket_type == SOCK_DGRAM)
Ben Laurie36d16f82005-04-26 16:02:40 +00001499 {
Ben Laurie36d16f82005-04-26 16:02:40 +00001500
1501 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
Dr. Stephen Henson6c617262005-04-27 16:27:14 +00001502 if (getsockname(s, &peer, (void *)&peerlen) < 0)
Ben Laurie36d16f82005-04-26 16:02:40 +00001503 {
1504 BIO_printf(bio_err, "getsockname:errno=%d\n",
1505 get_last_socket_error());
1506 SHUTDOWN(s);
1507 goto end;
1508 }
1509
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001510 (void)BIO_ctrl_set_connected(sbio, 1, &peer);
Ben Laurie36d16f82005-04-26 16:02:40 +00001511
Bodo Möllerb1277b92006-01-02 23:29:12 +00001512 if (enable_timeouts)
Ben Laurie36d16f82005-04-26 16:02:40 +00001513 {
1514 timeout.tv_sec = 0;
1515 timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1516 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1517
1518 timeout.tv_sec = 0;
1519 timeout.tv_usec = DGRAM_SND_TIMEOUT;
1520 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1521 }
1522
Matt Caswell464ce9202014-12-01 23:57:44 +00001523 if (socket_mtu)
Ben Laurie36d16f82005-04-26 16:02:40 +00001524 {
Matt Caswell464ce9202014-12-01 23:57:44 +00001525 if(socket_mtu < DTLS_get_link_min_mtu(con))
1526 {
1527 BIO_printf(bio_err,"MTU too small. Must be at least %ld\n",
1528 DTLS_get_link_min_mtu(con));
1529 BIO_free(sbio);
1530 goto shut;
1531 }
Ben Laurie36d16f82005-04-26 16:02:40 +00001532 SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
Matt Caswell464ce9202014-12-01 23:57:44 +00001533 if(!DTLS_set_link_mtu(con, socket_mtu))
1534 {
1535 BIO_printf(bio_err, "Failed to set MTU\n");
1536 BIO_free(sbio);
1537 goto shut;
1538 }
Ben Laurie36d16f82005-04-26 16:02:40 +00001539 }
1540 else
1541 /* want to do MTU discovery */
1542 BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1543 }
1544 else
1545 sbio=BIO_new_socket(s,BIO_NOCLOSE);
1546
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001547 if (nbio_test)
1548 {
1549 BIO *test;
1550
1551 test=BIO_new(BIO_f_nbio_test());
1552 sbio=BIO_push(test,sbio);
1553 }
1554
1555 if (c_debug)
1556 {
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00001557 SSL_set_debug(con, 1);
Richard Levitte25495642004-08-12 08:58:55 +00001558 BIO_set_callback(sbio,bio_dump_callback);
Nils Larsch7806f3d2006-11-29 20:54:57 +00001559 BIO_set_callback_arg(sbio,(char *)bio_c_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001560 }
Bodo Möllera661b652001-10-20 17:56:36 +00001561 if (c_msg)
1562 {
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00001563#ifndef OPENSSL_NO_SSL_TRACE
1564 if (c_msg == 2)
1565 SSL_set_msg_callback(con, SSL_trace);
1566 else
1567#endif
1568 SSL_set_msg_callback(con, msg_cb);
1569 SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
Bodo Möllera661b652001-10-20 17:56:36 +00001570 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001571#ifndef OPENSSL_NO_TLSEXT
1572 if (c_tlsextdebug)
1573 {
1574 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1575 SSL_set_tlsext_debug_arg(con, bio_c_out);
1576 }
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00001577 if (c_status_req)
1578 {
1579 SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1580 SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1581 SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1582#if 0
1583{
1584STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1585OCSP_RESPID *id = OCSP_RESPID_new();
1586id->value.byKey = ASN1_OCTET_STRING_new();
1587id->type = V_OCSP_RESPID_KEY;
1588ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1589sk_OCSP_RESPID_push(ids, id);
1590SSL_set_tlsext_status_ids(con, ids);
1591}
1592#endif
1593 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001594#endif
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001595#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001596 if (jpake_secret)
1597 jpake_client_auth(bio_c_out, sbio, jpake_secret);
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +00001598#endif
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001599
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001600 SSL_set_bio(con,sbio,sbio);
1601 SSL_set_connect_state(con);
1602
1603 /* ok, lets connect */
1604 width=SSL_get_fd(con)+1;
1605
1606 read_tty=1;
1607 write_tty=0;
1608 tty_on=0;
1609 read_ssl=1;
1610 write_ssl=1;
1611
1612 cbuf_len=0;
1613 cbuf_off=0;
1614 sbuf_len=0;
1615 sbuf_off=0;
1616
Richard Levitte135c0af2001-11-14 13:57:52 +00001617 /* This is an ugly hack that does a lot of assumptions */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001618 /* We do have to handle multi-line responses which may come
1619 in a single packet or not. We therefore have to use
1620 BIO_gets() which does need a buffering BIO. So during
1621 the initial chitchat we do push a buffering BIO into the
1622 chain that is removed again later on to not disturb the
1623 rest of the s_client operation. */
Richard Levitte85c67492007-02-16 18:12:16 +00001624 if (starttls_proto == PROTO_SMTP)
Richard Levitte135c0af2001-11-14 13:57:52 +00001625 {
Lutz Jänicke8d724762007-02-21 18:20:41 +00001626 int foundit=0;
Lutz Jänickeee373e72007-02-22 17:39:47 +00001627 BIO *fbio = BIO_new(BIO_f_buffer());
1628 BIO_push(fbio, sbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001629 /* wait for multi-line response to end from SMTP */
1630 do
1631 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001632 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Richard Levitte85c67492007-02-16 18:12:16 +00001633 }
1634 while (mbuf_len>3 && mbuf[3]=='-');
Lutz Jänicke8d724762007-02-21 18:20:41 +00001635 /* STARTTLS command requires EHLO... */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001636 BIO_printf(fbio,"EHLO openssl.client.net\r\n");
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001637 (void)BIO_flush(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001638 /* wait for multi-line response to end EHLO SMTP response */
1639 do
1640 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001641 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001642 if (strstr(mbuf,"STARTTLS"))
1643 foundit=1;
1644 }
1645 while (mbuf_len>3 && mbuf[3]=='-');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001646 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001647 BIO_pop(fbio);
1648 BIO_free(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001649 if (!foundit)
1650 BIO_printf(bio_err,
1651 "didn't found starttls in server response,"
1652 " try anyway...\n");
Richard Levitte135c0af2001-11-14 13:57:52 +00001653 BIO_printf(sbio,"STARTTLS\r\n");
1654 BIO_read(sbio,sbuf,BUFSIZZ);
1655 }
Richard Levitte85c67492007-02-16 18:12:16 +00001656 else if (starttls_proto == PROTO_POP3)
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +00001657 {
1658 BIO_read(sbio,mbuf,BUFSIZZ);
1659 BIO_printf(sbio,"STLS\r\n");
1660 BIO_read(sbio,sbuf,BUFSIZZ);
1661 }
Richard Levitte85c67492007-02-16 18:12:16 +00001662 else if (starttls_proto == PROTO_IMAP)
1663 {
Lutz Jänicke8d724762007-02-21 18:20:41 +00001664 int foundit=0;
Lutz Jänickeee373e72007-02-22 17:39:47 +00001665 BIO *fbio = BIO_new(BIO_f_buffer());
1666 BIO_push(fbio, sbio);
1667 BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001668 /* STARTTLS command requires CAPABILITY... */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001669 BIO_printf(fbio,". CAPABILITY\r\n");
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001670 (void)BIO_flush(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001671 /* wait for multi-line CAPABILITY response */
1672 do
1673 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001674 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001675 if (strstr(mbuf,"STARTTLS"))
1676 foundit=1;
1677 }
Lutz Jänickeee373e72007-02-22 17:39:47 +00001678 while (mbuf_len>3 && mbuf[0]!='.');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001679 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001680 BIO_pop(fbio);
1681 BIO_free(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001682 if (!foundit)
1683 BIO_printf(bio_err,
1684 "didn't found STARTTLS in server response,"
1685 " try anyway...\n");
1686 BIO_printf(sbio,". STARTTLS\r\n");
Richard Levitte85c67492007-02-16 18:12:16 +00001687 BIO_read(sbio,sbuf,BUFSIZZ);
1688 }
1689 else if (starttls_proto == PROTO_FTP)
1690 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001691 BIO *fbio = BIO_new(BIO_f_buffer());
1692 BIO_push(fbio, sbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001693 /* wait for multi-line response to end from FTP */
1694 do
1695 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001696 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Richard Levitte85c67492007-02-16 18:12:16 +00001697 }
1698 while (mbuf_len>3 && mbuf[3]=='-');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001699 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001700 BIO_pop(fbio);
1701 BIO_free(fbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001702 BIO_printf(sbio,"AUTH TLS\r\n");
1703 BIO_read(sbio,sbuf,BUFSIZZ);
1704 }
Ben Lauried5bbead2008-10-14 19:11:26 +00001705 if (starttls_proto == PROTO_XMPP)
1706 {
1707 int seen = 0;
1708 BIO_printf(sbio,"<stream:stream "
1709 "xmlns:stream='http://etherx.jabber.org/streams' "
Ben Lauried2625fd2013-09-05 17:28:05 +01001710 "xmlns='jabber:client' to='%s' version='1.0'>", xmpphost ?
1711 xmpphost : host);
Ben Lauried5bbead2008-10-14 19:11:26 +00001712 seen = BIO_read(sbio,mbuf,BUFSIZZ);
1713 mbuf[seen] = 0;
Carlos Alberto Lopez Perez4e48c772012-08-06 01:45:51 +02001714 while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'") &&
1715 !strstr(mbuf, "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\""))
Ben Lauried5bbead2008-10-14 19:11:26 +00001716 {
Ben Lauried5bbead2008-10-14 19:11:26 +00001717 seen = BIO_read(sbio,mbuf,BUFSIZZ);
Carlos Alberto Lopez Perez4249d4b2012-08-06 02:00:07 +02001718
1719 if (seen <= 0)
1720 goto shut;
1721
Ben Lauried5bbead2008-10-14 19:11:26 +00001722 mbuf[seen] = 0;
1723 }
1724 BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1725 seen = BIO_read(sbio,sbuf,BUFSIZZ);
1726 sbuf[seen] = 0;
1727 if (!strstr(sbuf, "<proceed"))
1728 goto shut;
1729 mbuf[0] = 0;
1730 }
Richard Levitte135c0af2001-11-14 13:57:52 +00001731
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001732 for (;;)
1733 {
1734 FD_ZERO(&readfds);
1735 FD_ZERO(&writefds);
1736
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001737 if ((SSL_version(con) == DTLS1_VERSION) &&
1738 DTLSv1_get_timeout(con, &timeout))
1739 timeoutp = &timeout;
1740 else
1741 timeoutp = NULL;
1742
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001743 if (SSL_in_init(con) && !SSL_total_renegotiations(con))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001744 {
1745 in_init=1;
1746 tty_on=0;
1747 }
1748 else
1749 {
1750 tty_on=1;
1751 if (in_init)
1752 {
1753 in_init=0;
Bodo Möller761772d2007-09-21 06:54:24 +00001754#if 0 /* This test doesn't really work as intended (needs to be fixed) */
Bodo Möllered3883d2006-01-02 23:14:37 +00001755#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb166f132006-06-15 19:00:34 +00001756 if (servername != NULL && !SSL_session_reused(con))
1757 {
1758 BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1759 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001760#endif
Bodo Möller761772d2007-09-21 06:54:24 +00001761#endif
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001762 if (sess_out)
1763 {
1764 BIO *stmp = BIO_new_file(sess_out, "w");
1765 if (stmp)
1766 {
1767 PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1768 BIO_free(stmp);
1769 }
1770 else
1771 BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1772 }
Dr. Stephen Henson2a7cbe72012-09-12 23:14:28 +00001773 if (c_brief)
1774 {
1775 BIO_puts(bio_err,
1776 "CONNECTION ESTABLISHED\n");
1777 print_ssl_summary(bio_err, con);
1778 }
Scott Deboy67c408c2013-08-01 11:54:09 -07001779
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001780 print_stuff(bio_c_out,con,full_log);
1781 if (full_log > 0) full_log--;
1782
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +00001783 if (starttls_proto)
Richard Levitte135c0af2001-11-14 13:57:52 +00001784 {
1785 BIO_printf(bio_err,"%s",mbuf);
1786 /* We don't need to know any more */
Richard Levitte85c67492007-02-16 18:12:16 +00001787 starttls_proto = PROTO_OFF;
Richard Levitte135c0af2001-11-14 13:57:52 +00001788 }
1789
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001790 if (reconnect)
1791 {
1792 reconnect--;
1793 BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1794 SSL_shutdown(con);
1795 SSL_set_connect_state(con);
1796 SHUTDOWN(SSL_get_fd(con));
1797 goto re_start;
1798 }
1799 }
1800 }
1801
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001802 ssl_pending = read_ssl && SSL_pending(con);
1803
1804 if (!ssl_pending)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001805 {
Rich Salzb3178192014-12-17 17:24:51 -05001806#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001807 if (tty_on)
1808 {
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001809 if (read_tty) openssl_fdset(fileno(stdin),&readfds);
1810 if (write_tty) openssl_fdset(fileno(stdout),&writefds);
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001811 }
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001812 if (read_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001813 openssl_fdset(SSL_get_fd(con),&readfds);
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001814 if (write_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001815 openssl_fdset(SSL_get_fd(con),&writefds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001816#else
1817 if(!tty_on || !write_tty) {
1818 if (read_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001819 openssl_fdset(SSL_get_fd(con),&readfds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001820 if (write_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001821 openssl_fdset(SSL_get_fd(con),&writefds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001822 }
1823#endif
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001824/* printf("mode tty(%d %d%d) ssl(%d%d)\n",
1825 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001826
Ulf Möller75e07701999-05-13 13:21:17 +00001827 /* Note: under VMS with SOCKETSHR the second parameter
Ulf Möller7d7d2cb1999-05-13 11:37:32 +00001828 * is currently of type (int *) whereas under other
1829 * systems it is (void *) if you don't have a cast it
1830 * will choke the compiler: if you do have a cast then
1831 * you can either go for (int *) or (void *).
1832 */
Richard Levitte3d7c4a52003-09-27 21:56:08 +00001833#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1834 /* Under Windows/DOS we make the assumption that we can
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001835 * always write to the tty: therefore if we need to
1836 * write to the tty we just fall through. Otherwise
1837 * we timeout the select every second and see if there
1838 * are any keypresses. Note: this is a hack, in a proper
1839 * Windows application we wouldn't do this.
1840 */
Ulf Möller4ec19e22000-02-20 20:59:21 +00001841 i=0;
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001842 if(!write_tty) {
1843 if(read_tty) {
1844 tv.tv_sec = 1;
1845 tv.tv_usec = 0;
1846 i=select(width,(void *)&readfds,(void *)&writefds,
1847 NULL,&tv);
Richard Levitte3d7c4a52003-09-27 21:56:08 +00001848#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
Richard Levitte0bf23d92002-11-15 22:37:18 +00001849 if(!i && (!_kbhit() || !read_tty) ) continue;
1850#else
Richard Levittea9ef75c2000-06-01 11:23:20 +00001851 if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
Richard Levitte0bf23d92002-11-15 22:37:18 +00001852#endif
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001853 } else i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001854 NULL,timeoutp);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001855 }
Richard Levitte47c17352004-06-28 11:55:28 +00001856#elif defined(OPENSSL_SYS_NETWARE)
1857 if(!write_tty) {
1858 if(read_tty) {
1859 tv.tv_sec = 1;
1860 tv.tv_usec = 0;
1861 i=select(width,(void *)&readfds,(void *)&writefds,
1862 NULL,&tv);
1863 } else i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001864 NULL,timeoutp);
Richard Levitte47c17352004-06-28 11:55:28 +00001865 }
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001866#else
Ulf Möller7d7d2cb1999-05-13 11:37:32 +00001867 i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001868 NULL,timeoutp);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001869#endif
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001870 if ( i < 0)
1871 {
1872 BIO_printf(bio_err,"bad select %d\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001873 get_last_socket_error());
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001874 goto shut;
1875 /* goto end; */
1876 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001877 }
1878
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001879 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1880 {
Veres Lajos478b50c2013-06-13 00:22:32 +01001881 BIO_printf(bio_err,"TIMEOUT occurred\n");
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001882 }
1883
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001884 if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001885 {
1886 k=SSL_write(con,&(cbuf[cbuf_off]),
1887 (unsigned int)cbuf_len);
1888 switch (SSL_get_error(con,k))
1889 {
1890 case SSL_ERROR_NONE:
1891 cbuf_off+=k;
1892 cbuf_len-=k;
1893 if (k <= 0) goto end;
1894 /* we have done a write(con,NULL,0); */
1895 if (cbuf_len <= 0)
1896 {
1897 read_tty=1;
1898 write_ssl=0;
1899 }
1900 else /* if (cbuf_len > 0) */
1901 {
1902 read_tty=0;
1903 write_ssl=1;
1904 }
1905 break;
1906 case SSL_ERROR_WANT_WRITE:
1907 BIO_printf(bio_c_out,"write W BLOCK\n");
1908 write_ssl=1;
1909 read_tty=0;
1910 break;
1911 case SSL_ERROR_WANT_READ:
1912 BIO_printf(bio_c_out,"write R BLOCK\n");
1913 write_tty=0;
1914 read_ssl=1;
1915 write_ssl=0;
1916 break;
1917 case SSL_ERROR_WANT_X509_LOOKUP:
1918 BIO_printf(bio_c_out,"write X BLOCK\n");
1919 break;
1920 case SSL_ERROR_ZERO_RETURN:
1921 if (cbuf_len != 0)
1922 {
1923 BIO_printf(bio_c_out,"shutdown\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001924 ret = 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001925 goto shut;
1926 }
1927 else
1928 {
1929 read_tty=1;
1930 write_ssl=0;
1931 break;
1932 }
1933
1934 case SSL_ERROR_SYSCALL:
1935 if ((k != 0) || (cbuf_len != 0))
1936 {
1937 BIO_printf(bio_err,"write:errno=%d\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001938 get_last_socket_error());
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001939 goto shut;
1940 }
1941 else
1942 {
1943 read_tty=1;
1944 write_ssl=0;
1945 }
1946 break;
1947 case SSL_ERROR_SSL:
1948 ERR_print_errors(bio_err);
1949 goto shut;
1950 }
1951 }
Rich Salzb3178192014-12-17 17:24:51 -05001952#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
Ulf Möller4700aea2006-04-11 21:34:21 +00001953 /* Assume Windows/DOS/BeOS can always write */
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001954 else if (!ssl_pending && write_tty)
1955#else
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001956 else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001957#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001958 {
Ulf Möllera53955d1999-06-04 21:35:58 +00001959#ifdef CHARSET_EBCDIC
1960 ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1961#endif
Andy Polyakovffa10182005-11-04 09:30:55 +00001962 i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001963
1964 if (i <= 0)
1965 {
1966 BIO_printf(bio_c_out,"DONE\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001967 ret = 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001968 goto shut;
1969 /* goto end; */
1970 }
1971
1972 sbuf_len-=i;;
1973 sbuf_off+=i;
1974 if (sbuf_len <= 0)
1975 {
1976 read_ssl=1;
1977 write_tty=0;
1978 }
1979 }
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001980 else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001981 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001982#ifdef RENEG
1983{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1984#endif
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001985#if 1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001986 k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001987#else
1988/* Demo for pending and peek :-) */
1989 k=SSL_read(con,sbuf,16);
1990{ char zbuf[10240];
1991printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1992}
1993#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001994
1995 switch (SSL_get_error(con,k))
1996 {
1997 case SSL_ERROR_NONE:
1998 if (k <= 0)
1999 goto end;
2000 sbuf_off=0;
2001 sbuf_len=k;
2002
2003 read_ssl=0;
2004 write_tty=1;
2005 break;
2006 case SSL_ERROR_WANT_WRITE:
2007 BIO_printf(bio_c_out,"read W BLOCK\n");
2008 write_ssl=1;
2009 read_tty=0;
2010 break;
2011 case SSL_ERROR_WANT_READ:
2012 BIO_printf(bio_c_out,"read R BLOCK\n");
2013 write_tty=0;
2014 read_ssl=1;
2015 if ((read_tty == 0) && (write_ssl == 0))
2016 write_ssl=1;
2017 break;
2018 case SSL_ERROR_WANT_X509_LOOKUP:
2019 BIO_printf(bio_c_out,"read X BLOCK\n");
2020 break;
2021 case SSL_ERROR_SYSCALL:
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00002022 ret=get_last_socket_error();
Dr. Stephen Henson2537d462012-12-03 03:40:57 +00002023 if (c_brief)
Dr. Stephen Henson66d9f2e2012-12-03 03:33:44 +00002024 BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
2025 else
2026 BIO_printf(bio_err,"read:errno=%d\n",ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002027 goto shut;
2028 case SSL_ERROR_ZERO_RETURN:
2029 BIO_printf(bio_c_out,"closed\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00002030 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002031 goto shut;
2032 case SSL_ERROR_SSL:
2033 ERR_print_errors(bio_err);
2034 goto shut;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002035 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002036 }
2037 }
2038
Richard Levitte3d7c4a52003-09-27 21:56:08 +00002039#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
2040#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
Richard Levitte0bf23d92002-11-15 22:37:18 +00002041 else if (_kbhit())
2042#else
Richard Levittea9ef75c2000-06-01 11:23:20 +00002043 else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
Richard Levitte0bf23d92002-11-15 22:37:18 +00002044#endif
Richard Levitte4d8743f2003-11-28 13:10:58 +00002045#elif defined (OPENSSL_SYS_NETWARE)
Andy Polyakovffa10182005-11-04 09:30:55 +00002046 else if (_kbhit())
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002047#else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002048 else if (FD_ISSET(fileno(stdin),&readfds))
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00002049#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002050 {
Bodo Möller1bdb8631999-08-07 02:51:10 +00002051 if (crlf)
2052 {
2053 int j, lf_num;
2054
Andy Polyakovffa10182005-11-04 09:30:55 +00002055 i=raw_read_stdin(cbuf,BUFSIZZ/2);
Bodo Möller1bdb8631999-08-07 02:51:10 +00002056 lf_num = 0;
2057 /* both loops are skipped when i <= 0 */
2058 for (j = 0; j < i; j++)
2059 if (cbuf[j] == '\n')
2060 lf_num++;
2061 for (j = i-1; j >= 0; j--)
2062 {
2063 cbuf[j+lf_num] = cbuf[j];
2064 if (cbuf[j] == '\n')
2065 {
2066 lf_num--;
2067 i++;
2068 cbuf[j+lf_num] = '\r';
2069 }
2070 }
2071 assert(lf_num == 0);
2072 }
2073 else
Andy Polyakovffa10182005-11-04 09:30:55 +00002074 i=raw_read_stdin(cbuf,BUFSIZZ);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002075
Richard Levittece301b62000-03-10 12:18:28 +00002076 if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002077 {
2078 BIO_printf(bio_err,"DONE\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00002079 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002080 goto shut;
2081 }
2082
Richard Levittece301b62000-03-10 12:18:28 +00002083 if ((!c_ign_eof) && (cbuf[0] == 'R'))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002084 {
Ben Laurie3bb307c1999-04-10 12:08:46 +00002085 BIO_printf(bio_err,"RENEGOTIATING\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002086 SSL_renegotiate(con);
Ben Laurie3bb307c1999-04-10 12:08:46 +00002087 cbuf_len=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002088 }
Dr. Stephen Henson48175042011-12-31 22:59:57 +00002089#ifndef OPENSSL_NO_HEARTBEATS
2090 else if ((!c_ign_eof) && (cbuf[0] == 'B'))
2091 {
2092 BIO_printf(bio_err,"HEARTBEATING\n");
2093 SSL_heartbeat(con);
2094 cbuf_len=0;
2095 }
2096#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002097 else
2098 {
2099 cbuf_len=i;
2100 cbuf_off=0;
Ulf Möllera53955d1999-06-04 21:35:58 +00002101#ifdef CHARSET_EBCDIC
2102 ebcdic2ascii(cbuf, cbuf, i);
2103#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002104 }
2105
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002106 write_ssl=1;
Ben Laurie3bb307c1999-04-10 12:08:46 +00002107 read_tty=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002108 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002109 }
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00002110
2111 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002112shut:
Bodo Möllerb166f132006-06-15 19:00:34 +00002113 if (in_init)
2114 print_stuff(bio_c_out,con,full_log);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002115 SSL_shutdown(con);
2116 SHUTDOWN(SSL_get_fd(con));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002117end:
Nils Larschd916ba12006-03-18 14:24:02 +00002118 if (con != NULL)
2119 {
2120 if (prexit != 0)
2121 print_stuff(bio_c_out,con,1);
2122 SSL_free(con);
2123 }
Dr. Stephen Hensondd251652012-07-03 16:37:50 +00002124#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2125 if (next_proto.data)
2126 OPENSSL_free(next_proto.data);
2127#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002128 if (ctx != NULL) SSL_CTX_free(ctx);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002129 if (cert)
2130 X509_free(cert);
Dr. Stephen Hensonfdb78f32012-12-02 16:16:28 +00002131 if (crls)
2132 sk_X509_CRL_pop_free(crls, X509_CRL_free);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002133 if (key)
2134 EVP_PKEY_free(key);
Dr. Stephen Henson4e71d952012-12-12 00:50:26 +00002135 if (chain)
2136 sk_X509_pop_free(chain, X509_free);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00002137 if (pass)
2138 OPENSSL_free(pass);
Dr. Stephen Henson22b5d7c2012-11-20 00:24:52 +00002139 if (vpm)
2140 X509_VERIFY_PARAM_free(vpm);
Dr. Stephen Henson3208fc52012-07-03 14:53:27 +00002141 ssl_excert_free(exc);
Dr. Stephen Henson5d2e07f2012-11-17 14:42:22 +00002142 if (ssl_args)
2143 sk_OPENSSL_STRING_free(ssl_args);
2144 if (cctx)
2145 SSL_CONF_CTX_free(cctx);
Dr. Stephen Hensonb252cf02012-12-29 23:38:20 +00002146#ifndef OPENSSL_NO_JPAKE
2147 if (jpake_secret && psk_key)
2148 OPENSSL_free(psk_key);
2149#endif
Richard Levitte45799242002-11-28 08:04:36 +00002150 if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
2151 if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
2152 if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002153 if (bio_c_out != NULL)
2154 {
2155 BIO_free(bio_c_out);
2156 bio_c_out=NULL;
2157 }
Dr. Stephen Henson93ab9e42012-06-15 12:46:09 +00002158 if (bio_c_msg != NULL)
2159 {
2160 BIO_free(bio_c_msg);
2161 bio_c_msg=NULL;
2162 }
Richard Levittec04f8cf2001-06-23 16:37:32 +00002163 apps_shutdown();
Richard Levitte1c3e4a32002-12-03 16:33:03 +00002164 OPENSSL_EXIT(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002165 }
2166
2167
Ulf Möller6b691a51999-04-19 21:31:43 +00002168static void print_stuff(BIO *bio, SSL *s, int full)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002169 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002170 X509 *peer=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002171 char buf[BUFSIZ];
Ben Laurief73e07c1999-04-12 17:23:57 +00002172 STACK_OF(X509) *sk;
2173 STACK_OF(X509_NAME) *sk2;
Ben Lauriebabb3792008-10-12 14:32:47 +00002174 const SSL_CIPHER *c;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002175 X509_NAME *xn;
Kurt Roeckx45f55f62014-11-30 15:35:22 +01002176 int i;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002177#ifndef OPENSSL_NO_COMP
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00002178 const COMP_METHOD *comp, *expansion;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002179#endif
Ben Lauriee0af0402011-11-15 23:50:52 +00002180 unsigned char *exportedkeymat;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002181
2182 if (full)
2183 {
Bodo Möllerbc2e5191999-05-17 20:46:43 +00002184 int got_a_chain = 0;
2185
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002186 sk=SSL_get_peer_cert_chain(s);
2187 if (sk != NULL)
2188 {
Bodo Möllerbc2e5191999-05-17 20:46:43 +00002189 got_a_chain = 1; /* we don't have it for SSL2 (yet) */
2190
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00002191 BIO_printf(bio,"---\nCertificate chain\n");
Ben Laurief73e07c1999-04-12 17:23:57 +00002192 for (i=0; i<sk_X509_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002193 {
Ben Laurief73e07c1999-04-12 17:23:57 +00002194 X509_NAME_oneline(X509_get_subject_name(
Ben Laurie54a656e2002-11-13 15:43:43 +00002195 sk_X509_value(sk,i)),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002196 BIO_printf(bio,"%2d s:%s\n",i,buf);
Ben Laurief73e07c1999-04-12 17:23:57 +00002197 X509_NAME_oneline(X509_get_issuer_name(
Ben Laurie54a656e2002-11-13 15:43:43 +00002198 sk_X509_value(sk,i)),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002199 BIO_printf(bio," i:%s\n",buf);
Bodo Möller6d02d8e1999-03-31 12:06:30 +00002200 if (c_showcerts)
Ben Laurief73e07c1999-04-12 17:23:57 +00002201 PEM_write_bio_X509(bio,sk_X509_value(sk,i));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002202 }
2203 }
2204
2205 BIO_printf(bio,"---\n");
2206 peer=SSL_get_peer_certificate(s);
2207 if (peer != NULL)
2208 {
2209 BIO_printf(bio,"Server certificate\n");
Bodo Möllerbc2e5191999-05-17 20:46:43 +00002210 if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
Bodo Möller6d02d8e1999-03-31 12:06:30 +00002211 PEM_write_bio_X509(bio,peer);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002212 X509_NAME_oneline(X509_get_subject_name(peer),
Ben Laurie54a656e2002-11-13 15:43:43 +00002213 buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002214 BIO_printf(bio,"subject=%s\n",buf);
2215 X509_NAME_oneline(X509_get_issuer_name(peer),
Ben Laurie54a656e2002-11-13 15:43:43 +00002216 buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002217 BIO_printf(bio,"issuer=%s\n",buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002218 }
2219 else
2220 BIO_printf(bio,"no peer certificate available\n");
2221
Ben Laurief73e07c1999-04-12 17:23:57 +00002222 sk2=SSL_get_client_CA_list(s);
Bodo Möllerd91f8c31999-04-14 23:10:11 +00002223 if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002224 {
2225 BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
Ben Laurief73e07c1999-04-12 17:23:57 +00002226 for (i=0; i<sk_X509_NAME_num(sk2); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002227 {
Ben Laurief73e07c1999-04-12 17:23:57 +00002228 xn=sk_X509_NAME_value(sk2,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002229 X509_NAME_oneline(xn,buf,sizeof(buf));
2230 BIO_write(bio,buf,strlen(buf));
2231 BIO_write(bio,"\n",1);
2232 }
2233 }
2234 else
2235 {
2236 BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2237 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002238
Dr. Stephen Henson9f27b1e2012-07-08 14:22:45 +00002239 ssl_print_sigalgs(bio, s);
Dr. Stephen Henson33a8de62012-09-08 13:59:51 +00002240 ssl_print_tmp_key(bio, s);
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00002241
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002242 BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2243 BIO_number_read(SSL_get_rbio(s)),
2244 BIO_number_written(SSL_get_wbio(s)));
2245 }
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00002246 BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002247 c=SSL_get_current_cipher(s);
2248 BIO_printf(bio,"%s, Cipher is %s\n",
2249 SSL_CIPHER_get_version(c),
2250 SSL_CIPHER_get_name(c));
Dr. Stephen Hensona8236c81999-02-15 21:05:21 +00002251 if (peer != NULL) {
2252 EVP_PKEY *pktmp;
2253 pktmp = X509_get_pubkey(peer);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002254 BIO_printf(bio,"Server public key is %d bit\n",
Dr. Stephen Hensona8236c81999-02-15 21:05:21 +00002255 EVP_PKEY_bits(pktmp));
2256 EVP_PKEY_free(pktmp);
2257 }
Dr. Stephen Henson54302002009-12-08 13:42:08 +00002258 BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2259 SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002260#ifndef OPENSSL_NO_COMP
Richard Levittef44e1842003-10-06 12:19:38 +00002261 comp=SSL_get_current_compression(s);
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00002262 expansion=SSL_get_current_expansion(s);
Richard Levittef44e1842003-10-06 12:19:38 +00002263 BIO_printf(bio,"Compression: %s\n",
2264 comp ? SSL_COMP_get_name(comp) : "NONE");
2265 BIO_printf(bio,"Expansion: %s\n",
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00002266 expansion ? SSL_COMP_get_name(expansion) : "NONE");
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002267#endif
Ben Laurie71fa4512012-06-03 22:00:21 +00002268
Dr. Stephen Henson57559472012-02-09 15:43:58 +00002269#ifdef SSL_DEBUG
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002270 {
2271 /* Print out local port of connection: useful for debugging */
2272 int sock;
2273 struct sockaddr_in ladd;
2274 socklen_t ladd_size = sizeof(ladd);
2275 sock = SSL_get_fd(s);
2276 getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2277 BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2278 }
2279#endif
2280
Adam Langley6f017a82013-04-15 18:07:47 -04002281#if !defined(OPENSSL_NO_TLSEXT)
2282# if !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurie71fa4512012-06-03 22:00:21 +00002283 if (next_proto.status != -1) {
2284 const unsigned char *proto;
2285 unsigned int proto_len;
2286 SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2287 BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2288 BIO_write(bio, proto, proto_len);
2289 BIO_write(bio, "\n", 1);
2290 }
Piotr Sikora29115752013-11-13 15:20:22 -08002291# endif
Adam Langley6f017a82013-04-15 18:07:47 -04002292 {
2293 const unsigned char *proto;
2294 unsigned int proto_len;
2295 SSL_get0_alpn_selected(s, &proto, &proto_len);
2296 if (proto_len > 0)
2297 {
2298 BIO_printf(bio, "ALPN protocol: ");
2299 BIO_write(bio, proto, proto_len);
2300 BIO_write(bio, "\n", 1);
2301 }
2302 else
2303 BIO_printf(bio, "No ALPN negotiated\n");
2304 }
Ben Laurie71fa4512012-06-03 22:00:21 +00002305#endif
2306
Piotr Sikorae783bae2014-12-22 11:15:51 +00002307#ifndef OPENSSL_NO_SRTP
Ben Laurie333f9262011-11-15 22:59:20 +00002308 {
2309 SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2310
2311 if(srtp_profile)
2312 BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2313 srtp_profile->name);
2314 }
Piotr Sikorae783bae2014-12-22 11:15:51 +00002315#endif
Ben Laurie333f9262011-11-15 22:59:20 +00002316
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002317 SSL_SESSION_print(bio,SSL_get_session(s));
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002318 if (keymatexportlabel != NULL)
2319 {
Ben Lauriee0af0402011-11-15 23:50:52 +00002320 BIO_printf(bio, "Keying material exporter:\n");
2321 BIO_printf(bio, " Label: '%s'\n", keymatexportlabel);
2322 BIO_printf(bio, " Length: %i bytes\n", keymatexportlen);
2323 exportedkeymat = OPENSSL_malloc(keymatexportlen);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002324 if (exportedkeymat != NULL)
2325 {
2326 if (!SSL_export_keying_material(s, exportedkeymat,
2327 keymatexportlen,
2328 keymatexportlabel,
2329 strlen(keymatexportlabel),
2330 NULL, 0, 0))
2331 {
2332 BIO_printf(bio, " Error\n");
2333 }
2334 else
2335 {
Ben Lauriee0af0402011-11-15 23:50:52 +00002336 BIO_printf(bio, " Keying material: ");
2337 for (i=0; i<keymatexportlen; i++)
2338 BIO_printf(bio, "%02X",
2339 exportedkeymat[i]);
2340 BIO_printf(bio, "\n");
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002341 }
Ben Lauriee0af0402011-11-15 23:50:52 +00002342 OPENSSL_free(exportedkeymat);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002343 }
Ben Lauriee0af0402011-11-15 23:50:52 +00002344 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002345 BIO_printf(bio,"---\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002346 if (peer != NULL)
2347 X509_free(peer);
Lutz Jänicke41ebed22001-10-16 14:24:46 +00002348 /* flush, or debugging output gets mixed with http response */
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00002349 (void)BIO_flush(bio);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002350 }
2351
Dr. Stephen Henson07021502008-09-03 12:29:57 +00002352#ifndef OPENSSL_NO_TLSEXT
2353
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00002354static int ocsp_resp_cb(SSL *s, void *arg)
2355 {
2356 const unsigned char *p;
2357 int len;
2358 OCSP_RESPONSE *rsp;
2359 len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2360 BIO_puts(arg, "OCSP response: ");
2361 if (!p)
2362 {
2363 BIO_puts(arg, "no response sent\n");
2364 return 1;
2365 }
2366 rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2367 if (!rsp)
2368 {
2369 BIO_puts(arg, "response parse error\n");
2370 BIO_dump_indent(arg, (char *)p, len, 4);
2371 return 0;
2372 }
2373 BIO_puts(arg, "\n======================================\n");
2374 OCSP_RESPONSE_print(arg, rsp, 0);
2375 BIO_puts(arg, "======================================\n");
2376 OCSP_RESPONSE_free(rsp);
2377 return 1;
2378 }
Dr. Stephen Henson07021502008-09-03 12:29:57 +00002379
2380#endif