blob: 556563e14d976cb776be4f195cdea4e15b128907 [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>
Richard Levittecf1b7d92001-02-19 16:06:34 +0000144#ifdef OPENSSL_NO_STDIO
Ulf Möller8c197cc1999-07-28 23:25:59 +0000145#define APPS_WIN16
146#endif
147
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000148/* With IPv6, it looks like Digital has mixed up the proper order of
149 recursive header file inclusion, resulting in the compiler complaining
150 that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
151 is needed to have fileno() declared correctly... So let's define u_int */
Richard Levittebc36ee62001-02-20 08:13:47 +0000152#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000153#define __U_INT
154typedef unsigned int u_int;
155#endif
156
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000157#define USE_SOCKETS
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000158#include "apps.h"
Bodo Möllerec577821999-04-23 22:13:45 +0000159#include <openssl/x509.h>
160#include <openssl/ssl.h>
161#include <openssl/err.h>
162#include <openssl/pem.h>
Geoff Thorpe13729652001-09-12 02:39:06 +0000163#include <openssl/rand.h>
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000164#include <openssl/ocsp.h>
Geoff Thorpe1e26a8b2008-03-16 21:05:46 +0000165#include <openssl/bn.h>
Ben Laurieedc032b2011-03-12 17:01:19 +0000166#ifndef OPENSSL_NO_SRP
167#include <openssl/srp.h>
168#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000169#include "s_apps.h"
Ben Laurie36d16f82005-04-26 16:02:40 +0000170#include "timeouts.h"
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000171
Richard Levittebc36ee62001-02-20 08:13:47 +0000172#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
Ulf Möller75e07701999-05-13 13:21:17 +0000173/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
Ulf Möller7d7d2cb1999-05-13 11:37:32 +0000174#undef FIONBIO
175#endif
176
Ulf Möller4700aea2006-04-11 21:34:21 +0000177#if defined(OPENSSL_SYS_BEOS_R5)
178#include <fcntl.h>
179#endif
180
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000181#undef PROG
182#define PROG s_client_main
183
184/*#define SSL_HOST_NAME "www.netscape.com" */
185/*#define SSL_HOST_NAME "193.118.187.102" */
186#define SSL_HOST_NAME "localhost"
187
188/*#define TEST_CERT "client.pem" */ /* no default cert. */
189
190#undef BUFSIZZ
191#define BUFSIZZ 1024*8
192
193extern int verify_depth;
194extern int verify_error;
Dr. Stephen Henson5d20c4f2006-09-17 17:16:28 +0000195extern int verify_return_error;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000196
197#ifdef FIONBIO
198static int c_nbio=0;
199#endif
200static int c_Pause=0;
201static int c_debug=0;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000202#ifndef OPENSSL_NO_TLSEXT
203static int c_tlsextdebug=0;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000204static int c_status_req=0;
Ben Lauriea9e1c502012-05-30 10:10:58 +0000205static int c_proof_debug=0;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000206#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000207static int c_msg=0;
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000208static int c_showcerts=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000209
Ben Lauriee0af0402011-11-15 23:50:52 +0000210static char *keymatexportlabel=NULL;
211static int keymatexportlen=20;
212
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000213static void sc_usage(void);
214static void print_stuff(BIO *berr,SSL *con,int full);
Dr. Stephen Henson07021502008-09-03 12:29:57 +0000215#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000216static int ocsp_resp_cb(SSL *s, void *arg);
Ben Lauriea9e1c502012-05-30 10:10:58 +0000217static int audit_proof_cb(SSL *s, void *arg);
Dr. Stephen Henson07021502008-09-03 12:29:57 +0000218#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000219static BIO *bio_c_out=NULL;
220static int c_quiet=0;
Richard Levittece301b62000-03-10 12:18:28 +0000221static int c_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000222
Nils Larschddac1972006-03-10 23:06:27 +0000223#ifndef OPENSSL_NO_PSK
224/* Default PSK identity and key */
225static char *psk_identity="Client_identity";
Ben Laurief3b7bda2008-11-16 12:47:12 +0000226/*char *psk_key=NULL; by default PSK is not used */
Nils Larschddac1972006-03-10 23:06:27 +0000227
228static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
229 unsigned int max_identity_len, unsigned char *psk,
230 unsigned int max_psk_len)
231 {
232 unsigned int psk_len = 0;
233 int ret;
234 BIGNUM *bn=NULL;
235
236 if (c_debug)
237 BIO_printf(bio_c_out, "psk_client_cb\n");
238 if (!hint)
239 {
240 /* no ServerKeyExchange message*/
241 if (c_debug)
242 BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
243 }
244 else if (c_debug)
245 BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
246
247 /* lookup PSK identity and PSK key based on the given identity hint here */
Dr. Stephen Henson0ed6b522009-02-15 15:29:59 +0000248 ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
Nils Larscha0aa8b42006-03-11 12:18:11 +0000249 if (ret < 0 || (unsigned int)ret > max_identity_len)
Nils Larschddac1972006-03-10 23:06:27 +0000250 goto out_err;
251 if (c_debug)
252 BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
253 ret=BN_hex2bn(&bn, psk_key);
254 if (!ret)
255 {
256 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
257 if (bn)
258 BN_free(bn);
259 return 0;
260 }
261
Nils Larscha0aa8b42006-03-11 12:18:11 +0000262 if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
Nils Larschddac1972006-03-10 23:06:27 +0000263 {
264 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
265 max_psk_len, BN_num_bytes(bn));
266 BN_free(bn);
267 return 0;
268 }
269
270 psk_len=BN_bn2bin(bn, psk);
271 BN_free(bn);
272 if (psk_len == 0)
273 goto out_err;
274
275 if (c_debug)
276 BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
277
278 return psk_len;
279 out_err:
280 if (c_debug)
281 BIO_printf(bio_err, "Error in PSK client callback\n");
282 return 0;
283 }
284#endif
285
Ulf Möller6b691a51999-04-19 21:31:43 +0000286static void sc_usage(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000287 {
Ralf S. Engelschallb6cff931999-01-28 14:44:08 +0000288 BIO_printf(bio_err,"usage: s_client args\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000289 BIO_printf(bio_err,"\n");
290 BIO_printf(bio_err," -host host - use -connect instead\n");
291 BIO_printf(bio_err," -port port - use -connect instead\n");
292 BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
293
294 BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n");
295 BIO_printf(bio_err," -cert arg - certificate file to use, PEM format assumed\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000296 BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
297 BIO_printf(bio_err," -key arg - Private key file to use, in cert file if\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000298 BIO_printf(bio_err," not specified but cert file is.\n");
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000299 BIO_printf(bio_err," -keyform arg - key format (PEM or DER) PEM default\n");
300 BIO_printf(bio_err," -pass arg - private key file pass phrase source\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000301 BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
302 BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
303 BIO_printf(bio_err," -reconnect - Drop and re-make the connection with the same Session-ID\n");
304 BIO_printf(bio_err," -pause - sleep(1) after each read(2) and write(2) system call\n");
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000305 BIO_printf(bio_err," -showcerts - show all certificates in the chain\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000306 BIO_printf(bio_err," -debug - extra output\n");
Andy Polyakov02a00bb2005-01-04 10:28:38 +0000307#ifdef WATT32
308 BIO_printf(bio_err," -wdebug - WATT-32 tcp debugging\n");
309#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000310 BIO_printf(bio_err," -msg - Show protocol messages\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000311 BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n");
312 BIO_printf(bio_err," -state - print the 'ssl' states\n");
313#ifdef FIONBIO
314 BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
315#endif
Bodo Möller1bdb8631999-08-07 02:51:10 +0000316 BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000317 BIO_printf(bio_err," -quiet - no s_client output\n");
Richard Levittece301b62000-03-10 12:18:28 +0000318 BIO_printf(bio_err," -ign_eof - ignore input eof (default when -quiet)\n");
Lutz Jänicke020d67f2008-10-22 06:46:14 +0000319 BIO_printf(bio_err," -no_ign_eof - don't ignore input eof\n");
Nils Larschddac1972006-03-10 23:06:27 +0000320#ifndef OPENSSL_NO_PSK
321 BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
322 BIO_printf(bio_err," -psk arg - PSK in hex (without 0x)\n");
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000323# ifndef OPENSSL_NO_JPAKE
Ben Laurief3b7bda2008-11-16 12:47:12 +0000324 BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n");
325# endif
Nils Larschddac1972006-03-10 23:06:27 +0000326#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000327#ifndef OPENSSL_NO_SRP
328 BIO_printf(bio_err," -srpuser user - SRP authentification for 'user'\n");
329 BIO_printf(bio_err," -srppass arg - password for 'user'\n");
330 BIO_printf(bio_err," -srp_lateuser - SRP username into second ClientHello message\n");
331 BIO_printf(bio_err," -srp_moregroups - Tolerate other than the known g N values.\n");
332 BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
333#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000334 BIO_printf(bio_err," -ssl2 - just use SSLv2\n");
335 BIO_printf(bio_err," -ssl3 - just use SSLv3\n");
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000336 BIO_printf(bio_err," -tls1_2 - just use TLSv1.2\n");
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000337 BIO_printf(bio_err," -tls1_1 - just use TLSv1.1\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000338 BIO_printf(bio_err," -tls1 - just use TLSv1\n");
Ben Laurie36d16f82005-04-26 16:02:40 +0000339 BIO_printf(bio_err," -dtls1 - just use DTLSv1\n");
Dr. Stephen Henson046f2102009-05-17 16:04:58 +0000340 BIO_printf(bio_err," -mtu - set the link layer MTU\n");
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000341 BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000342 BIO_printf(bio_err," -bugs - Switch on all SSL implementation bug workarounds\n");
Lutz Jänicke836f9962001-02-09 19:56:31 +0000343 BIO_printf(bio_err," -serverpref - Use server's cipher preferences (only SSLv2)\n");
Ulf Möller657e60f2000-02-03 23:23:24 +0000344 BIO_printf(bio_err," -cipher - preferred cipher to use, use the 'openssl ciphers'\n");
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000345 BIO_printf(bio_err," command to see what is available\n");
Richard Levitte135c0af2001-11-14 13:57:52 +0000346 BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
347 BIO_printf(bio_err," for those protocols that support it, where\n");
348 BIO_printf(bio_err," 'prot' defines which one to assume. Currently,\n");
Ben Lauried5bbead2008-10-14 19:11:26 +0000349 BIO_printf(bio_err," only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
350 BIO_printf(bio_err," are supported.\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000351#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000352 BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000353#endif
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000354 BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
Dr. Stephen Henson014f62b2007-08-23 12:20:36 +0000355 BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
356 BIO_printf(bio_err," -sess_in arg - file to read SSL session from\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000357#ifndef OPENSSL_NO_TLSEXT
358 BIO_printf(bio_err," -servername host - Set TLS extension servername in ClientHello\n");
Dr. Stephen Hensond24a9c82007-08-23 11:34:48 +0000359 BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n");
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000360 BIO_printf(bio_err," -status - request certificate status from server\n");
Dr. Stephen Hensond24a9c82007-08-23 11:34:48 +0000361 BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n");
Ben Lauriea9e1c502012-05-30 10:10:58 +0000362 BIO_printf(bio_err," -proof_debug - request an audit proof and print its hex dump\n");
Ben Lauriebf488362010-09-05 17:14:01 +0000363# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000364 BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
365# endif
Bodo Möllered3883d2006-01-02 23:14:37 +0000366#endif
Dr. Stephen Henson2942dde2009-11-11 14:10:24 +0000367 BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
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");
Ben Lauriee0af0402011-11-15 23:50:52 +0000369 BIO_printf(bio_err," -keymatexport label - Export keying material using label\n");
370 BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000371 }
372
Bodo Möllered3883d2006-01-02 23:14:37 +0000373#ifndef OPENSSL_NO_TLSEXT
374
375/* This is a context that we pass to callbacks */
376typedef struct tlsextctx_st {
377 BIO * biodebug;
378 int ack;
379} tlsextctx;
380
381
Bodo Möllerb1277b92006-01-02 23:29:12 +0000382static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
383 {
Bodo Möllered3883d2006-01-02 23:14:37 +0000384 tlsextctx * p = (tlsextctx *) arg;
Richard Levitte8de5b7f2006-01-04 12:02:43 +0000385 const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Bodo Möllered3883d2006-01-02 23:14:37 +0000386 if (SSL_get_servername_type(s) != -1)
387 p->ack = !SSL_session_reused(s) && hn != NULL;
388 else
Bodo Möllerf1fd4542006-01-03 03:27:19 +0000389 BIO_printf(bio_err,"Can't use SSL_get_servername\n");
Bodo Möllered3883d2006-01-02 23:14:37 +0000390
Bodo Möller241520e2006-01-11 06:10:40 +0000391 return SSL_TLSEXT_ERR_OK;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000392 }
Ben Laurieee2ffc22010-07-28 10:06:55 +0000393
Ben Laurieedc032b2011-03-12 17:01:19 +0000394#ifndef OPENSSL_NO_SRP
395
396/* This is a context that we pass to all callbacks */
397typedef struct srp_arg_st
398 {
399 char *srppassin;
400 char *srplogin;
401 int msg; /* copy from c_msg */
402 int debug; /* copy from c_debug */
403 int amp; /* allow more groups */
404 int strength /* minimal size for N */ ;
405 } SRP_ARG;
406
407#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
408
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000409static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
Ben Laurieedc032b2011-03-12 17:01:19 +0000410 {
411 BN_CTX *bn_ctx = BN_CTX_new();
412 BIGNUM *p = BN_new();
413 BIGNUM *r = BN_new();
414 int ret =
415 g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000416 BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
Ben Laurieedc032b2011-03-12 17:01:19 +0000417 p != NULL && BN_rshift1(p, N) &&
418
419 /* p = (N-1)/2 */
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000420 BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
Ben Laurieedc032b2011-03-12 17:01:19 +0000421 r != NULL &&
422
423 /* verify g^((N-1)/2) == -1 (mod N) */
424 BN_mod_exp(r, g, p, N, bn_ctx) &&
425 BN_add_word(r, 1) &&
426 BN_cmp(r, N) == 0;
427
428 if(r)
429 BN_free(r);
430 if(p)
431 BN_free(p);
432 if(bn_ctx)
433 BN_CTX_free(bn_ctx);
434 return ret;
435 }
436
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000437/* This callback is used here for two purposes:
438 - extended debugging
439 - making some primality tests for unknown groups
440 The callback is only called for a non default group.
441
442 An application does not need the call back at all if
443 only the stanard groups are used. In real life situations,
444 client and server already share well known groups,
445 thus there is no need to verify them.
446 Furthermore, in case that a server actually proposes a group that
447 is not one of those defined in RFC 5054, it is more appropriate
448 to add the group to a static list and then compare since
449 primality tests are rather cpu consuming.
450*/
451
Ben Laurieedc032b2011-03-12 17:01:19 +0000452static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
453 {
454 SRP_ARG *srp_arg = (SRP_ARG *)arg;
455 BIGNUM *N = NULL, *g = NULL;
456 if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
457 return 0;
458 if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
459 {
460 BIO_printf(bio_err, "SRP parameters:\n");
461 BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
462 BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
463 BIO_printf(bio_err,"\n");
464 }
465
466 if (SRP_check_known_gN_param(g,N))
467 return 1;
468
469 if (srp_arg->amp == 1)
470 {
471 if (srp_arg->debug)
472 BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
473
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000474/* The srp_moregroups is a real debugging feature.
Ben Laurieedc032b2011-03-12 17:01:19 +0000475 Implementors should rather add the value to the known ones.
476 The minimal size has already been tested.
477*/
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +0000478 if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
Ben Laurieedc032b2011-03-12 17:01:19 +0000479 return 1;
480 }
481 BIO_printf(bio_err, "SRP param N and g rejected.\n");
482 return 0;
483 }
484
485#define PWD_STRLEN 1024
486
487static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
488 {
489 SRP_ARG *srp_arg = (SRP_ARG *)arg;
490 char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
491 PW_CB_DATA cb_tmp;
492 int l;
493
494 cb_tmp.password = (char *)srp_arg->srppassin;
495 cb_tmp.prompt_info = "SRP user";
496 if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
497 {
498 BIO_printf (bio_err, "Can't read Password\n");
499 OPENSSL_free(pass);
500 return NULL;
501 }
502 *(pass+l)= '\0';
503
504 return pass;
505 }
506
Ben Laurieedc032b2011-03-12 17:01:19 +0000507#endif
Ben Laurie333f9262011-11-15 22:59:20 +0000508 char *srtp_profiles = NULL;
Ben Laurieedc032b2011-03-12 17:01:19 +0000509
Ben Lauriebf488362010-09-05 17:14:01 +0000510# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000511/* This the context that we pass to next_proto_cb */
512typedef struct tlsextnextprotoctx_st {
513 unsigned char *data;
514 unsigned short len;
515 int status;
516} tlsextnextprotoctx;
517
518static tlsextnextprotoctx next_proto;
519
520static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
521 {
522 tlsextnextprotoctx *ctx = arg;
523
524 if (!c_quiet)
525 {
526 /* We can assume that |in| is syntactically valid. */
527 unsigned i;
528 BIO_printf(bio_c_out, "Protocols advertised by server: ");
529 for (i = 0; i < inlen; )
530 {
531 if (i)
532 BIO_write(bio_c_out, ", ", 2);
533 BIO_write(bio_c_out, &in[i + 1], in[i]);
534 i += in[i] + 1;
535 }
536 BIO_write(bio_c_out, "\n", 1);
537 }
538
539 ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
540 return SSL_TLSEXT_ERR_OK;
541 }
Ben Lauriebf488362010-09-05 17:14:01 +0000542# endif /* ndef OPENSSL_NO_NEXTPROTONEG */
Bodo Möllered3883d2006-01-02 23:14:37 +0000543#endif
544
Richard Levitte85c67492007-02-16 18:12:16 +0000545enum
546{
547 PROTO_OFF = 0,
548 PROTO_SMTP,
549 PROTO_POP3,
550 PROTO_IMAP,
Ben Lauried5bbead2008-10-14 19:11:26 +0000551 PROTO_FTP,
Dr. Stephen Henson640b86c2008-10-19 17:22:34 +0000552 PROTO_XMPP
Richard Levitte85c67492007-02-16 18:12:16 +0000553};
554
Ralf S. Engelschall667ac4e2000-02-11 09:47:18 +0000555int MAIN(int, char **);
556
Ulf Möller6b691a51999-04-19 21:31:43 +0000557int MAIN(int argc, char **argv)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000558 {
Dr. Stephen Hensonef51b4b2009-12-16 20:25:59 +0000559 unsigned int off=0, clr=0;
Nils Larsch67b6f1c2006-03-15 17:45:43 +0000560 SSL *con=NULL;
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +0000561#ifndef OPENSSL_NO_KRB5
562 KSSL_CTX *kctx;
563#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000564 int s,k,width,state=0;
Richard Levitte135c0af2001-11-14 13:57:52 +0000565 char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000566 int cbuf_len,cbuf_off;
567 int sbuf_len,sbuf_off;
568 fd_set readfds,writefds;
569 short port=PORT;
570 int full_log=1;
571 char *host=SSL_HOST_NAME;
572 char *cert_file=NULL,*key_file=NULL;
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000573 int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
574 char *passarg = NULL, *pass = NULL;
575 X509 *cert = NULL;
576 EVP_PKEY *key = NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000577 char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
578 int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
Bodo Möller1bdb8631999-08-07 02:51:10 +0000579 int crlf=0;
Bodo Möllerc7ac31e1999-04-09 20:54:25 +0000580 int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000581 SSL_CTX *ctx=NULL;
582 int ret=1,in_init=1,i,nbio_test=0;
Richard Levitte85c67492007-02-16 18:12:16 +0000583 int starttls_proto = PROTO_OFF;
Dr. Stephen Hensondb997792009-06-30 15:56:35 +0000584 int prexit = 0;
585 X509_VERIFY_PARAM *vpm = NULL;
586 int badarg = 0;
Nils Larsch4ebb3422005-08-14 21:48:33 +0000587 const SSL_METHOD *meth=NULL;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000588 int socket_type=SOCK_STREAM;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000589 BIO *sbio;
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000590 char *inrand=NULL;
Richard Levitte85c67492007-02-16 18:12:16 +0000591 int mbuf_len=0;
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +0000592 struct timeval timeout, *timeoutp;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000593#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000594 char *engine_id=NULL;
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +0000595 char *ssl_client_engine_id=NULL;
Dr. Stephen Henson70531c12008-12-20 17:04:40 +0000596 ENGINE *ssl_client_engine=NULL;
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000597#endif
Dr. Stephen Henson70531c12008-12-20 17:04:40 +0000598 ENGINE *e=NULL;
Ulf Möller4700aea2006-04-11 21:34:21 +0000599#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
Dr. Stephen Henson06f45361999-09-20 22:09:17 +0000600 struct timeval tv;
Ulf Möller4700aea2006-04-11 21:34:21 +0000601#if defined(OPENSSL_SYS_BEOS_R5)
602 int stdin_set = 0;
603#endif
Dr. Stephen Henson06f45361999-09-20 22:09:17 +0000604#endif
Bodo Möllered3883d2006-01-02 23:14:37 +0000605#ifndef OPENSSL_NO_TLSEXT
606 char *servername = NULL;
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000607 char *curves=NULL;
Bodo Möllered3883d2006-01-02 23:14:37 +0000608 tlsextctx tlsextcbp =
609 {NULL,0};
Ben Lauriebf488362010-09-05 17:14:01 +0000610# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000611 const char *next_proto_neg_in = NULL;
612# endif
Bodo Möllered3883d2006-01-02 23:14:37 +0000613#endif
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000614 char *sess_in = NULL;
615 char *sess_out = NULL;
Ben Laurie36d16f82005-04-26 16:02:40 +0000616 struct sockaddr peer;
Dr. Stephen Henson6c617262005-04-27 16:27:14 +0000617 int peerlen = sizeof(peer);
Ben Laurie36d16f82005-04-26 16:02:40 +0000618 int enable_timeouts = 0 ;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000619 long socket_mtu = 0;
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000620#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +0000621 char *jpake_secret = NULL;
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +0000622#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000623#ifndef OPENSSL_NO_SRP
624 char * srppass = NULL;
625 int srp_lateuser = 0;
626 SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
627#endif
Ben Laurie36d16f82005-04-26 16:02:40 +0000628
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000629 meth=SSLv23_client_method();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000630
631 apps_startup();
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000632 c_Pause=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000633 c_quiet=0;
Richard Levittece301b62000-03-10 12:18:28 +0000634 c_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000635 c_debug=0;
Bodo Möllera661b652001-10-20 17:56:36 +0000636 c_msg=0;
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000637 c_showcerts=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000638
639 if (bio_err == NULL)
640 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
641
Dr. Stephen Henson3647bee2002-02-22 14:01:21 +0000642 if (!load_config(bio_err, NULL))
643 goto end;
644
Richard Levitte26a3a482000-06-01 22:19:21 +0000645 if ( ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
Richard Levitte135c0af2001-11-14 13:57:52 +0000646 ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
647 ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000648 {
649 BIO_printf(bio_err,"out of memory\n");
650 goto end;
651 }
652
653 verify_depth=0;
654 verify_error=X509_V_OK;
655#ifdef FIONBIO
656 c_nbio=0;
657#endif
658
659 argc--;
660 argv++;
661 while (argc >= 1)
662 {
663 if (strcmp(*argv,"-host") == 0)
664 {
665 if (--argc < 1) goto bad;
666 host= *(++argv);
667 }
668 else if (strcmp(*argv,"-port") == 0)
669 {
670 if (--argc < 1) goto bad;
671 port=atoi(*(++argv));
672 if (port == 0) goto bad;
673 }
674 else if (strcmp(*argv,"-connect") == 0)
675 {
676 if (--argc < 1) goto bad;
677 if (!extract_host_port(*(++argv),&host,NULL,&port))
678 goto bad;
679 }
680 else if (strcmp(*argv,"-verify") == 0)
681 {
682 verify=SSL_VERIFY_PEER;
683 if (--argc < 1) goto bad;
684 verify_depth=atoi(*(++argv));
685 BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
686 }
687 else if (strcmp(*argv,"-cert") == 0)
688 {
689 if (--argc < 1) goto bad;
690 cert_file= *(++argv);
691 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000692 else if (strcmp(*argv,"-sess_out") == 0)
693 {
694 if (--argc < 1) goto bad;
695 sess_out = *(++argv);
696 }
697 else if (strcmp(*argv,"-sess_in") == 0)
698 {
699 if (--argc < 1) goto bad;
700 sess_in = *(++argv);
701 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000702 else if (strcmp(*argv,"-certform") == 0)
703 {
704 if (--argc < 1) goto bad;
705 cert_format = str2fmt(*(++argv));
706 }
Dr. Stephen Hensondb997792009-06-30 15:56:35 +0000707 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
708 {
709 if (badarg)
710 goto bad;
711 continue;
712 }
Dr. Stephen Henson5d20c4f2006-09-17 17:16:28 +0000713 else if (strcmp(*argv,"-verify_return_error") == 0)
714 verify_return_error = 1;
Dr. Stephen Hensonc3ed3b62000-01-08 19:05:47 +0000715 else if (strcmp(*argv,"-prexit") == 0)
716 prexit=1;
Bodo Möller1bdb8631999-08-07 02:51:10 +0000717 else if (strcmp(*argv,"-crlf") == 0)
718 crlf=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000719 else if (strcmp(*argv,"-quiet") == 0)
Richard Levittece301b62000-03-10 12:18:28 +0000720 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000721 c_quiet=1;
Richard Levittece301b62000-03-10 12:18:28 +0000722 c_ign_eof=1;
723 }
724 else if (strcmp(*argv,"-ign_eof") == 0)
725 c_ign_eof=1;
Lutz Jänicke020d67f2008-10-22 06:46:14 +0000726 else if (strcmp(*argv,"-no_ign_eof") == 0)
727 c_ign_eof=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000728 else if (strcmp(*argv,"-pause") == 0)
729 c_Pause=1;
730 else if (strcmp(*argv,"-debug") == 0)
731 c_debug=1;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000732#ifndef OPENSSL_NO_TLSEXT
733 else if (strcmp(*argv,"-tlsextdebug") == 0)
734 c_tlsextdebug=1;
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +0000735 else if (strcmp(*argv,"-status") == 0)
736 c_status_req=1;
Ben Lauriea9e1c502012-05-30 10:10:58 +0000737 else if (strcmp(*argv,"-proof_debug") == 0)
738 c_proof_debug=1;
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000739#endif
Andy Polyakov02a00bb2005-01-04 10:28:38 +0000740#ifdef WATT32
741 else if (strcmp(*argv,"-wdebug") == 0)
742 dbug_init();
743#endif
Bodo Möllera661b652001-10-20 17:56:36 +0000744 else if (strcmp(*argv,"-msg") == 0)
745 c_msg=1;
Bodo Möller6d02d8e1999-03-31 12:06:30 +0000746 else if (strcmp(*argv,"-showcerts") == 0)
747 c_showcerts=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000748 else if (strcmp(*argv,"-nbio_test") == 0)
749 nbio_test=1;
750 else if (strcmp(*argv,"-state") == 0)
751 state=1;
Nils Larschddac1972006-03-10 23:06:27 +0000752#ifndef OPENSSL_NO_PSK
753 else if (strcmp(*argv,"-psk_identity") == 0)
754 {
755 if (--argc < 1) goto bad;
756 psk_identity=*(++argv);
757 }
758 else if (strcmp(*argv,"-psk") == 0)
759 {
760 size_t j;
761
762 if (--argc < 1) goto bad;
763 psk_key=*(++argv);
764 for (j = 0; j < strlen(psk_key); j++)
765 {
Andy Polyakova50bce82012-01-12 16:21:35 +0000766 if (isxdigit((unsigned char)psk_key[j]))
Nils Larschddac1972006-03-10 23:06:27 +0000767 continue;
768 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
769 goto bad;
770 }
771 }
772#endif
Ben Laurieedc032b2011-03-12 17:01:19 +0000773#ifndef OPENSSL_NO_SRP
774 else if (strcmp(*argv,"-srpuser") == 0)
775 {
776 if (--argc < 1) goto bad;
777 srp_arg.srplogin= *(++argv);
778 meth=TLSv1_client_method();
779 }
780 else if (strcmp(*argv,"-srppass") == 0)
781 {
782 if (--argc < 1) goto bad;
783 srppass= *(++argv);
784 meth=TLSv1_client_method();
785 }
786 else if (strcmp(*argv,"-srp_strength") == 0)
787 {
788 if (--argc < 1) goto bad;
789 srp_arg.strength=atoi(*(++argv));
790 BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
791 meth=TLSv1_client_method();
792 }
793 else if (strcmp(*argv,"-srp_lateuser") == 0)
794 {
795 srp_lateuser= 1;
796 meth=TLSv1_client_method();
797 }
798 else if (strcmp(*argv,"-srp_moregroups") == 0)
799 {
800 srp_arg.amp=1;
801 meth=TLSv1_client_method();
802 }
803#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +0000804#ifndef OPENSSL_NO_SSL2
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000805 else if (strcmp(*argv,"-ssl2") == 0)
806 meth=SSLv2_client_method();
807#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +0000808#ifndef OPENSSL_NO_SSL3
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000809 else if (strcmp(*argv,"-ssl3") == 0)
810 meth=SSLv3_client_method();
811#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +0000812#ifndef OPENSSL_NO_TLS1
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000813 else if (strcmp(*argv,"-tls1_2") == 0)
814 meth=TLSv1_2_client_method();
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000815 else if (strcmp(*argv,"-tls1_1") == 0)
816 meth=TLSv1_1_client_method();
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000817 else if (strcmp(*argv,"-tls1") == 0)
818 meth=TLSv1_client_method();
819#endif
Ben Laurie36d16f82005-04-26 16:02:40 +0000820#ifndef OPENSSL_NO_DTLS1
821 else if (strcmp(*argv,"-dtls1") == 0)
822 {
823 meth=DTLSv1_client_method();
Bodo Möllerb1277b92006-01-02 23:29:12 +0000824 socket_type=SOCK_DGRAM;
Ben Laurie36d16f82005-04-26 16:02:40 +0000825 }
826 else if (strcmp(*argv,"-timeout") == 0)
827 enable_timeouts=1;
828 else if (strcmp(*argv,"-mtu") == 0)
829 {
830 if (--argc < 1) goto bad;
Bodo Möllerb1277b92006-01-02 23:29:12 +0000831 socket_mtu = atol(*(++argv));
Ben Laurie36d16f82005-04-26 16:02:40 +0000832 }
833#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000834 else if (strcmp(*argv,"-bugs") == 0)
835 bugs=1;
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +0000836 else if (strcmp(*argv,"-keyform") == 0)
837 {
838 if (--argc < 1) goto bad;
839 key_format = str2fmt(*(++argv));
840 }
841 else if (strcmp(*argv,"-pass") == 0)
842 {
843 if (--argc < 1) goto bad;
844 passarg = *(++argv);
845 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000846 else if (strcmp(*argv,"-key") == 0)
847 {
848 if (--argc < 1) goto bad;
849 key_file= *(++argv);
850 }
851 else if (strcmp(*argv,"-reconnect") == 0)
852 {
853 reconnect=5;
854 }
855 else if (strcmp(*argv,"-CApath") == 0)
856 {
857 if (--argc < 1) goto bad;
858 CApath= *(++argv);
859 }
860 else if (strcmp(*argv,"-CAfile") == 0)
861 {
862 if (--argc < 1) goto bad;
863 CAfile= *(++argv);
864 }
Dr. Stephen Henson7409d7a2011-04-29 22:56:51 +0000865 else if (strcmp(*argv,"-no_tls1_2") == 0)
866 off|=SSL_OP_NO_TLSv1_2;
Dr. Stephen Henson637f3742009-12-07 13:31:02 +0000867 else if (strcmp(*argv,"-no_tls1_1") == 0)
868 off|=SSL_OP_NO_TLSv1_1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000869 else if (strcmp(*argv,"-no_tls1") == 0)
870 off|=SSL_OP_NO_TLSv1;
871 else if (strcmp(*argv,"-no_ssl3") == 0)
872 off|=SSL_OP_NO_SSLv3;
873 else if (strcmp(*argv,"-no_ssl2") == 0)
874 off|=SSL_OP_NO_SSLv2;
Dr. Stephen Henson566dda02005-10-08 00:18:53 +0000875 else if (strcmp(*argv,"-no_comp") == 0)
876 { off|=SSL_OP_NO_COMPRESSION; }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000877#ifndef OPENSSL_NO_TLSEXT
878 else if (strcmp(*argv,"-no_ticket") == 0)
879 { off|=SSL_OP_NO_TICKET; }
Ben Lauriebf488362010-09-05 17:14:01 +0000880# ifndef OPENSSL_NO_NEXTPROTONEG
Ben Laurieee2ffc22010-07-28 10:06:55 +0000881 else if (strcmp(*argv,"-nextprotoneg") == 0)
882 {
883 if (--argc < 1) goto bad;
884 next_proto_neg_in = *(++argv);
885 }
886# endif
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +0000887#endif
Lutz Jänicke836f9962001-02-09 19:56:31 +0000888 else if (strcmp(*argv,"-serverpref") == 0)
889 off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
Dr. Stephen Henson2942dde2009-11-11 14:10:24 +0000890 else if (strcmp(*argv,"-legacy_renegotiation") == 0)
891 off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
Dr. Stephen Hensonef51b4b2009-12-16 20:25:59 +0000892 else if (strcmp(*argv,"-legacy_server_connect") == 0)
893 { off|=SSL_OP_LEGACY_SERVER_CONNECT; }
894 else if (strcmp(*argv,"-no_legacy_server_connect") == 0)
895 { clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000896 else if (strcmp(*argv,"-cipher") == 0)
897 {
898 if (--argc < 1) goto bad;
899 cipher= *(++argv);
900 }
901#ifdef FIONBIO
902 else if (strcmp(*argv,"-nbio") == 0)
903 { c_nbio=1; }
904#endif
Richard Levitte135c0af2001-11-14 13:57:52 +0000905 else if (strcmp(*argv,"-starttls") == 0)
906 {
907 if (--argc < 1) goto bad;
908 ++argv;
909 if (strcmp(*argv,"smtp") == 0)
Richard Levitte85c67492007-02-16 18:12:16 +0000910 starttls_proto = PROTO_SMTP;
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +0000911 else if (strcmp(*argv,"pop3") == 0)
Richard Levitte85c67492007-02-16 18:12:16 +0000912 starttls_proto = PROTO_POP3;
913 else if (strcmp(*argv,"imap") == 0)
914 starttls_proto = PROTO_IMAP;
915 else if (strcmp(*argv,"ftp") == 0)
916 starttls_proto = PROTO_FTP;
Ben Lauried5bbead2008-10-14 19:11:26 +0000917 else if (strcmp(*argv, "xmpp") == 0)
918 starttls_proto = PROTO_XMPP;
Richard Levitte135c0af2001-11-14 13:57:52 +0000919 else
920 goto bad;
921 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000922#ifndef OPENSSL_NO_ENGINE
Richard Levitte5270e702000-10-26 21:07:28 +0000923 else if (strcmp(*argv,"-engine") == 0)
924 {
925 if (--argc < 1) goto bad;
926 engine_id = *(++argv);
927 }
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +0000928 else if (strcmp(*argv,"-ssl_client_engine") == 0)
929 {
930 if (--argc < 1) goto bad;
931 ssl_client_engine_id = *(++argv);
932 }
Richard Levitte0b13e9f2003-01-30 17:39:26 +0000933#endif
Lutz Jänicke52b621d2001-02-15 10:22:07 +0000934 else if (strcmp(*argv,"-rand") == 0)
935 {
936 if (--argc < 1) goto bad;
937 inrand= *(++argv);
938 }
Bodo Möllered3883d2006-01-02 23:14:37 +0000939#ifndef OPENSSL_NO_TLSEXT
940 else if (strcmp(*argv,"-servername") == 0)
941 {
942 if (--argc < 1) goto bad;
943 servername= *(++argv);
944 /* meth=TLSv1_client_method(); */
945 }
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000946 else if (strcmp(*argv,"-curves") == 0)
947 {
948 if (--argc < 1) goto bad;
949 curves= *(++argv);
950 }
Bodo Möllered3883d2006-01-02 23:14:37 +0000951#endif
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000952#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +0000953 else if (strcmp(*argv,"-jpake") == 0)
954 {
955 if (--argc < 1) goto bad;
956 jpake_secret = *++argv;
957 }
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +0000958#endif
Ben Laurie333f9262011-11-15 22:59:20 +0000959 else if (strcmp(*argv,"-use_srtp") == 0)
960 {
961 if (--argc < 1) goto bad;
962 srtp_profiles = *(++argv);
963 }
Ben Lauriee0af0402011-11-15 23:50:52 +0000964 else if (strcmp(*argv,"-keymatexport") == 0)
965 {
966 if (--argc < 1) goto bad;
967 keymatexportlabel= *(++argv);
968 }
969 else if (strcmp(*argv,"-keymatexportlen") == 0)
970 {
971 if (--argc < 1) goto bad;
972 keymatexportlen=atoi(*(++argv));
973 if (keymatexportlen == 0) goto bad;
974 }
Ben Laurie333f9262011-11-15 22:59:20 +0000975 else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000976 {
977 BIO_printf(bio_err,"unknown option %s\n",*argv);
978 badop=1;
979 break;
980 }
981 argc--;
982 argv++;
983 }
984 if (badop)
985 {
986bad:
987 sc_usage();
988 goto end;
989 }
990
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +0000991#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
Ben Laurief3b7bda2008-11-16 12:47:12 +0000992 if (jpake_secret)
993 {
994 if (psk_key)
995 {
996 BIO_printf(bio_err,
997 "Can't use JPAKE and PSK together\n");
998 goto end;
999 }
1000 psk_identity = "JPAKE";
1001 }
1002
1003 if (cipher)
1004 {
1005 BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1006 goto end;
1007 }
1008 cipher = "PSK";
1009#endif
1010
Richard Levittecead7f32002-07-16 06:52:03 +00001011 OpenSSL_add_ssl_algorithms();
1012 SSL_load_error_strings();
1013
Ben Lauriebf488362010-09-05 17:14:01 +00001014#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00001015 next_proto.status = -1;
1016 if (next_proto_neg_in)
1017 {
1018 next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1019 if (next_proto.data == NULL)
1020 {
1021 BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1022 goto end;
1023 }
1024 }
1025 else
1026 next_proto.data = NULL;
1027#endif
1028
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001029#ifndef OPENSSL_NO_ENGINE
Richard Levittecead7f32002-07-16 06:52:03 +00001030 e = setup_engine(bio_err, engine_id, 1);
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +00001031 if (ssl_client_engine_id)
1032 {
1033 ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1034 if (!ssl_client_engine)
1035 {
1036 BIO_printf(bio_err,
1037 "Error getting client auth engine\n");
1038 goto end;
1039 }
1040 }
1041
Richard Levitte0b13e9f2003-01-30 17:39:26 +00001042#endif
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001043 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1044 {
1045 BIO_printf(bio_err, "Error getting password\n");
1046 goto end;
1047 }
1048
1049 if (key_file == NULL)
1050 key_file = cert_file;
1051
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001052
1053 if (key_file)
1054
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001055 {
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001056
1057 key = load_key(bio_err, key_file, key_format, 0, pass, e,
1058 "client certificate private key file");
1059 if (!key)
1060 {
1061 ERR_print_errors(bio_err);
1062 goto end;
1063 }
1064
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001065 }
1066
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001067 if (cert_file)
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001068
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001069 {
Dr. Stephen Hensonabbc1862004-12-13 18:02:23 +00001070 cert = load_cert(bio_err,cert_file,cert_format,
1071 NULL, e, "client certificate file");
1072
1073 if (!cert)
1074 {
1075 ERR_print_errors(bio_err);
1076 goto end;
1077 }
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001078 }
Richard Levittecead7f32002-07-16 06:52:03 +00001079
Lutz Jänicke52b621d2001-02-15 10:22:07 +00001080 if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1081 && !RAND_status())
1082 {
1083 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1084 }
1085 if (inrand != NULL)
1086 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1087 app_RAND_load_files(inrand));
Bodo Möllera31011e1999-10-26 01:56:29 +00001088
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001089 if (bio_c_out == NULL)
1090 {
Bodo Möllera661b652001-10-20 17:56:36 +00001091 if (c_quiet && !c_debug && !c_msg)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001092 {
1093 bio_c_out=BIO_new(BIO_s_null());
1094 }
1095 else
1096 {
1097 if (bio_c_out == NULL)
1098 bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1099 }
1100 }
1101
Ben Laurieedc032b2011-03-12 17:01:19 +00001102#ifndef OPENSSL_NO_SRP
1103 if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1104 {
1105 BIO_printf(bio_err, "Error getting password\n");
1106 goto end;
1107 }
1108#endif
1109
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001110 ctx=SSL_CTX_new(meth);
1111 if (ctx == NULL)
1112 {
1113 ERR_print_errors(bio_err);
1114 goto end;
1115 }
1116
Dr. Stephen Hensondb997792009-06-30 15:56:35 +00001117 if (vpm)
1118 SSL_CTX_set1_param(ctx, vpm);
1119
Dr. Stephen Henson59d2d482008-06-03 11:26:27 +00001120#ifndef OPENSSL_NO_ENGINE
1121 if (ssl_client_engine)
1122 {
1123 if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1124 {
1125 BIO_puts(bio_err, "Error setting client auth engine\n");
1126 ERR_print_errors(bio_err);
1127 ENGINE_free(ssl_client_engine);
1128 goto end;
1129 }
1130 ENGINE_free(ssl_client_engine);
1131 }
1132#endif
1133
Nils Larschddac1972006-03-10 23:06:27 +00001134#ifndef OPENSSL_NO_PSK
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001135#ifdef OPENSSL_NO_JPAKE
1136 if (psk_key != NULL)
1137#else
Ben Laurief3b7bda2008-11-16 12:47:12 +00001138 if (psk_key != NULL || jpake_secret)
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001139#endif
Nils Larschddac1972006-03-10 23:06:27 +00001140 {
1141 if (c_debug)
Ben Laurief3b7bda2008-11-16 12:47:12 +00001142 BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
Nils Larschddac1972006-03-10 23:06:27 +00001143 SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1144 }
Ben Laurie333f9262011-11-15 22:59:20 +00001145 if (srtp_profiles != NULL)
1146 SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
Nils Larschddac1972006-03-10 23:06:27 +00001147#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001148 if (bugs)
1149 SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1150 else
1151 SSL_CTX_set_options(ctx,off);
Dr. Stephen Hensonef51b4b2009-12-16 20:25:59 +00001152
1153 if (clr)
1154 SSL_CTX_clear_options(ctx, clr);
Ben Laurie36d16f82005-04-26 16:02:40 +00001155 /* DTLS: partial reads end up discarding unread UDP bytes :-(
1156 * Setting read ahead solves this problem.
1157 */
Bodo Möllerb1277b92006-01-02 23:29:12 +00001158 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001159
Ben Lauriebf488362010-09-05 17:14:01 +00001160#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
Ben Laurieee2ffc22010-07-28 10:06:55 +00001161 if (next_proto.data)
1162 SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1163#endif
1164
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001165 if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1166 if (cipher != NULL)
Dr. Stephen Hensonfabce042000-01-23 02:28:08 +00001167 if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
Ulf Möller657e60f2000-02-03 23:23:24 +00001168 BIO_printf(bio_err,"error setting cipher list\n");
Dr. Stephen Hensonfabce042000-01-23 02:28:08 +00001169 ERR_print_errors(bio_err);
1170 goto end;
1171 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001172#if 0
1173 else
1174 SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1175#endif
1176
1177 SSL_CTX_set_verify(ctx,verify,verify_callback);
Dr. Stephen Hensonfc6fc7f2012-04-11 16:53:11 +00001178 if (!set_cert_key_stuff(ctx,cert,key, NULL))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001179 goto end;
1180
1181 if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1182 (!SSL_CTX_set_default_verify_paths(ctx)))
1183 {
Ulf Möller657e60f2000-02-03 23:23:24 +00001184 /* BIO_printf(bio_err,"error setting default verify locations\n"); */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001185 ERR_print_errors(bio_err);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001186 /* goto end; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001187 }
1188
Bodo Möllered3883d2006-01-02 23:14:37 +00001189#ifndef OPENSSL_NO_TLSEXT
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +00001190 if (curves != NULL)
1191 if(!SSL_CTX_set1_curves_list(ctx,curves)) {
1192 BIO_printf(bio_err,"error setting curve list\n");
1193 ERR_print_errors(bio_err);
1194 goto end;
1195 }
Bodo Möllerb1277b92006-01-02 23:29:12 +00001196 if (servername != NULL)
1197 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001198 tlsextcbp.biodebug = bio_err;
1199 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1200 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
Bodo Möllerb1277b92006-01-02 23:29:12 +00001201 }
Ben Laurieedc032b2011-03-12 17:01:19 +00001202#ifndef OPENSSL_NO_SRP
1203 if (srp_arg.srplogin)
1204 {
Dr. Stephen Hensonf2fc3072011-12-14 22:17:06 +00001205 if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
Ben Laurieedc032b2011-03-12 17:01:19 +00001206 {
1207 BIO_printf(bio_err,"Unable to set SRP username\n");
1208 goto end;
1209 }
1210 srp_arg.msg = c_msg;
1211 srp_arg.debug = c_debug ;
1212 SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1213 SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1214 SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1215 if (c_msg || c_debug || srp_arg.amp == 0)
1216 SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1217 }
1218
1219#endif
Ben Lauriea9e1c502012-05-30 10:10:58 +00001220 if (c_proof_debug)
1221 SSL_CTX_set_tlsext_authz_server_audit_proof_cb(ctx,
1222 audit_proof_cb);
Bodo Möllered3883d2006-01-02 23:14:37 +00001223#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001224
Dr. Stephen Henson82fc1d92000-02-03 02:56:48 +00001225 con=SSL_new(ctx);
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001226 if (sess_in)
1227 {
1228 SSL_SESSION *sess;
1229 BIO *stmp = BIO_new_file(sess_in, "r");
1230 if (!stmp)
1231 {
1232 BIO_printf(bio_err, "Can't open session file %s\n",
1233 sess_in);
1234 ERR_print_errors(bio_err);
1235 goto end;
1236 }
1237 sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1238 BIO_free(stmp);
1239 if (!sess)
1240 {
1241 BIO_printf(bio_err, "Can't open session file %s\n",
1242 sess_in);
1243 ERR_print_errors(bio_err);
1244 goto end;
1245 }
1246 SSL_set_session(con, sess);
1247 SSL_SESSION_free(sess);
1248 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001249#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb1277b92006-01-02 23:29:12 +00001250 if (servername != NULL)
1251 {
Bodo Möllera13c20f2006-01-09 19:49:05 +00001252 if (!SSL_set_tlsext_host_name(con,servername))
Bodo Möllerb1277b92006-01-02 23:29:12 +00001253 {
Bodo Möllered3883d2006-01-02 23:14:37 +00001254 BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1255 ERR_print_errors(bio_err);
1256 goto end;
Bodo Möllerb1277b92006-01-02 23:29:12 +00001257 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001258 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001259#endif
Richard Levittecf1b7d92001-02-19 16:06:34 +00001260#ifndef OPENSSL_NO_KRB5
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00001261 if (con && (kctx = kssl_ctx_new()) != NULL)
Richard Levittef9b3bff2000-11-30 22:53:34 +00001262 {
Dr. Stephen Henson4f7a2ab2011-05-11 22:50:18 +00001263 SSL_set0_kssl_ctx(con, kctx);
1264 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
Richard Levittef9b3bff2000-11-30 22:53:34 +00001265 }
Richard Levittecf1b7d92001-02-19 16:06:34 +00001266#endif /* OPENSSL_NO_KRB5 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001267/* SSL_set_cipher_list(con,"RC4-MD5"); */
Bodo Möller761772d2007-09-21 06:54:24 +00001268#if 0
1269#ifdef TLSEXT_TYPE_opaque_prf_input
Bodo Möller86d4bc32007-09-23 11:08:59 +00001270 SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
Bodo Möller761772d2007-09-21 06:54:24 +00001271#endif
1272#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001273
1274re_start:
1275
Bodo Möllerb1277b92006-01-02 23:29:12 +00001276 if (init_client(&s,host,port,socket_type) == 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001277 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001278 BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001279 SHUTDOWN(s);
1280 goto end;
1281 }
1282 BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1283
1284#ifdef FIONBIO
1285 if (c_nbio)
1286 {
1287 unsigned long l=1;
1288 BIO_printf(bio_c_out,"turning on non blocking io\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001289 if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1290 {
1291 ERR_print_errors(bio_err);
1292 goto end;
1293 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001294 }
1295#endif
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00001296 if (c_Pause & 0x01) SSL_set_debug(con, 1);
Ben Laurie36d16f82005-04-26 16:02:40 +00001297
1298 if ( SSL_version(con) == DTLS1_VERSION)
1299 {
Ben Laurie36d16f82005-04-26 16:02:40 +00001300
1301 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
Dr. Stephen Henson6c617262005-04-27 16:27:14 +00001302 if (getsockname(s, &peer, (void *)&peerlen) < 0)
Ben Laurie36d16f82005-04-26 16:02:40 +00001303 {
1304 BIO_printf(bio_err, "getsockname:errno=%d\n",
1305 get_last_socket_error());
1306 SHUTDOWN(s);
1307 goto end;
1308 }
1309
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001310 (void)BIO_ctrl_set_connected(sbio, 1, &peer);
Ben Laurie36d16f82005-04-26 16:02:40 +00001311
Bodo Möllerb1277b92006-01-02 23:29:12 +00001312 if (enable_timeouts)
Ben Laurie36d16f82005-04-26 16:02:40 +00001313 {
1314 timeout.tv_sec = 0;
1315 timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1316 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1317
1318 timeout.tv_sec = 0;
1319 timeout.tv_usec = DGRAM_SND_TIMEOUT;
1320 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1321 }
1322
Dr. Stephen Henson046f2102009-05-17 16:04:58 +00001323 if (socket_mtu > 28)
Ben Laurie36d16f82005-04-26 16:02:40 +00001324 {
1325 SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
Dr. Stephen Henson046f2102009-05-17 16:04:58 +00001326 SSL_set_mtu(con, socket_mtu - 28);
Ben Laurie36d16f82005-04-26 16:02:40 +00001327 }
1328 else
1329 /* want to do MTU discovery */
1330 BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1331 }
1332 else
1333 sbio=BIO_new_socket(s,BIO_NOCLOSE);
1334
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001335 if (nbio_test)
1336 {
1337 BIO *test;
1338
1339 test=BIO_new(BIO_f_nbio_test());
1340 sbio=BIO_push(test,sbio);
1341 }
1342
1343 if (c_debug)
1344 {
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00001345 SSL_set_debug(con, 1);
Richard Levitte25495642004-08-12 08:58:55 +00001346 BIO_set_callback(sbio,bio_dump_callback);
Nils Larsch7806f3d2006-11-29 20:54:57 +00001347 BIO_set_callback_arg(sbio,(char *)bio_c_out);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001348 }
Bodo Möllera661b652001-10-20 17:56:36 +00001349 if (c_msg)
1350 {
1351 SSL_set_msg_callback(con, msg_cb);
1352 SSL_set_msg_callback_arg(con, bio_c_out);
1353 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001354#ifndef OPENSSL_NO_TLSEXT
1355 if (c_tlsextdebug)
1356 {
1357 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1358 SSL_set_tlsext_debug_arg(con, bio_c_out);
1359 }
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00001360 if (c_status_req)
1361 {
1362 SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1363 SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1364 SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1365#if 0
1366{
1367STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1368OCSP_RESPID *id = OCSP_RESPID_new();
1369id->value.byKey = ASN1_OCTET_STRING_new();
1370id->type = V_OCSP_RESPID_KEY;
1371ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1372sk_OCSP_RESPID_push(ids, id);
1373SSL_set_tlsext_status_ids(con, ids);
1374}
1375#endif
1376 }
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001377#endif
Dr. Stephen Henson79bd20f2008-11-24 17:27:08 +00001378#ifndef OPENSSL_NO_JPAKE
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001379 if (jpake_secret)
1380 jpake_client_auth(bio_c_out, sbio, jpake_secret);
Dr. Stephen Hensoned551cd2008-11-12 17:28:18 +00001381#endif
Ben Laurie6caa4ed2008-10-26 18:40:52 +00001382
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001383 SSL_set_bio(con,sbio,sbio);
1384 SSL_set_connect_state(con);
1385
1386 /* ok, lets connect */
1387 width=SSL_get_fd(con)+1;
1388
1389 read_tty=1;
1390 write_tty=0;
1391 tty_on=0;
1392 read_ssl=1;
1393 write_ssl=1;
1394
1395 cbuf_len=0;
1396 cbuf_off=0;
1397 sbuf_len=0;
1398 sbuf_off=0;
1399
Richard Levitte135c0af2001-11-14 13:57:52 +00001400 /* This is an ugly hack that does a lot of assumptions */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001401 /* We do have to handle multi-line responses which may come
1402 in a single packet or not. We therefore have to use
1403 BIO_gets() which does need a buffering BIO. So during
1404 the initial chitchat we do push a buffering BIO into the
1405 chain that is removed again later on to not disturb the
1406 rest of the s_client operation. */
Richard Levitte85c67492007-02-16 18:12:16 +00001407 if (starttls_proto == PROTO_SMTP)
Richard Levitte135c0af2001-11-14 13:57:52 +00001408 {
Lutz Jänicke8d724762007-02-21 18:20:41 +00001409 int foundit=0;
Lutz Jänickeee373e72007-02-22 17:39:47 +00001410 BIO *fbio = BIO_new(BIO_f_buffer());
1411 BIO_push(fbio, sbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001412 /* wait for multi-line response to end from SMTP */
1413 do
1414 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001415 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Richard Levitte85c67492007-02-16 18:12:16 +00001416 }
1417 while (mbuf_len>3 && mbuf[3]=='-');
Lutz Jänicke8d724762007-02-21 18:20:41 +00001418 /* STARTTLS command requires EHLO... */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001419 BIO_printf(fbio,"EHLO openssl.client.net\r\n");
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001420 (void)BIO_flush(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001421 /* wait for multi-line response to end EHLO SMTP response */
1422 do
1423 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001424 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001425 if (strstr(mbuf,"STARTTLS"))
1426 foundit=1;
1427 }
1428 while (mbuf_len>3 && mbuf[3]=='-');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001429 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001430 BIO_pop(fbio);
1431 BIO_free(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001432 if (!foundit)
1433 BIO_printf(bio_err,
1434 "didn't found starttls in server response,"
1435 " try anyway...\n");
Richard Levitte135c0af2001-11-14 13:57:52 +00001436 BIO_printf(sbio,"STARTTLS\r\n");
1437 BIO_read(sbio,sbuf,BUFSIZZ);
1438 }
Richard Levitte85c67492007-02-16 18:12:16 +00001439 else if (starttls_proto == PROTO_POP3)
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +00001440 {
1441 BIO_read(sbio,mbuf,BUFSIZZ);
1442 BIO_printf(sbio,"STLS\r\n");
1443 BIO_read(sbio,sbuf,BUFSIZZ);
1444 }
Richard Levitte85c67492007-02-16 18:12:16 +00001445 else if (starttls_proto == PROTO_IMAP)
1446 {
Lutz Jänicke8d724762007-02-21 18:20:41 +00001447 int foundit=0;
Lutz Jänickeee373e72007-02-22 17:39:47 +00001448 BIO *fbio = BIO_new(BIO_f_buffer());
1449 BIO_push(fbio, sbio);
1450 BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001451 /* STARTTLS command requires CAPABILITY... */
Lutz Jänickeee373e72007-02-22 17:39:47 +00001452 BIO_printf(fbio,". CAPABILITY\r\n");
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001453 (void)BIO_flush(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001454 /* wait for multi-line CAPABILITY response */
1455 do
1456 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001457 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001458 if (strstr(mbuf,"STARTTLS"))
1459 foundit=1;
1460 }
Lutz Jänickeee373e72007-02-22 17:39:47 +00001461 while (mbuf_len>3 && mbuf[0]!='.');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001462 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001463 BIO_pop(fbio);
1464 BIO_free(fbio);
Lutz Jänicke8d724762007-02-21 18:20:41 +00001465 if (!foundit)
1466 BIO_printf(bio_err,
1467 "didn't found STARTTLS in server response,"
1468 " try anyway...\n");
1469 BIO_printf(sbio,". STARTTLS\r\n");
Richard Levitte85c67492007-02-16 18:12:16 +00001470 BIO_read(sbio,sbuf,BUFSIZZ);
1471 }
1472 else if (starttls_proto == PROTO_FTP)
1473 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001474 BIO *fbio = BIO_new(BIO_f_buffer());
1475 BIO_push(fbio, sbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001476 /* wait for multi-line response to end from FTP */
1477 do
1478 {
Lutz Jänickeee373e72007-02-22 17:39:47 +00001479 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
Richard Levitte85c67492007-02-16 18:12:16 +00001480 }
1481 while (mbuf_len>3 && mbuf[3]=='-');
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00001482 (void)BIO_flush(fbio);
Lutz Jänickeee373e72007-02-22 17:39:47 +00001483 BIO_pop(fbio);
1484 BIO_free(fbio);
Richard Levitte85c67492007-02-16 18:12:16 +00001485 BIO_printf(sbio,"AUTH TLS\r\n");
1486 BIO_read(sbio,sbuf,BUFSIZZ);
1487 }
Ben Lauried5bbead2008-10-14 19:11:26 +00001488 if (starttls_proto == PROTO_XMPP)
1489 {
1490 int seen = 0;
1491 BIO_printf(sbio,"<stream:stream "
1492 "xmlns:stream='http://etherx.jabber.org/streams' "
1493 "xmlns='jabber:client' to='%s' version='1.0'>", host);
1494 seen = BIO_read(sbio,mbuf,BUFSIZZ);
1495 mbuf[seen] = 0;
1496 while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1497 {
1498 if (strstr(mbuf, "/stream:features>"))
1499 goto shut;
1500 seen = BIO_read(sbio,mbuf,BUFSIZZ);
1501 mbuf[seen] = 0;
1502 }
1503 BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1504 seen = BIO_read(sbio,sbuf,BUFSIZZ);
1505 sbuf[seen] = 0;
1506 if (!strstr(sbuf, "<proceed"))
1507 goto shut;
1508 mbuf[0] = 0;
1509 }
Richard Levitte135c0af2001-11-14 13:57:52 +00001510
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001511 for (;;)
1512 {
1513 FD_ZERO(&readfds);
1514 FD_ZERO(&writefds);
1515
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001516 if ((SSL_version(con) == DTLS1_VERSION) &&
1517 DTLSv1_get_timeout(con, &timeout))
1518 timeoutp = &timeout;
1519 else
1520 timeoutp = NULL;
1521
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001522 if (SSL_in_init(con) && !SSL_total_renegotiations(con))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001523 {
1524 in_init=1;
1525 tty_on=0;
1526 }
1527 else
1528 {
1529 tty_on=1;
1530 if (in_init)
1531 {
1532 in_init=0;
Bodo Möller761772d2007-09-21 06:54:24 +00001533#if 0 /* This test doesn't really work as intended (needs to be fixed) */
Bodo Möllered3883d2006-01-02 23:14:37 +00001534#ifndef OPENSSL_NO_TLSEXT
Bodo Möllerb166f132006-06-15 19:00:34 +00001535 if (servername != NULL && !SSL_session_reused(con))
1536 {
1537 BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1538 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001539#endif
Bodo Möller761772d2007-09-21 06:54:24 +00001540#endif
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00001541 if (sess_out)
1542 {
1543 BIO *stmp = BIO_new_file(sess_out, "w");
1544 if (stmp)
1545 {
1546 PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1547 BIO_free(stmp);
1548 }
1549 else
1550 BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1551 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001552 print_stuff(bio_c_out,con,full_log);
1553 if (full_log > 0) full_log--;
1554
Lutz Jänicke4f17dfc2003-05-28 20:24:57 +00001555 if (starttls_proto)
Richard Levitte135c0af2001-11-14 13:57:52 +00001556 {
1557 BIO_printf(bio_err,"%s",mbuf);
1558 /* We don't need to know any more */
Richard Levitte85c67492007-02-16 18:12:16 +00001559 starttls_proto = PROTO_OFF;
Richard Levitte135c0af2001-11-14 13:57:52 +00001560 }
1561
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001562 if (reconnect)
1563 {
1564 reconnect--;
1565 BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1566 SSL_shutdown(con);
1567 SSL_set_connect_state(con);
1568 SHUTDOWN(SSL_get_fd(con));
1569 goto re_start;
1570 }
1571 }
1572 }
1573
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001574 ssl_pending = read_ssl && SSL_pending(con);
1575
1576 if (!ssl_pending)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001577 {
Ulf Möller4700aea2006-04-11 21:34:21 +00001578#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001579 if (tty_on)
1580 {
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001581 if (read_tty) openssl_fdset(fileno(stdin),&readfds);
1582 if (write_tty) openssl_fdset(fileno(stdout),&writefds);
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001583 }
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001584 if (read_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001585 openssl_fdset(SSL_get_fd(con),&readfds);
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001586 if (write_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001587 openssl_fdset(SSL_get_fd(con),&writefds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001588#else
1589 if(!tty_on || !write_tty) {
1590 if (read_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001591 openssl_fdset(SSL_get_fd(con),&readfds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001592 if (write_ssl)
Dr. Stephen Henson7bf73332006-04-17 12:22:13 +00001593 openssl_fdset(SSL_get_fd(con),&writefds);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001594 }
1595#endif
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001596/* printf("mode tty(%d %d%d) ssl(%d%d)\n",
1597 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001598
Ulf Möller75e07701999-05-13 13:21:17 +00001599 /* Note: under VMS with SOCKETSHR the second parameter
Ulf Möller7d7d2cb1999-05-13 11:37:32 +00001600 * is currently of type (int *) whereas under other
1601 * systems it is (void *) if you don't have a cast it
1602 * will choke the compiler: if you do have a cast then
1603 * you can either go for (int *) or (void *).
1604 */
Richard Levitte3d7c4a52003-09-27 21:56:08 +00001605#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1606 /* Under Windows/DOS we make the assumption that we can
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001607 * always write to the tty: therefore if we need to
1608 * write to the tty we just fall through. Otherwise
1609 * we timeout the select every second and see if there
1610 * are any keypresses. Note: this is a hack, in a proper
1611 * Windows application we wouldn't do this.
1612 */
Ulf Möller4ec19e22000-02-20 20:59:21 +00001613 i=0;
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001614 if(!write_tty) {
1615 if(read_tty) {
1616 tv.tv_sec = 1;
1617 tv.tv_usec = 0;
1618 i=select(width,(void *)&readfds,(void *)&writefds,
1619 NULL,&tv);
Richard Levitte3d7c4a52003-09-27 21:56:08 +00001620#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
Richard Levitte0bf23d92002-11-15 22:37:18 +00001621 if(!i && (!_kbhit() || !read_tty) ) continue;
1622#else
Richard Levittea9ef75c2000-06-01 11:23:20 +00001623 if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
Richard Levitte0bf23d92002-11-15 22:37:18 +00001624#endif
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001625 } else i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001626 NULL,timeoutp);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001627 }
Richard Levitte47c17352004-06-28 11:55:28 +00001628#elif defined(OPENSSL_SYS_NETWARE)
1629 if(!write_tty) {
1630 if(read_tty) {
1631 tv.tv_sec = 1;
1632 tv.tv_usec = 0;
1633 i=select(width,(void *)&readfds,(void *)&writefds,
1634 NULL,&tv);
1635 } else i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001636 NULL,timeoutp);
Richard Levitte47c17352004-06-28 11:55:28 +00001637 }
Ulf Möller4700aea2006-04-11 21:34:21 +00001638#elif defined(OPENSSL_SYS_BEOS_R5)
1639 /* Under BeOS-R5 the situation is similar to DOS */
1640 i=0;
1641 stdin_set = 0;
1642 (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1643 if(!write_tty) {
1644 if(read_tty) {
1645 tv.tv_sec = 1;
1646 tv.tv_usec = 0;
1647 i=select(width,(void *)&readfds,(void *)&writefds,
1648 NULL,&tv);
1649 if (read(fileno(stdin), sbuf, 0) >= 0)
1650 stdin_set = 1;
1651 if (!i && (stdin_set != 1 || !read_tty))
1652 continue;
1653 } else i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001654 NULL,timeoutp);
Ulf Möller4700aea2006-04-11 21:34:21 +00001655 }
1656 (void)fcntl(fileno(stdin), F_SETFL, 0);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001657#else
Ulf Möller7d7d2cb1999-05-13 11:37:32 +00001658 i=select(width,(void *)&readfds,(void *)&writefds,
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001659 NULL,timeoutp);
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001660#endif
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001661 if ( i < 0)
1662 {
1663 BIO_printf(bio_err,"bad select %d\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001664 get_last_socket_error());
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001665 goto shut;
1666 /* goto end; */
1667 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001668 }
1669
Dr. Stephen Hensonb972fba2009-08-12 13:19:54 +00001670 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1671 {
1672 BIO_printf(bio_err,"TIMEOUT occured\n");
1673 }
1674
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001675 if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001676 {
1677 k=SSL_write(con,&(cbuf[cbuf_off]),
1678 (unsigned int)cbuf_len);
1679 switch (SSL_get_error(con,k))
1680 {
1681 case SSL_ERROR_NONE:
1682 cbuf_off+=k;
1683 cbuf_len-=k;
1684 if (k <= 0) goto end;
1685 /* we have done a write(con,NULL,0); */
1686 if (cbuf_len <= 0)
1687 {
1688 read_tty=1;
1689 write_ssl=0;
1690 }
1691 else /* if (cbuf_len > 0) */
1692 {
1693 read_tty=0;
1694 write_ssl=1;
1695 }
1696 break;
1697 case SSL_ERROR_WANT_WRITE:
1698 BIO_printf(bio_c_out,"write W BLOCK\n");
1699 write_ssl=1;
1700 read_tty=0;
1701 break;
1702 case SSL_ERROR_WANT_READ:
1703 BIO_printf(bio_c_out,"write R BLOCK\n");
1704 write_tty=0;
1705 read_ssl=1;
1706 write_ssl=0;
1707 break;
1708 case SSL_ERROR_WANT_X509_LOOKUP:
1709 BIO_printf(bio_c_out,"write X BLOCK\n");
1710 break;
1711 case SSL_ERROR_ZERO_RETURN:
1712 if (cbuf_len != 0)
1713 {
1714 BIO_printf(bio_c_out,"shutdown\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001715 ret = 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001716 goto shut;
1717 }
1718 else
1719 {
1720 read_tty=1;
1721 write_ssl=0;
1722 break;
1723 }
1724
1725 case SSL_ERROR_SYSCALL:
1726 if ((k != 0) || (cbuf_len != 0))
1727 {
1728 BIO_printf(bio_err,"write:errno=%d\n",
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001729 get_last_socket_error());
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001730 goto shut;
1731 }
1732 else
1733 {
1734 read_tty=1;
1735 write_ssl=0;
1736 }
1737 break;
1738 case SSL_ERROR_SSL:
1739 ERR_print_errors(bio_err);
1740 goto shut;
1741 }
1742 }
Ulf Möller4700aea2006-04-11 21:34:21 +00001743#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1744 /* Assume Windows/DOS/BeOS can always write */
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001745 else if (!ssl_pending && write_tty)
1746#else
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001747 else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001748#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001749 {
Ulf Möllera53955d1999-06-04 21:35:58 +00001750#ifdef CHARSET_EBCDIC
1751 ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1752#endif
Andy Polyakovffa10182005-11-04 09:30:55 +00001753 i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001754
1755 if (i <= 0)
1756 {
1757 BIO_printf(bio_c_out,"DONE\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001758 ret = 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001759 goto shut;
1760 /* goto end; */
1761 }
1762
1763 sbuf_len-=i;;
1764 sbuf_off+=i;
1765 if (sbuf_len <= 0)
1766 {
1767 read_ssl=1;
1768 write_tty=0;
1769 }
1770 }
Bodo Möllerc7ac31e1999-04-09 20:54:25 +00001771 else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001772 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001773#ifdef RENEG
1774{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1775#endif
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001776#if 1
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001777 k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001778#else
1779/* Demo for pending and peek :-) */
1780 k=SSL_read(con,sbuf,16);
1781{ char zbuf[10240];
1782printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1783}
1784#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001785
1786 switch (SSL_get_error(con,k))
1787 {
1788 case SSL_ERROR_NONE:
1789 if (k <= 0)
1790 goto end;
1791 sbuf_off=0;
1792 sbuf_len=k;
1793
1794 read_ssl=0;
1795 write_tty=1;
1796 break;
1797 case SSL_ERROR_WANT_WRITE:
1798 BIO_printf(bio_c_out,"read W BLOCK\n");
1799 write_ssl=1;
1800 read_tty=0;
1801 break;
1802 case SSL_ERROR_WANT_READ:
1803 BIO_printf(bio_c_out,"read R BLOCK\n");
1804 write_tty=0;
1805 read_ssl=1;
1806 if ((read_tty == 0) && (write_ssl == 0))
1807 write_ssl=1;
1808 break;
1809 case SSL_ERROR_WANT_X509_LOOKUP:
1810 BIO_printf(bio_c_out,"read X BLOCK\n");
1811 break;
1812 case SSL_ERROR_SYSCALL:
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001813 ret=get_last_socket_error();
1814 BIO_printf(bio_err,"read:errno=%d\n",ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001815 goto shut;
1816 case SSL_ERROR_ZERO_RETURN:
1817 BIO_printf(bio_c_out,"closed\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001818 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001819 goto shut;
1820 case SSL_ERROR_SSL:
1821 ERR_print_errors(bio_err);
1822 goto shut;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001823 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001824 }
1825 }
1826
Richard Levitte3d7c4a52003-09-27 21:56:08 +00001827#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1828#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
Richard Levitte0bf23d92002-11-15 22:37:18 +00001829 else if (_kbhit())
1830#else
Richard Levittea9ef75c2000-06-01 11:23:20 +00001831 else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
Richard Levitte0bf23d92002-11-15 22:37:18 +00001832#endif
Richard Levitte4d8743f2003-11-28 13:10:58 +00001833#elif defined (OPENSSL_SYS_NETWARE)
Andy Polyakovffa10182005-11-04 09:30:55 +00001834 else if (_kbhit())
Ulf Möller4700aea2006-04-11 21:34:21 +00001835#elif defined(OPENSSL_SYS_BEOS_R5)
1836 else if (stdin_set)
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001837#else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001838 else if (FD_ISSET(fileno(stdin),&readfds))
Dr. Stephen Henson06f45361999-09-20 22:09:17 +00001839#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001840 {
Bodo Möller1bdb8631999-08-07 02:51:10 +00001841 if (crlf)
1842 {
1843 int j, lf_num;
1844
Andy Polyakovffa10182005-11-04 09:30:55 +00001845 i=raw_read_stdin(cbuf,BUFSIZZ/2);
Bodo Möller1bdb8631999-08-07 02:51:10 +00001846 lf_num = 0;
1847 /* both loops are skipped when i <= 0 */
1848 for (j = 0; j < i; j++)
1849 if (cbuf[j] == '\n')
1850 lf_num++;
1851 for (j = i-1; j >= 0; j--)
1852 {
1853 cbuf[j+lf_num] = cbuf[j];
1854 if (cbuf[j] == '\n')
1855 {
1856 lf_num--;
1857 i++;
1858 cbuf[j+lf_num] = '\r';
1859 }
1860 }
1861 assert(lf_num == 0);
1862 }
1863 else
Andy Polyakovffa10182005-11-04 09:30:55 +00001864 i=raw_read_stdin(cbuf,BUFSIZZ);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001865
Richard Levittece301b62000-03-10 12:18:28 +00001866 if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001867 {
1868 BIO_printf(bio_err,"DONE\n");
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001869 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001870 goto shut;
1871 }
1872
Richard Levittece301b62000-03-10 12:18:28 +00001873 if ((!c_ign_eof) && (cbuf[0] == 'R'))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001874 {
Ben Laurie3bb307c1999-04-10 12:08:46 +00001875 BIO_printf(bio_err,"RENEGOTIATING\n");
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001876 SSL_renegotiate(con);
Ben Laurie3bb307c1999-04-10 12:08:46 +00001877 cbuf_len=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001878 }
Dr. Stephen Henson48175042011-12-31 22:59:57 +00001879#ifndef OPENSSL_NO_HEARTBEATS
1880 else if ((!c_ign_eof) && (cbuf[0] == 'B'))
1881 {
1882 BIO_printf(bio_err,"HEARTBEATING\n");
1883 SSL_heartbeat(con);
1884 cbuf_len=0;
1885 }
1886#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001887 else
1888 {
1889 cbuf_len=i;
1890 cbuf_off=0;
Ulf Möllera53955d1999-06-04 21:35:58 +00001891#ifdef CHARSET_EBCDIC
1892 ebcdic2ascii(cbuf, cbuf, i);
1893#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001894 }
1895
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001896 write_ssl=1;
Ben Laurie3bb307c1999-04-10 12:08:46 +00001897 read_tty=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001898 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001899 }
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001900
1901 ret=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001902shut:
Bodo Möllerb166f132006-06-15 19:00:34 +00001903 if (in_init)
1904 print_stuff(bio_c_out,con,full_log);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001905 SSL_shutdown(con);
1906 SHUTDOWN(SSL_get_fd(con));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001907end:
Nils Larschd916ba12006-03-18 14:24:02 +00001908 if (con != NULL)
1909 {
1910 if (prexit != 0)
1911 print_stuff(bio_c_out,con,1);
1912 SSL_free(con);
1913 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001914 if (ctx != NULL) SSL_CTX_free(ctx);
Dr. Stephen Henson826a42a2004-11-16 17:30:59 +00001915 if (cert)
1916 X509_free(cert);
1917 if (key)
1918 EVP_PKEY_free(key);
1919 if (pass)
1920 OPENSSL_free(pass);
Richard Levitte45799242002-11-28 08:04:36 +00001921 if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1922 if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1923 if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001924 if (bio_c_out != NULL)
1925 {
1926 BIO_free(bio_c_out);
1927 bio_c_out=NULL;
1928 }
Richard Levittec04f8cf2001-06-23 16:37:32 +00001929 apps_shutdown();
Richard Levitte1c3e4a32002-12-03 16:33:03 +00001930 OPENSSL_EXIT(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001931 }
1932
1933
Ulf Möller6b691a51999-04-19 21:31:43 +00001934static void print_stuff(BIO *bio, SSL *s, int full)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001935 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001936 X509 *peer=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001937 char *p;
Nils Larsch7d727232005-04-05 19:11:19 +00001938 static const char *space=" ";
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001939 char buf[BUFSIZ];
Ben Laurief73e07c1999-04-12 17:23:57 +00001940 STACK_OF(X509) *sk;
1941 STACK_OF(X509_NAME) *sk2;
Ben Lauriebabb3792008-10-12 14:32:47 +00001942 const SSL_CIPHER *c;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001943 X509_NAME *xn;
1944 int j,i;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00001945#ifndef OPENSSL_NO_COMP
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00001946 const COMP_METHOD *comp, *expansion;
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00001947#endif
Ben Lauriee0af0402011-11-15 23:50:52 +00001948 unsigned char *exportedkeymat;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001949
1950 if (full)
1951 {
Bodo Möllerbc2e5191999-05-17 20:46:43 +00001952 int got_a_chain = 0;
1953
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001954 sk=SSL_get_peer_cert_chain(s);
1955 if (sk != NULL)
1956 {
Bodo Möllerbc2e5191999-05-17 20:46:43 +00001957 got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1958
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001959 BIO_printf(bio,"---\nCertificate chain\n");
Ben Laurief73e07c1999-04-12 17:23:57 +00001960 for (i=0; i<sk_X509_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001961 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001962 X509_NAME_oneline(X509_get_subject_name(
Ben Laurie54a656e2002-11-13 15:43:43 +00001963 sk_X509_value(sk,i)),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001964 BIO_printf(bio,"%2d s:%s\n",i,buf);
Ben Laurief73e07c1999-04-12 17:23:57 +00001965 X509_NAME_oneline(X509_get_issuer_name(
Ben Laurie54a656e2002-11-13 15:43:43 +00001966 sk_X509_value(sk,i)),buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001967 BIO_printf(bio," i:%s\n",buf);
Bodo Möller6d02d8e1999-03-31 12:06:30 +00001968 if (c_showcerts)
Ben Laurief73e07c1999-04-12 17:23:57 +00001969 PEM_write_bio_X509(bio,sk_X509_value(sk,i));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001970 }
1971 }
1972
1973 BIO_printf(bio,"---\n");
1974 peer=SSL_get_peer_certificate(s);
1975 if (peer != NULL)
1976 {
1977 BIO_printf(bio,"Server certificate\n");
Bodo Möllerbc2e5191999-05-17 20:46:43 +00001978 if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
Bodo Möller6d02d8e1999-03-31 12:06:30 +00001979 PEM_write_bio_X509(bio,peer);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001980 X509_NAME_oneline(X509_get_subject_name(peer),
Ben Laurie54a656e2002-11-13 15:43:43 +00001981 buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001982 BIO_printf(bio,"subject=%s\n",buf);
1983 X509_NAME_oneline(X509_get_issuer_name(peer),
Ben Laurie54a656e2002-11-13 15:43:43 +00001984 buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001985 BIO_printf(bio,"issuer=%s\n",buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001986 }
1987 else
1988 BIO_printf(bio,"no peer certificate available\n");
1989
Ben Laurief73e07c1999-04-12 17:23:57 +00001990 sk2=SSL_get_client_CA_list(s);
Bodo Möllerd91f8c31999-04-14 23:10:11 +00001991 if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001992 {
1993 BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
Ben Laurief73e07c1999-04-12 17:23:57 +00001994 for (i=0; i<sk_X509_NAME_num(sk2); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001995 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001996 xn=sk_X509_NAME_value(sk2,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001997 X509_NAME_oneline(xn,buf,sizeof(buf));
1998 BIO_write(bio,buf,strlen(buf));
1999 BIO_write(bio,"\n",1);
2000 }
2001 }
2002 else
2003 {
2004 BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2005 }
Ben Laurie54a656e2002-11-13 15:43:43 +00002006 p=SSL_get_shared_ciphers(s,buf,sizeof buf);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002007 if (p != NULL)
2008 {
Bodo Möller67a47281999-04-27 16:48:06 +00002009 /* This works only for SSL 2. In later protocol
2010 * versions, the client does not know what other
2011 * ciphers (in addition to the one to be used
2012 * in the current connection) the server supports. */
2013
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002014 BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2015 j=i=0;
2016 while (*p)
2017 {
2018 if (*p == ':')
2019 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002020 BIO_write(bio,space,15-j%25);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002021 i++;
2022 j=0;
2023 BIO_write(bio,((i%3)?" ":"\n"),1);
2024 }
2025 else
2026 {
2027 BIO_write(bio,p,1);
2028 j++;
2029 }
2030 p++;
2031 }
2032 BIO_write(bio,"\n",1);
2033 }
2034
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00002035 ssl_print_sigalgs(bio, s);
2036
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002037 BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2038 BIO_number_read(SSL_get_rbio(s)),
2039 BIO_number_written(SSL_get_wbio(s)));
2040 }
Dr. Stephen Henson08557cf2011-04-29 22:37:12 +00002041 BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002042 c=SSL_get_current_cipher(s);
2043 BIO_printf(bio,"%s, Cipher is %s\n",
2044 SSL_CIPHER_get_version(c),
2045 SSL_CIPHER_get_name(c));
Dr. Stephen Hensona8236c81999-02-15 21:05:21 +00002046 if (peer != NULL) {
2047 EVP_PKEY *pktmp;
2048 pktmp = X509_get_pubkey(peer);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002049 BIO_printf(bio,"Server public key is %d bit\n",
Dr. Stephen Hensona8236c81999-02-15 21:05:21 +00002050 EVP_PKEY_bits(pktmp));
2051 EVP_PKEY_free(pktmp);
2052 }
Dr. Stephen Henson54302002009-12-08 13:42:08 +00002053 BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2054 SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002055#ifndef OPENSSL_NO_COMP
Richard Levittef44e1842003-10-06 12:19:38 +00002056 comp=SSL_get_current_compression(s);
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00002057 expansion=SSL_get_current_expansion(s);
Richard Levittef44e1842003-10-06 12:19:38 +00002058 BIO_printf(bio,"Compression: %s\n",
2059 comp ? SSL_COMP_get_name(comp) : "NONE");
2060 BIO_printf(bio,"Expansion: %s\n",
Geoff Thorped8ec0dc2003-11-04 00:51:32 +00002061 expansion ? SSL_COMP_get_name(expansion) : "NONE");
Dr. Stephen Henson09b6c2e2005-09-30 23:35:33 +00002062#endif
Ben Laurie71fa4512012-06-03 22:00:21 +00002063
Dr. Stephen Henson57559472012-02-09 15:43:58 +00002064#ifdef SSL_DEBUG
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002065 {
2066 /* Print out local port of connection: useful for debugging */
2067 int sock;
2068 struct sockaddr_in ladd;
2069 socklen_t ladd_size = sizeof(ladd);
2070 sock = SSL_get_fd(s);
2071 getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2072 BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2073 }
2074#endif
2075
Ben Laurie71fa4512012-06-03 22:00:21 +00002076#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2077 if (next_proto.status != -1) {
2078 const unsigned char *proto;
2079 unsigned int proto_len;
2080 SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2081 BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2082 BIO_write(bio, proto, proto_len);
2083 BIO_write(bio, "\n", 1);
2084 }
2085#endif
2086
Ben Laurie333f9262011-11-15 22:59:20 +00002087 {
2088 SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2089
2090 if(srtp_profile)
2091 BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2092 srtp_profile->name);
2093 }
2094
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002095 SSL_SESSION_print(bio,SSL_get_session(s));
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002096 if (keymatexportlabel != NULL)
2097 {
Ben Lauriee0af0402011-11-15 23:50:52 +00002098 BIO_printf(bio, "Keying material exporter:\n");
2099 BIO_printf(bio, " Label: '%s'\n", keymatexportlabel);
2100 BIO_printf(bio, " Length: %i bytes\n", keymatexportlen);
2101 exportedkeymat = OPENSSL_malloc(keymatexportlen);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002102 if (exportedkeymat != NULL)
2103 {
2104 if (!SSL_export_keying_material(s, exportedkeymat,
2105 keymatexportlen,
2106 keymatexportlabel,
2107 strlen(keymatexportlabel),
2108 NULL, 0, 0))
2109 {
2110 BIO_printf(bio, " Error\n");
2111 }
2112 else
2113 {
Ben Lauriee0af0402011-11-15 23:50:52 +00002114 BIO_printf(bio, " Keying material: ");
2115 for (i=0; i<keymatexportlen; i++)
2116 BIO_printf(bio, "%02X",
2117 exportedkeymat[i]);
2118 BIO_printf(bio, "\n");
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002119 }
Ben Lauriee0af0402011-11-15 23:50:52 +00002120 OPENSSL_free(exportedkeymat);
Dr. Stephen Hensonbe81f4d2012-02-11 23:20:53 +00002121 }
Ben Lauriee0af0402011-11-15 23:50:52 +00002122 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002123 BIO_printf(bio,"---\n");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002124 if (peer != NULL)
2125 X509_free(peer);
Lutz Jänicke41ebed22001-10-16 14:24:46 +00002126 /* flush, or debugging output gets mixed with http response */
Dr. Stephen Henson710069c2007-08-12 17:44:32 +00002127 (void)BIO_flush(bio);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00002128 }
2129
Dr. Stephen Henson07021502008-09-03 12:29:57 +00002130#ifndef OPENSSL_NO_TLSEXT
2131
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +00002132static int ocsp_resp_cb(SSL *s, void *arg)
2133 {
2134 const unsigned char *p;
2135 int len;
2136 OCSP_RESPONSE *rsp;
2137 len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2138 BIO_puts(arg, "OCSP response: ");
2139 if (!p)
2140 {
2141 BIO_puts(arg, "no response sent\n");
2142 return 1;
2143 }
2144 rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2145 if (!rsp)
2146 {
2147 BIO_puts(arg, "response parse error\n");
2148 BIO_dump_indent(arg, (char *)p, len, 4);
2149 return 0;
2150 }
2151 BIO_puts(arg, "\n======================================\n");
2152 OCSP_RESPONSE_print(arg, rsp, 0);
2153 BIO_puts(arg, "======================================\n");
2154 OCSP_RESPONSE_free(rsp);
2155 return 1;
2156 }
Dr. Stephen Henson07021502008-09-03 12:29:57 +00002157
Ben Lauriea9e1c502012-05-30 10:10:58 +00002158static int audit_proof_cb(SSL *s, void *arg)
2159 {
2160 const unsigned char *proof;
2161 size_t proof_len;
2162 size_t i;
2163 SSL_SESSION *sess = SSL_get_session(s);
2164
2165 proof = SSL_SESSION_get_tlsext_authz_server_audit_proof(sess,
2166 &proof_len);
2167 if (proof != NULL)
2168 {
2169 BIO_printf(bio_c_out, "Audit proof: ");
2170 for (i = 0; i < proof_len; ++i)
2171 BIO_printf(bio_c_out, "%02X", proof[i]);
2172 BIO_printf(bio_c_out, "\n");
2173 }
2174 else
2175 {
2176 BIO_printf(bio_c_out, "No audit proof found.\n");
2177 }
2178 return 1;
2179 }
Dr. Stephen Henson07021502008-09-03 12:29:57 +00002180#endif