]> git.ipfire.org Git - thirdparty/openssl.git/blame - apps/s_client.c
Remove DJGPP (and therefore WATT32) #ifdef's.
[thirdparty/openssl.git] / apps / s_client.c
CommitLineData
d02b48c6 1/* apps/s_client.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
3 * 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 */
a661b653 58/* ====================================================================
b1277b99 59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
a661b653
BM
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
ddac1974
NL
111/* ====================================================================
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 */
d02b48c6 137
1b1a6e78 138#include <assert.h>
ddac1974 139#include <ctype.h>
8c197cc5
UM
140#include <stdio.h>
141#include <stdlib.h>
142#include <string.h>
be1bd923 143#include <openssl/e_os2.h>
cf1b7d96 144#ifdef OPENSSL_NO_STDIO
8c197cc5
UM
145#define APPS_WIN16
146#endif
147
7d7d2cbc
UM
148/* 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 */
bc36ee62 152#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
7d7d2cbc
UM
153#define __U_INT
154typedef unsigned int u_int;
155#endif
156
d02b48c6 157#define USE_SOCKETS
d02b48c6 158#include "apps.h"
ec577822
BM
159#include <openssl/x509.h>
160#include <openssl/ssl.h>
161#include <openssl/err.h>
162#include <openssl/pem.h>
1372965e 163#include <openssl/rand.h>
67c8e7f4 164#include <openssl/ocsp.h>
1e26a8ba 165#include <openssl/bn.h>
edc032b5
BL
166#ifndef OPENSSL_NO_SRP
167#include <openssl/srp.h>
168#endif
d02b48c6 169#include "s_apps.h"
36d16f8e 170#include "timeouts.h"
d02b48c6 171
bc36ee62 172#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
75e0770d 173/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
7d7d2cbc
UM
174#undef FIONBIO
175#endif
176
4700aea9
UM
177#if defined(OPENSSL_SYS_BEOS_R5)
178#include <fcntl.h>
179#endif
180
d02b48c6
RE
181#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;
5d20c4fb 195extern int verify_return_error;
2a7cbe77 196extern int verify_quiet;
d02b48c6
RE
197
198#ifdef FIONBIO
199static int c_nbio=0;
200#endif
201static int c_Pause=0;
202static int c_debug=0;
6434abbf
DSH
203#ifndef OPENSSL_NO_TLSEXT
204static int c_tlsextdebug=0;
67c8e7f4 205static int c_status_req=0;
6434abbf 206#endif
a661b653 207static int c_msg=0;
6d02d8e4 208static int c_showcerts=0;
d02b48c6 209
e0af0405
BL
210static char *keymatexportlabel=NULL;
211static int keymatexportlen=20;
212
d02b48c6
RE
213static void sc_usage(void);
214static void print_stuff(BIO *berr,SSL *con,int full);
0702150f 215#ifndef OPENSSL_NO_TLSEXT
67c8e7f4 216static int ocsp_resp_cb(SSL *s, void *arg);
0702150f 217#endif
d02b48c6 218static BIO *bio_c_out=NULL;
93ab9e42 219static BIO *bio_c_msg=NULL;
d02b48c6 220static int c_quiet=0;
ce301b6b 221static int c_ign_eof=0;
2a7cbe77 222static int c_brief=0;
d02b48c6 223
ddac1974
NL
224#ifndef OPENSSL_NO_PSK
225/* Default PSK identity and key */
226static char *psk_identity="Client_identity";
f3b7bdad 227/*char *psk_key=NULL; by default PSK is not used */
ddac1974
NL
228
229static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
230 unsigned int max_identity_len, unsigned char *psk,
231 unsigned int max_psk_len)
232 {
233 unsigned int psk_len = 0;
234 int ret;
235 BIGNUM *bn=NULL;
236
237 if (c_debug)
238 BIO_printf(bio_c_out, "psk_client_cb\n");
239 if (!hint)
240 {
241 /* no ServerKeyExchange message*/
242 if (c_debug)
243 BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
244 }
245 else if (c_debug)
246 BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
247
248 /* lookup PSK identity and PSK key based on the given identity hint here */
0ed6b526 249 ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
a0aa8b4b 250 if (ret < 0 || (unsigned int)ret > max_identity_len)
ddac1974
NL
251 goto out_err;
252 if (c_debug)
253 BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
254 ret=BN_hex2bn(&bn, psk_key);
255 if (!ret)
256 {
257 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
258 if (bn)
259 BN_free(bn);
260 return 0;
261 }
262
a0aa8b4b 263 if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
ddac1974
NL
264 {
265 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
266 max_psk_len, BN_num_bytes(bn));
267 BN_free(bn);
268 return 0;
269 }
270
271 psk_len=BN_bn2bin(bn, psk);
272 BN_free(bn);
273 if (psk_len == 0)
274 goto out_err;
275
276 if (c_debug)
277 BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
278
279 return psk_len;
280 out_err:
281 if (c_debug)
282 BIO_printf(bio_err, "Error in PSK client callback\n");
283 return 0;
284 }
285#endif
286
6b691a5c 287static void sc_usage(void)
d02b48c6 288 {
b6cff93d 289 BIO_printf(bio_err,"usage: s_client args\n");
d02b48c6
RE
290 BIO_printf(bio_err,"\n");
291 BIO_printf(bio_err," -host host - use -connect instead\n");
292 BIO_printf(bio_err," -port port - use -connect instead\n");
a9351320
GT
293 BIO_printf(bio_err," -connect host:port - connect over TCP/IP (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
294 BIO_printf(bio_err," -unix path - connect over unix domain sockets\n");
d02b48c6 295 BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n");
ee724df7 296 BIO_printf(bio_err," -verify_return_error - return verification errors\n");
d02b48c6 297 BIO_printf(bio_err," -cert arg - certificate file to use, PEM format assumed\n");
826a42a0
DSH
298 BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
299 BIO_printf(bio_err," -key arg - Private key file to use, in cert file if\n");
d02b48c6 300 BIO_printf(bio_err," not specified but cert file is.\n");
826a42a0
DSH
301 BIO_printf(bio_err," -keyform arg - key format (PEM or DER) PEM default\n");
302 BIO_printf(bio_err," -pass arg - private key file pass phrase source\n");
d02b48c6
RE
303 BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
304 BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
6d3d5793 305 BIO_printf(bio_err," -trusted_first - Use local CA's first when building trust chain\n");
d02b48c6
RE
306 BIO_printf(bio_err," -reconnect - Drop and re-make the connection with the same Session-ID\n");
307 BIO_printf(bio_err," -pause - sleep(1) after each read(2) and write(2) system call\n");
ee724df7 308 BIO_printf(bio_err," -prexit - print session information even on connection failure\n");
6d02d8e4 309 BIO_printf(bio_err," -showcerts - show all certificates in the chain\n");
d02b48c6 310 BIO_printf(bio_err," -debug - extra output\n");
a661b653 311 BIO_printf(bio_err," -msg - Show protocol messages\n");
d02b48c6
RE
312 BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n");
313 BIO_printf(bio_err," -state - print the 'ssl' states\n");
314#ifdef FIONBIO
315 BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
1bdb8633 316#endif
1bdb8633 317 BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
d02b48c6 318 BIO_printf(bio_err," -quiet - no s_client output\n");
ce301b6b 319 BIO_printf(bio_err," -ign_eof - ignore input eof (default when -quiet)\n");
020d67fb 320 BIO_printf(bio_err," -no_ign_eof - don't ignore input eof\n");
ddac1974
NL
321#ifndef OPENSSL_NO_PSK
322 BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
323 BIO_printf(bio_err," -psk arg - PSK in hex (without 0x)\n");
79bd20fd 324# ifndef OPENSSL_NO_JPAKE
f3b7bdad
BL
325 BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n");
326# endif
edc032b5
BL
327#endif
328#ifndef OPENSSL_NO_SRP
329 BIO_printf(bio_err," -srpuser user - SRP authentification for 'user'\n");
330 BIO_printf(bio_err," -srppass arg - password for 'user'\n");
331 BIO_printf(bio_err," -srp_lateuser - SRP username into second ClientHello message\n");
332 BIO_printf(bio_err," -srp_moregroups - Tolerate other than the known g N values.\n");
333 BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
ddac1974 334#endif
d02b48c6
RE
335 BIO_printf(bio_err," -ssl2 - just use SSLv2\n");
336 BIO_printf(bio_err," -ssl3 - just use SSLv3\n");
7409d7ad 337 BIO_printf(bio_err," -tls1_2 - just use TLSv1.2\n");
637f374a 338 BIO_printf(bio_err," -tls1_1 - just use TLSv1.1\n");
58964a49 339 BIO_printf(bio_err," -tls1 - just use TLSv1\n");
36d16f8e 340 BIO_printf(bio_err," -dtls1 - just use DTLSv1\n");
046f2101 341 BIO_printf(bio_err," -mtu - set the link layer MTU\n");
7409d7ad 342 BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
d02b48c6 343 BIO_printf(bio_err," -bugs - Switch on all SSL implementation bug workarounds\n");
836f9960 344 BIO_printf(bio_err," -serverpref - Use server's cipher preferences (only SSLv2)\n");
657e60fa 345 BIO_printf(bio_err," -cipher - preferred cipher to use, use the 'openssl ciphers'\n");
dfeab068 346 BIO_printf(bio_err," command to see what is available\n");
135c0af1
RL
347 BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
348 BIO_printf(bio_err," for those protocols that support it, where\n");
349 BIO_printf(bio_err," 'prot' defines which one to assume. Currently,\n");
d5bbead4
BL
350 BIO_printf(bio_err," only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
351 BIO_printf(bio_err," are supported.\n");
b98af49d 352 BIO_printf(bio_err," -xmpphost host - When used with \"-starttls xmpp\" specifies the virtual host.\n");
0b13e9f0 353#ifndef OPENSSL_NO_ENGINE
5270e702 354 BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
0b13e9f0 355#endif
52b621db 356 BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
014f62b6
DSH
357 BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
358 BIO_printf(bio_err," -sess_in arg - file to read SSL session from\n");
ed3883d2
BM
359#ifndef OPENSSL_NO_TLSEXT
360 BIO_printf(bio_err," -servername host - Set TLS extension servername in ClientHello\n");
d24a9c8f 361 BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n");
67c8e7f4 362 BIO_printf(bio_err," -status - request certificate status from server\n");
d24a9c8f 363 BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n");
36086186 364 BIO_printf(bio_err," -serverinfo types - send empty ClientHello extensions (comma-separated numbers)\n");
bf48836c 365# ifndef OPENSSL_NO_NEXTPROTONEG
ee2ffc27
BL
366 BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
367# endif
2911575c 368 BIO_printf(bio_err," -alpn arg - enable ALPN extension, considering named protocols supported (comma-separated list)\n");
ed3883d2 369#endif
2942dde5 370 BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
be81f4dd 371 BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
e0af0405
BL
372 BIO_printf(bio_err," -keymatexport label - Export keying material using label\n");
373 BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n");
d02b48c6
RE
374 }
375
ed3883d2
BM
376#ifndef OPENSSL_NO_TLSEXT
377
378/* This is a context that we pass to callbacks */
379typedef struct tlsextctx_st {
380 BIO * biodebug;
381 int ack;
382} tlsextctx;
383
384
b1277b99
BM
385static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
386 {
ed3883d2 387 tlsextctx * p = (tlsextctx *) arg;
8de5b7f5 388 const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
ed3883d2
BM
389 if (SSL_get_servername_type(s) != -1)
390 p->ack = !SSL_session_reused(s) && hn != NULL;
391 else
f1fd4544 392 BIO_printf(bio_err,"Can't use SSL_get_servername\n");
ed3883d2 393
241520e6 394 return SSL_TLSEXT_ERR_OK;
b1277b99 395 }
ee2ffc27 396
edc032b5
BL
397#ifndef OPENSSL_NO_SRP
398
399/* This is a context that we pass to all callbacks */
400typedef struct srp_arg_st
401 {
402 char *srppassin;
403 char *srplogin;
404 int msg; /* copy from c_msg */
405 int debug; /* copy from c_debug */
406 int amp; /* allow more groups */
407 int strength /* minimal size for N */ ;
408 } SRP_ARG;
409
410#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
411
f2fc3075 412static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
edc032b5
BL
413 {
414 BN_CTX *bn_ctx = BN_CTX_new();
415 BIGNUM *p = BN_new();
416 BIGNUM *r = BN_new();
417 int ret =
418 g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
f2fc3075 419 BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
edc032b5
BL
420 p != NULL && BN_rshift1(p, N) &&
421
422 /* p = (N-1)/2 */
f2fc3075 423 BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
edc032b5
BL
424 r != NULL &&
425
426 /* verify g^((N-1)/2) == -1 (mod N) */
427 BN_mod_exp(r, g, p, N, bn_ctx) &&
428 BN_add_word(r, 1) &&
429 BN_cmp(r, N) == 0;
430
431 if(r)
432 BN_free(r);
433 if(p)
434 BN_free(p);
435 if(bn_ctx)
436 BN_CTX_free(bn_ctx);
437 return ret;
438 }
439
f2fc3075
DSH
440/* This callback is used here for two purposes:
441 - extended debugging
442 - making some primality tests for unknown groups
443 The callback is only called for a non default group.
444
445 An application does not need the call back at all if
446 only the stanard groups are used. In real life situations,
447 client and server already share well known groups,
448 thus there is no need to verify them.
449 Furthermore, in case that a server actually proposes a group that
450 is not one of those defined in RFC 5054, it is more appropriate
451 to add the group to a static list and then compare since
452 primality tests are rather cpu consuming.
453*/
454
edc032b5
BL
455static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
456 {
457 SRP_ARG *srp_arg = (SRP_ARG *)arg;
458 BIGNUM *N = NULL, *g = NULL;
459 if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
460 return 0;
461 if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
462 {
463 BIO_printf(bio_err, "SRP parameters:\n");
464 BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
465 BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
466 BIO_printf(bio_err,"\n");
467 }
468
469 if (SRP_check_known_gN_param(g,N))
470 return 1;
471
472 if (srp_arg->amp == 1)
473 {
474 if (srp_arg->debug)
475 BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
476
f2fc3075 477/* The srp_moregroups is a real debugging feature.
edc032b5
BL
478 Implementors should rather add the value to the known ones.
479 The minimal size has already been tested.
480*/
f2fc3075 481 if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
edc032b5
BL
482 return 1;
483 }
484 BIO_printf(bio_err, "SRP param N and g rejected.\n");
485 return 0;
486 }
487
488#define PWD_STRLEN 1024
489
490static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
491 {
492 SRP_ARG *srp_arg = (SRP_ARG *)arg;
493 char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
494 PW_CB_DATA cb_tmp;
495 int l;
496
497 cb_tmp.password = (char *)srp_arg->srppassin;
498 cb_tmp.prompt_info = "SRP user";
499 if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
500 {
501 BIO_printf (bio_err, "Can't read Password\n");
502 OPENSSL_free(pass);
503 return NULL;
504 }
505 *(pass+l)= '\0';
506
507 return pass;
508 }
509
edc032b5 510#endif
333f926d 511 char *srtp_profiles = NULL;
edc032b5 512
bf48836c 513# ifndef OPENSSL_NO_NEXTPROTONEG
ee2ffc27
BL
514/* This the context that we pass to next_proto_cb */
515typedef struct tlsextnextprotoctx_st {
516 unsigned char *data;
517 unsigned short len;
518 int status;
519} tlsextnextprotoctx;
520
521static tlsextnextprotoctx next_proto;
522
523static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
524 {
525 tlsextnextprotoctx *ctx = arg;
526
527 if (!c_quiet)
528 {
529 /* We can assume that |in| is syntactically valid. */
530 unsigned i;
531 BIO_printf(bio_c_out, "Protocols advertised by server: ");
532 for (i = 0; i < inlen; )
533 {
534 if (i)
535 BIO_write(bio_c_out, ", ", 2);
536 BIO_write(bio_c_out, &in[i + 1], in[i]);
537 i += in[i] + 1;
538 }
539 BIO_write(bio_c_out, "\n", 1);
540 }
541
542 ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
543 return SSL_TLSEXT_ERR_OK;
544 }
bf48836c 545# endif /* ndef OPENSSL_NO_NEXTPROTONEG */
a398f821
T
546
547static int serverinfo_cli_cb(SSL* s, unsigned short ext_type,
548 const unsigned char* in, unsigned short inlen,
549 int* al, void* arg)
550 {
551 char pem_name[100];
552 unsigned char ext_buf[4 + 65536];
553
554 /* Reconstruct the type/len fields prior to extension data */
555 ext_buf[0] = ext_type >> 8;
556 ext_buf[1] = ext_type & 0xFF;
557 ext_buf[2] = inlen >> 8;
558 ext_buf[3] = inlen & 0xFF;
559 memcpy(ext_buf+4, in, inlen);
560
70d416ec
BL
561 BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
562 ext_type);
a398f821
T
563 PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
564 return 1;
565 }
566
ed3883d2
BM
567#endif
568
85c67492
RL
569enum
570{
571 PROTO_OFF = 0,
572 PROTO_SMTP,
573 PROTO_POP3,
574 PROTO_IMAP,
d5bbead4 575 PROTO_FTP,
640b86cb 576 PROTO_XMPP
85c67492
RL
577};
578
667ac4ec
RE
579int MAIN(int, char **);
580
6b691a5c 581int MAIN(int argc, char **argv)
d02b48c6 582 {
74ecfab4 583 int build_chain = 0;
67b6f1ca 584 SSL *con=NULL;
4f7a2ab8
DSH
585#ifndef OPENSSL_NO_KRB5
586 KSSL_CTX *kctx;
587#endif
d02b48c6 588 int s,k,width,state=0;
135c0af1 589 char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
d02b48c6
RE
590 int cbuf_len,cbuf_off;
591 int sbuf_len,sbuf_off;
592 fd_set readfds,writefds;
593 short port=PORT;
594 int full_log=1;
595 char *host=SSL_HOST_NAME;
a9351320 596 const char *unix_path = NULL;
b98af49d 597 char *xmpphost = NULL;
4e71d952 598 char *cert_file=NULL,*key_file=NULL,*chain_file=NULL;
826a42a0
DSH
599 int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
600 char *passarg = NULL, *pass = NULL;
601 X509 *cert = NULL;
602 EVP_PKEY *key = NULL;
4e71d952 603 STACK_OF(X509) *chain = NULL;
5d2e07f1 604 char *CApath=NULL,*CAfile=NULL;
a5afc0a8
DSH
605 char *chCApath=NULL,*chCAfile=NULL;
606 char *vfyCApath=NULL,*vfyCAfile=NULL;
5d2e07f1 607 int reconnect=0,badop=0,verify=SSL_VERIFY_NONE;
1bdb8633 608 int crlf=0;
c7ac31e2 609 int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
d02b48c6
RE
610 SSL_CTX *ctx=NULL;
611 int ret=1,in_init=1,i,nbio_test=0;
85c67492 612 int starttls_proto = PROTO_OFF;
db99779b
DSH
613 int prexit = 0;
614 X509_VERIFY_PARAM *vpm = NULL;
615 int badarg = 0;
4ebb342f 616 const SSL_METHOD *meth=NULL;
b1277b99 617 int socket_type=SOCK_STREAM;
d02b48c6 618 BIO *sbio;
52b621db 619 char *inrand=NULL;
85c67492 620 int mbuf_len=0;
b972fbaa 621 struct timeval timeout, *timeoutp;
0b13e9f0 622#ifndef OPENSSL_NO_ENGINE
5270e702 623 char *engine_id=NULL;
59d2d48f 624 char *ssl_client_engine_id=NULL;
70531c14 625 ENGINE *ssl_client_engine=NULL;
0b13e9f0 626#endif
70531c14 627 ENGINE *e=NULL;
4700aea9 628#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
06f4536a 629 struct timeval tv;
4700aea9
UM
630#if defined(OPENSSL_SYS_BEOS_R5)
631 int stdin_set = 0;
632#endif
06f4536a 633#endif
ed3883d2
BM
634#ifndef OPENSSL_NO_TLSEXT
635 char *servername = NULL;
636 tlsextctx tlsextcbp =
637 {NULL,0};
bf48836c 638# ifndef OPENSSL_NO_NEXTPROTONEG
ee2ffc27
BL
639 const char *next_proto_neg_in = NULL;
640# endif
2911575c 641 const char *alpn_in = NULL;
a398f821
T
642# define MAX_SI_TYPES 100
643 unsigned short serverinfo_types[MAX_SI_TYPES];
644 int serverinfo_types_count = 0;
ed3883d2 645#endif
6434abbf
DSH
646 char *sess_in = NULL;
647 char *sess_out = NULL;
36d16f8e 648 struct sockaddr peer;
6c61726b 649 int peerlen = sizeof(peer);
36d16f8e 650 int enable_timeouts = 0 ;
b1277b99 651 long socket_mtu = 0;
79bd20fd 652#ifndef OPENSSL_NO_JPAKE
b252cf0d
DSH
653static char *jpake_secret = NULL;
654#define no_jpake !jpake_secret
655#else
656#define no_jpake 1
ed551cdd 657#endif
edc032b5
BL
658#ifndef OPENSSL_NO_SRP
659 char * srppass = NULL;
660 int srp_lateuser = 0;
661 SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
662#endif
3208fc59 663 SSL_EXCERT *exc = NULL;
36d16f8e 664
5d2e07f1
DSH
665 SSL_CONF_CTX *cctx = NULL;
666 STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
a70da5b3 667
fdb78f3d
DSH
668 char *crl_file = NULL;
669 int crl_format = FORMAT_PEM;
0090a686 670 int crl_download = 0;
fdb78f3d 671 STACK_OF(X509_CRL) *crls = NULL;
e03c5b59 672 int sdebug = 0;
fdb78f3d 673
d02b48c6 674 meth=SSLv23_client_method();
d02b48c6
RE
675
676 apps_startup();
58964a49 677 c_Pause=0;
d02b48c6 678 c_quiet=0;
ce301b6b 679 c_ign_eof=0;
d02b48c6 680 c_debug=0;
a661b653 681 c_msg=0;
6d02d8e4 682 c_showcerts=0;
d02b48c6
RE
683
684 if (bio_err == NULL)
685 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
686
3647bee2
DSH
687 if (!load_config(bio_err, NULL))
688 goto end;
5d2e07f1
DSH
689 cctx = SSL_CONF_CTX_new();
690 if (!cctx)
691 goto end;
692 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);
693 SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
3647bee2 694
26a3a48d 695 if ( ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
135c0af1
RL
696 ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
697 ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
d02b48c6
RE
698 {
699 BIO_printf(bio_err,"out of memory\n");
700 goto end;
701 }
702
703 verify_depth=0;
704 verify_error=X509_V_OK;
705#ifdef FIONBIO
706 c_nbio=0;
707#endif
708
709 argc--;
710 argv++;
711 while (argc >= 1)
712 {
713 if (strcmp(*argv,"-host") == 0)
714 {
715 if (--argc < 1) goto bad;
716 host= *(++argv);
717 }
718 else if (strcmp(*argv,"-port") == 0)
719 {
720 if (--argc < 1) goto bad;
721 port=atoi(*(++argv));
722 if (port == 0) goto bad;
723 }
724 else if (strcmp(*argv,"-connect") == 0)
725 {
726 if (--argc < 1) goto bad;
727 if (!extract_host_port(*(++argv),&host,NULL,&port))
728 goto bad;
729 }
a9351320
GT
730 else if (strcmp(*argv,"-unix") == 0)
731 {
732 if (--argc < 1) goto bad;
733 unix_path = *(++argv);
734 }
b98af49d
CALP
735 else if (strcmp(*argv,"-xmpphost") == 0)
736 {
737 if (--argc < 1) goto bad;
738 xmpphost= *(++argv);
739 }
d02b48c6
RE
740 else if (strcmp(*argv,"-verify") == 0)
741 {
742 verify=SSL_VERIFY_PEER;
743 if (--argc < 1) goto bad;
744 verify_depth=atoi(*(++argv));
2a7cbe77
DSH
745 if (!c_quiet)
746 BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
d02b48c6
RE
747 }
748 else if (strcmp(*argv,"-cert") == 0)
749 {
750 if (--argc < 1) goto bad;
751 cert_file= *(++argv);
752 }
fdb78f3d
DSH
753 else if (strcmp(*argv,"-CRL") == 0)
754 {
755 if (--argc < 1) goto bad;
756 crl_file= *(++argv);
757 }
0090a686
DSH
758 else if (strcmp(*argv,"-crl_download") == 0)
759 crl_download = 1;
6434abbf
DSH
760 else if (strcmp(*argv,"-sess_out") == 0)
761 {
762 if (--argc < 1) goto bad;
763 sess_out = *(++argv);
764 }
765 else if (strcmp(*argv,"-sess_in") == 0)
766 {
767 if (--argc < 1) goto bad;
768 sess_in = *(++argv);
769 }
826a42a0
DSH
770 else if (strcmp(*argv,"-certform") == 0)
771 {
772 if (--argc < 1) goto bad;
773 cert_format = str2fmt(*(++argv));
774 }
fdb78f3d
DSH
775 else if (strcmp(*argv,"-CRLform") == 0)
776 {
777 if (--argc < 1) goto bad;
778 crl_format = str2fmt(*(++argv));
779 }
db99779b
DSH
780 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
781 {
782 if (badarg)
783 goto bad;
784 continue;
785 }
5d20c4fb
DSH
786 else if (strcmp(*argv,"-verify_return_error") == 0)
787 verify_return_error = 1;
2a7cbe77
DSH
788 else if (strcmp(*argv,"-verify_quiet") == 0)
789 verify_quiet = 1;
790 else if (strcmp(*argv,"-brief") == 0)
791 {
792 c_brief = 1;
793 verify_quiet = 1;
794 c_quiet = 1;
795 }
3208fc59
DSH
796 else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
797 {
798 if (badarg)
799 goto bad;
800 continue;
801 }
5d2e07f1
DSH
802 else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
803 {
804 if (badarg)
805 goto bad;
806 continue;
807 }
c3ed3b6e
DSH
808 else if (strcmp(*argv,"-prexit") == 0)
809 prexit=1;
1bdb8633
BM
810 else if (strcmp(*argv,"-crlf") == 0)
811 crlf=1;
d02b48c6 812 else if (strcmp(*argv,"-quiet") == 0)
ce301b6b 813 {
d02b48c6 814 c_quiet=1;
ce301b6b
RL
815 c_ign_eof=1;
816 }
817 else if (strcmp(*argv,"-ign_eof") == 0)
818 c_ign_eof=1;
020d67fb
LJ
819 else if (strcmp(*argv,"-no_ign_eof") == 0)
820 c_ign_eof=0;
d02b48c6
RE
821 else if (strcmp(*argv,"-pause") == 0)
822 c_Pause=1;
823 else if (strcmp(*argv,"-debug") == 0)
824 c_debug=1;
6434abbf
DSH
825#ifndef OPENSSL_NO_TLSEXT
826 else if (strcmp(*argv,"-tlsextdebug") == 0)
827 c_tlsextdebug=1;
67c8e7f4
DSH
828 else if (strcmp(*argv,"-status") == 0)
829 c_status_req=1;
02a00bb0 830#endif
a661b653
BM
831 else if (strcmp(*argv,"-msg") == 0)
832 c_msg=1;
93ab9e42
DSH
833 else if (strcmp(*argv,"-msgfile") == 0)
834 {
835 if (--argc < 1) goto bad;
836 bio_c_msg = BIO_new_file(*(++argv), "w");
837 }
838#ifndef OPENSSL_NO_SSL_TRACE
839 else if (strcmp(*argv,"-trace") == 0)
840 c_msg=2;
841#endif
e03c5b59
DSH
842 else if (strcmp(*argv,"-security_debug") == 0)
843 { sdebug=1; }
844 else if (strcmp(*argv,"-security_debug_verbose") == 0)
845 { sdebug=2; }
6d02d8e4
BM
846 else if (strcmp(*argv,"-showcerts") == 0)
847 c_showcerts=1;
d02b48c6
RE
848 else if (strcmp(*argv,"-nbio_test") == 0)
849 nbio_test=1;
850 else if (strcmp(*argv,"-state") == 0)
851 state=1;
ddac1974
NL
852#ifndef OPENSSL_NO_PSK
853 else if (strcmp(*argv,"-psk_identity") == 0)
854 {
855 if (--argc < 1) goto bad;
856 psk_identity=*(++argv);
857 }
858 else if (strcmp(*argv,"-psk") == 0)
859 {
860 size_t j;
861
862 if (--argc < 1) goto bad;
863 psk_key=*(++argv);
864 for (j = 0; j < strlen(psk_key); j++)
865 {
a50bce82 866 if (isxdigit((unsigned char)psk_key[j]))
ddac1974
NL
867 continue;
868 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
869 goto bad;
870 }
871 }
872#endif
edc032b5
BL
873#ifndef OPENSSL_NO_SRP
874 else if (strcmp(*argv,"-srpuser") == 0)
875 {
876 if (--argc < 1) goto bad;
877 srp_arg.srplogin= *(++argv);
878 meth=TLSv1_client_method();
879 }
880 else if (strcmp(*argv,"-srppass") == 0)
881 {
882 if (--argc < 1) goto bad;
883 srppass= *(++argv);
884 meth=TLSv1_client_method();
885 }
886 else if (strcmp(*argv,"-srp_strength") == 0)
887 {
888 if (--argc < 1) goto bad;
889 srp_arg.strength=atoi(*(++argv));
890 BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
891 meth=TLSv1_client_method();
892 }
893 else if (strcmp(*argv,"-srp_lateuser") == 0)
894 {
895 srp_lateuser= 1;
896 meth=TLSv1_client_method();
897 }
898 else if (strcmp(*argv,"-srp_moregroups") == 0)
899 {
900 srp_arg.amp=1;
901 meth=TLSv1_client_method();
902 }
903#endif
cf1b7d96 904#ifndef OPENSSL_NO_SSL2
d02b48c6
RE
905 else if (strcmp(*argv,"-ssl2") == 0)
906 meth=SSLv2_client_method();
907#endif
cf1b7d96 908#ifndef OPENSSL_NO_SSL3
d02b48c6
RE
909 else if (strcmp(*argv,"-ssl3") == 0)
910 meth=SSLv3_client_method();
58964a49 911#endif
cf1b7d96 912#ifndef OPENSSL_NO_TLS1
7409d7ad
DSH
913 else if (strcmp(*argv,"-tls1_2") == 0)
914 meth=TLSv1_2_client_method();
637f374a
DSH
915 else if (strcmp(*argv,"-tls1_1") == 0)
916 meth=TLSv1_1_client_method();
58964a49
RE
917 else if (strcmp(*argv,"-tls1") == 0)
918 meth=TLSv1_client_method();
36d16f8e
BL
919#endif
920#ifndef OPENSSL_NO_DTLS1
c6913eeb
DSH
921 else if (strcmp(*argv,"-dtls") == 0)
922 {
923 meth=DTLS_client_method();
924 socket_type=SOCK_DGRAM;
925 }
36d16f8e
BL
926 else if (strcmp(*argv,"-dtls1") == 0)
927 {
928 meth=DTLSv1_client_method();
b1277b99 929 socket_type=SOCK_DGRAM;
36d16f8e 930 }
c3b344e3
DSH
931 else if (strcmp(*argv,"-dtls1_2") == 0)
932 {
933 meth=DTLSv1_2_client_method();
934 socket_type=SOCK_DGRAM;
935 }
36d16f8e
BL
936 else if (strcmp(*argv,"-timeout") == 0)
937 enable_timeouts=1;
938 else if (strcmp(*argv,"-mtu") == 0)
939 {
940 if (--argc < 1) goto bad;
b1277b99 941 socket_mtu = atol(*(++argv));
36d16f8e 942 }
d02b48c6 943#endif
826a42a0
DSH
944 else if (strcmp(*argv,"-keyform") == 0)
945 {
946 if (--argc < 1) goto bad;
947 key_format = str2fmt(*(++argv));
948 }
949 else if (strcmp(*argv,"-pass") == 0)
950 {
951 if (--argc < 1) goto bad;
952 passarg = *(++argv);
953 }
4e71d952
DSH
954 else if (strcmp(*argv,"-cert_chain") == 0)
955 {
956 if (--argc < 1) goto bad;
957 chain_file= *(++argv);
958 }
d02b48c6
RE
959 else if (strcmp(*argv,"-key") == 0)
960 {
961 if (--argc < 1) goto bad;
962 key_file= *(++argv);
963 }
964 else if (strcmp(*argv,"-reconnect") == 0)
965 {
966 reconnect=5;
967 }
968 else if (strcmp(*argv,"-CApath") == 0)
969 {
970 if (--argc < 1) goto bad;
971 CApath= *(++argv);
972 }
a5afc0a8
DSH
973 else if (strcmp(*argv,"-chainCApath") == 0)
974 {
975 if (--argc < 1) goto bad;
976 chCApath= *(++argv);
977 }
978 else if (strcmp(*argv,"-verifyCApath") == 0)
979 {
980 if (--argc < 1) goto bad;
981 vfyCApath= *(++argv);
982 }
74ecfab4
DSH
983 else if (strcmp(*argv,"-build_chain") == 0)
984 build_chain = 1;
d02b48c6
RE
985 else if (strcmp(*argv,"-CAfile") == 0)
986 {
987 if (--argc < 1) goto bad;
988 CAfile= *(++argv);
989 }
a5afc0a8
DSH
990 else if (strcmp(*argv,"-chainCAfile") == 0)
991 {
992 if (--argc < 1) goto bad;
993 chCAfile= *(++argv);
994 }
995 else if (strcmp(*argv,"-verifyCAfile") == 0)
996 {
997 if (--argc < 1) goto bad;
998 vfyCAfile= *(++argv);
999 }
6434abbf 1000#ifndef OPENSSL_NO_TLSEXT
bf48836c 1001# ifndef OPENSSL_NO_NEXTPROTONEG
ee2ffc27
BL
1002 else if (strcmp(*argv,"-nextprotoneg") == 0)
1003 {
1004 if (--argc < 1) goto bad;
1005 next_proto_neg_in = *(++argv);
1006 }
2911575c 1007# endif
6f017a8f
AL
1008 else if (strcmp(*argv,"-alpn") == 0)
1009 {
1010 if (--argc < 1) goto bad;
1011 alpn_in = *(++argv);
1012 }
a398f821
T
1013 else if (strcmp(*argv,"-serverinfo") == 0)
1014 {
1015 char *c;
1016 int start = 0;
1017 int len;
1018
1019 if (--argc < 1) goto bad;
1020 c = *(++argv);
1021 serverinfo_types_count = 0;
1022 len = strlen(c);
1023 for (i = 0; i <= len; ++i)
1024 {
1025 if (i == len || c[i] == ',')
1026 {
1027 serverinfo_types[serverinfo_types_count]
1028 = atoi(c+start);
1029 serverinfo_types_count++;
1030 start = i+1;
1031 }
1032 if (serverinfo_types_count == MAX_SI_TYPES)
1033 break;
1034 }
1035 }
6434abbf 1036#endif
d02b48c6
RE
1037#ifdef FIONBIO
1038 else if (strcmp(*argv,"-nbio") == 0)
1039 { c_nbio=1; }
1040#endif
135c0af1
RL
1041 else if (strcmp(*argv,"-starttls") == 0)
1042 {
1043 if (--argc < 1) goto bad;
1044 ++argv;
1045 if (strcmp(*argv,"smtp") == 0)
85c67492 1046 starttls_proto = PROTO_SMTP;
4f17dfcd 1047 else if (strcmp(*argv,"pop3") == 0)
85c67492
RL
1048 starttls_proto = PROTO_POP3;
1049 else if (strcmp(*argv,"imap") == 0)
1050 starttls_proto = PROTO_IMAP;
1051 else if (strcmp(*argv,"ftp") == 0)
1052 starttls_proto = PROTO_FTP;
d5bbead4
BL
1053 else if (strcmp(*argv, "xmpp") == 0)
1054 starttls_proto = PROTO_XMPP;
135c0af1
RL
1055 else
1056 goto bad;
1057 }
0b13e9f0 1058#ifndef OPENSSL_NO_ENGINE
5270e702
RL
1059 else if (strcmp(*argv,"-engine") == 0)
1060 {
1061 if (--argc < 1) goto bad;
1062 engine_id = *(++argv);
1063 }
59d2d48f
DSH
1064 else if (strcmp(*argv,"-ssl_client_engine") == 0)
1065 {
1066 if (--argc < 1) goto bad;
1067 ssl_client_engine_id = *(++argv);
1068 }
0b13e9f0 1069#endif
52b621db
LJ
1070 else if (strcmp(*argv,"-rand") == 0)
1071 {
1072 if (--argc < 1) goto bad;
1073 inrand= *(++argv);
1074 }
ed3883d2
BM
1075#ifndef OPENSSL_NO_TLSEXT
1076 else if (strcmp(*argv,"-servername") == 0)
1077 {
1078 if (--argc < 1) goto bad;
1079 servername= *(++argv);
1080 /* meth=TLSv1_client_method(); */
1081 }
1082#endif
79bd20fd 1083#ifndef OPENSSL_NO_JPAKE
6caa4edd
BL
1084 else if (strcmp(*argv,"-jpake") == 0)
1085 {
1086 if (--argc < 1) goto bad;
1087 jpake_secret = *++argv;
1088 }
ed551cdd 1089#endif
333f926d
BL
1090 else if (strcmp(*argv,"-use_srtp") == 0)
1091 {
1092 if (--argc < 1) goto bad;
1093 srtp_profiles = *(++argv);
1094 }
e0af0405
BL
1095 else if (strcmp(*argv,"-keymatexport") == 0)
1096 {
1097 if (--argc < 1) goto bad;
1098 keymatexportlabel= *(++argv);
1099 }
1100 else if (strcmp(*argv,"-keymatexportlen") == 0)
1101 {
1102 if (--argc < 1) goto bad;
1103 keymatexportlen=atoi(*(++argv));
1104 if (keymatexportlen == 0) goto bad;
1105 }
333f926d 1106 else
d02b48c6
RE
1107 {
1108 BIO_printf(bio_err,"unknown option %s\n",*argv);
1109 badop=1;
1110 break;
1111 }
1112 argc--;
1113 argv++;
1114 }
1115 if (badop)
1116 {
1117bad:
1118 sc_usage();
1119 goto end;
1120 }
1121
a9351320
GT
1122 if (unix_path && (socket_type != SOCK_STREAM))
1123 {
1124 BIO_printf(bio_err, "Can't use unix sockets and datagrams together\n");
1125 goto end;
1126 }
79bd20fd 1127#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
f3b7bdad
BL
1128 if (jpake_secret)
1129 {
1130 if (psk_key)
1131 {
1132 BIO_printf(bio_err,
1133 "Can't use JPAKE and PSK together\n");
1134 goto end;
1135 }
1136 psk_identity = "JPAKE";
1137 }
f3b7bdad
BL
1138#endif
1139
cead7f36
RL
1140 OpenSSL_add_ssl_algorithms();
1141 SSL_load_error_strings();
1142
bf48836c 1143#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
ee2ffc27
BL
1144 next_proto.status = -1;
1145 if (next_proto_neg_in)
1146 {
1147 next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1148 if (next_proto.data == NULL)
1149 {
1150 BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1151 goto end;
1152 }
1153 }
1154 else
1155 next_proto.data = NULL;
1156#endif
1157
0b13e9f0 1158#ifndef OPENSSL_NO_ENGINE
cead7f36 1159 e = setup_engine(bio_err, engine_id, 1);
59d2d48f
DSH
1160 if (ssl_client_engine_id)
1161 {
1162 ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1163 if (!ssl_client_engine)
1164 {
1165 BIO_printf(bio_err,
1166 "Error getting client auth engine\n");
1167 goto end;
1168 }
1169 }
1170
0b13e9f0 1171#endif
826a42a0
DSH
1172 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1173 {
1174 BIO_printf(bio_err, "Error getting password\n");
1175 goto end;
1176 }
1177
1178 if (key_file == NULL)
1179 key_file = cert_file;
1180
abbc186b
DSH
1181
1182 if (key_file)
1183
826a42a0 1184 {
abbc186b
DSH
1185
1186 key = load_key(bio_err, key_file, key_format, 0, pass, e,
1187 "client certificate private key file");
1188 if (!key)
1189 {
1190 ERR_print_errors(bio_err);
1191 goto end;
1192 }
1193
826a42a0
DSH
1194 }
1195
abbc186b 1196 if (cert_file)
826a42a0 1197
826a42a0 1198 {
abbc186b
DSH
1199 cert = load_cert(bio_err,cert_file,cert_format,
1200 NULL, e, "client certificate file");
1201
1202 if (!cert)
1203 {
1204 ERR_print_errors(bio_err);
1205 goto end;
1206 }
826a42a0 1207 }
cead7f36 1208
4e71d952
DSH
1209 if (chain_file)
1210 {
1211 chain = load_certs(bio_err, chain_file,FORMAT_PEM,
1212 NULL, e, "client certificate chain");
1213 if (!chain)
1214 goto end;
1215 }
1216
fdb78f3d
DSH
1217 if (crl_file)
1218 {
1219 X509_CRL *crl;
1220 crl = load_crl(crl_file, crl_format);
1221 if (!crl)
1222 {
1223 BIO_puts(bio_err, "Error loading CRL\n");
1224 ERR_print_errors(bio_err);
1225 goto end;
1226 }
1227 crls = sk_X509_CRL_new_null();
1228 if (!crls || !sk_X509_CRL_push(crls, crl))
1229 {
1230 BIO_puts(bio_err, "Error adding CRL\n");
1231 ERR_print_errors(bio_err);
1232 X509_CRL_free(crl);
1233 goto end;
1234 }
1235 }
1236
3208fc59
DSH
1237 if (!load_excert(&exc, bio_err))
1238 goto end;
1239
52b621db
LJ
1240 if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1241 && !RAND_status())
1242 {
1243 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1244 }
1245 if (inrand != NULL)
1246 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1247 app_RAND_load_files(inrand));
a31011e8 1248
d02b48c6
RE
1249 if (bio_c_out == NULL)
1250 {
1740c9fb 1251 if (c_quiet && !c_debug)
d02b48c6
RE
1252 {
1253 bio_c_out=BIO_new(BIO_s_null());
1740c9fb
DSH
1254 if (c_msg && !bio_c_msg)
1255 bio_c_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
d02b48c6
RE
1256 }
1257 else
1258 {
1259 if (bio_c_out == NULL)
1260 bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1261 }
1262 }
1263
edc032b5
BL
1264#ifndef OPENSSL_NO_SRP
1265 if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1266 {
1267 BIO_printf(bio_err, "Error getting password\n");
1268 goto end;
1269 }
1270#endif
1271
d02b48c6
RE
1272 ctx=SSL_CTX_new(meth);
1273 if (ctx == NULL)
1274 {
1275 ERR_print_errors(bio_err);
1276 goto end;
1277 }
1278
e03c5b59
DSH
1279 if (sdebug)
1280 ssl_ctx_security_debug(ctx, bio_err, sdebug);
1281
db99779b
DSH
1282 if (vpm)
1283 SSL_CTX_set1_param(ctx, vpm);
1284
b252cf0d 1285 if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, 1, no_jpake))
5d2e07f1
DSH
1286 {
1287 ERR_print_errors(bio_err);
1288 goto end;
1289 }
1290
0090a686
DSH
1291 if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1292 crls, crl_download))
a5afc0a8
DSH
1293 {
1294 BIO_printf(bio_err, "Error loading store locations\n");
1295 ERR_print_errors(bio_err);
1296 goto end;
1297 }
1298
59d2d48f
DSH
1299#ifndef OPENSSL_NO_ENGINE
1300 if (ssl_client_engine)
1301 {
1302 if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1303 {
1304 BIO_puts(bio_err, "Error setting client auth engine\n");
1305 ERR_print_errors(bio_err);
1306 ENGINE_free(ssl_client_engine);
1307 goto end;
1308 }
1309 ENGINE_free(ssl_client_engine);
1310 }
1311#endif
1312
ddac1974 1313#ifndef OPENSSL_NO_PSK
79bd20fd
DSH
1314#ifdef OPENSSL_NO_JPAKE
1315 if (psk_key != NULL)
1316#else
f3b7bdad 1317 if (psk_key != NULL || jpake_secret)
79bd20fd 1318#endif
ddac1974
NL
1319 {
1320 if (c_debug)
f3b7bdad 1321 BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
ddac1974
NL
1322 SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1323 }
333f926d
BL
1324 if (srtp_profiles != NULL)
1325 SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
ddac1974 1326#endif
3208fc59 1327 if (exc) ssl_ctx_set_excert(ctx, exc);
36d16f8e
BL
1328 /* DTLS: partial reads end up discarding unread UDP bytes :-(
1329 * Setting read ahead solves this problem.
1330 */
b1277b99 1331 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
d02b48c6 1332
6f017a8f
AL
1333#if !defined(OPENSSL_NO_TLSEXT)
1334# if !defined(OPENSSL_NO_NEXTPROTONEG)
ee2ffc27
BL
1335 if (next_proto.data)
1336 SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
6f017a8f
AL
1337# endif
1338 if (alpn_in)
1339 {
1340 unsigned short alpn_len;
1341 unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);
1342
1343 if (alpn == NULL)
1344 {
1345 BIO_printf(bio_err, "Error parsing -alpn argument\n");
1346 goto end;
1347 }
1348 SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len);
a8989362 1349 OPENSSL_free(alpn);
6f017a8f 1350 }
ee2ffc27 1351#endif
a398f821
T
1352#ifndef OPENSSL_NO_TLSEXT
1353 if (serverinfo_types_count)
1354 {
1355 for (i = 0; i < serverinfo_types_count; i++)
1356 {
1357 SSL_CTX_set_custom_cli_ext(ctx,
1358 serverinfo_types[i],
1359 NULL,
1360 serverinfo_cli_cb,
1361 NULL);
1362 }
1363 }
1364#endif
ee2ffc27 1365
d02b48c6 1366 if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
d02b48c6
RE
1367#if 0
1368 else
1369 SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1370#endif
1371
1372 SSL_CTX_set_verify(ctx,verify,verify_callback);
d02b48c6
RE
1373
1374 if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1375 (!SSL_CTX_set_default_verify_paths(ctx)))
1376 {
657e60fa 1377 /* BIO_printf(bio_err,"error setting default verify locations\n"); */
d02b48c6 1378 ERR_print_errors(bio_err);
58964a49 1379 /* goto end; */
d02b48c6
RE
1380 }
1381
0090a686 1382 ssl_ctx_add_crls(ctx, crls, crl_download);
fdb78f3d 1383
4e71d952 1384 if (!set_cert_key_stuff(ctx,cert,key,chain,build_chain))
74ecfab4
DSH
1385 goto end;
1386
ed3883d2 1387#ifndef OPENSSL_NO_TLSEXT
b1277b99
BM
1388 if (servername != NULL)
1389 {
ed3883d2
BM
1390 tlsextcbp.biodebug = bio_err;
1391 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1392 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
b1277b99 1393 }
edc032b5
BL
1394#ifndef OPENSSL_NO_SRP
1395 if (srp_arg.srplogin)
1396 {
f2fc3075 1397 if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
edc032b5
BL
1398 {
1399 BIO_printf(bio_err,"Unable to set SRP username\n");
1400 goto end;
1401 }
1402 srp_arg.msg = c_msg;
1403 srp_arg.debug = c_debug ;
1404 SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1405 SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1406 SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1407 if (c_msg || c_debug || srp_arg.amp == 0)
1408 SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1409 }
1410
1411#endif
ed3883d2 1412#endif
d02b48c6 1413
82fc1d9c 1414 con=SSL_new(ctx);
6434abbf
DSH
1415 if (sess_in)
1416 {
1417 SSL_SESSION *sess;
1418 BIO *stmp = BIO_new_file(sess_in, "r");
1419 if (!stmp)
1420 {
1421 BIO_printf(bio_err, "Can't open session file %s\n",
1422 sess_in);
1423 ERR_print_errors(bio_err);
1424 goto end;
1425 }
1426 sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1427 BIO_free(stmp);
1428 if (!sess)
1429 {
1430 BIO_printf(bio_err, "Can't open session file %s\n",
1431 sess_in);
1432 ERR_print_errors(bio_err);
1433 goto end;
1434 }
1435 SSL_set_session(con, sess);
1436 SSL_SESSION_free(sess);
1437 }
ed3883d2 1438#ifndef OPENSSL_NO_TLSEXT
b1277b99
BM
1439 if (servername != NULL)
1440 {
a13c20f6 1441 if (!SSL_set_tlsext_host_name(con,servername))
b1277b99 1442 {
ed3883d2
BM
1443 BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1444 ERR_print_errors(bio_err);
1445 goto end;
b1277b99 1446 }
ed3883d2 1447 }
ed3883d2 1448#endif
cf1b7d96 1449#ifndef OPENSSL_NO_KRB5
4f7a2ab8 1450 if (con && (kctx = kssl_ctx_new()) != NULL)
f9b3bff6 1451 {
4f7a2ab8
DSH
1452 SSL_set0_kssl_ctx(con, kctx);
1453 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
f9b3bff6 1454 }
cf1b7d96 1455#endif /* OPENSSL_NO_KRB5 */
58964a49 1456/* SSL_set_cipher_list(con,"RC4-MD5"); */
761772d7
BM
1457#if 0
1458#ifdef TLSEXT_TYPE_opaque_prf_input
86d4bc3a 1459 SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
761772d7
BM
1460#endif
1461#endif
d02b48c6
RE
1462
1463re_start:
9cd86abb
DSH
1464#ifdef NO_SYS_UN_H
1465 if (init_client(&s,host,port,socket_type) == 0)
1466#else
a9351320
GT
1467 if ((!unix_path && (init_client(&s,host,port,socket_type) == 0)) ||
1468 (unix_path && (init_client_unix(&s,unix_path) == 0)))
9cd86abb 1469#endif
d02b48c6 1470 {
58964a49 1471 BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
d02b48c6
RE
1472 SHUTDOWN(s);
1473 goto end;
1474 }
1475 BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1476
1477#ifdef FIONBIO
1478 if (c_nbio)
1479 {
1480 unsigned long l=1;
1481 BIO_printf(bio_c_out,"turning on non blocking io\n");
58964a49
RE
1482 if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1483 {
1484 ERR_print_errors(bio_err);
1485 goto end;
1486 }
d02b48c6
RE
1487 }
1488#endif
08557cf2 1489 if (c_Pause & 0x01) SSL_set_debug(con, 1);
36d16f8e 1490
c3b344e3 1491 if (socket_type == SOCK_DGRAM)
36d16f8e 1492 {
36d16f8e
BL
1493
1494 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
6c61726b 1495 if (getsockname(s, &peer, (void *)&peerlen) < 0)
36d16f8e
BL
1496 {
1497 BIO_printf(bio_err, "getsockname:errno=%d\n",
1498 get_last_socket_error());
1499 SHUTDOWN(s);
1500 goto end;
1501 }
1502
710069c1 1503 (void)BIO_ctrl_set_connected(sbio, 1, &peer);
36d16f8e 1504
b1277b99 1505 if (enable_timeouts)
36d16f8e
BL
1506 {
1507 timeout.tv_sec = 0;
1508 timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1509 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1510
1511 timeout.tv_sec = 0;
1512 timeout.tv_usec = DGRAM_SND_TIMEOUT;
1513 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1514 }
1515
046f2101 1516 if (socket_mtu > 28)
36d16f8e
BL
1517 {
1518 SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
046f2101 1519 SSL_set_mtu(con, socket_mtu - 28);
36d16f8e
BL
1520 }
1521 else
1522 /* want to do MTU discovery */
1523 BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1524 }
1525 else
1526 sbio=BIO_new_socket(s,BIO_NOCLOSE);
1527
d02b48c6
RE
1528 if (nbio_test)
1529 {
1530 BIO *test;
1531
1532 test=BIO_new(BIO_f_nbio_test());
1533 sbio=BIO_push(test,sbio);
1534 }
1535
1536 if (c_debug)
1537 {
08557cf2 1538 SSL_set_debug(con, 1);
25495640 1539 BIO_set_callback(sbio,bio_dump_callback);
7806f3dd 1540 BIO_set_callback_arg(sbio,(char *)bio_c_out);
d02b48c6 1541 }
a661b653
BM
1542 if (c_msg)
1543 {
93ab9e42
DSH
1544#ifndef OPENSSL_NO_SSL_TRACE
1545 if (c_msg == 2)
1546 SSL_set_msg_callback(con, SSL_trace);
1547 else
1548#endif
1549 SSL_set_msg_callback(con, msg_cb);
1550 SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
a661b653 1551 }
6434abbf
DSH
1552#ifndef OPENSSL_NO_TLSEXT
1553 if (c_tlsextdebug)
1554 {
1555 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1556 SSL_set_tlsext_debug_arg(con, bio_c_out);
1557 }
67c8e7f4
DSH
1558 if (c_status_req)
1559 {
1560 SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1561 SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1562 SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1563#if 0
1564{
1565STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1566OCSP_RESPID *id = OCSP_RESPID_new();
1567id->value.byKey = ASN1_OCTET_STRING_new();
1568id->type = V_OCSP_RESPID_KEY;
1569ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1570sk_OCSP_RESPID_push(ids, id);
1571SSL_set_tlsext_status_ids(con, ids);
1572}
1573#endif
1574 }
6434abbf 1575#endif
79bd20fd 1576#ifndef OPENSSL_NO_JPAKE
6caa4edd
BL
1577 if (jpake_secret)
1578 jpake_client_auth(bio_c_out, sbio, jpake_secret);
ed551cdd 1579#endif
6caa4edd 1580
d02b48c6
RE
1581 SSL_set_bio(con,sbio,sbio);
1582 SSL_set_connect_state(con);
1583
1584 /* ok, lets connect */
1585 width=SSL_get_fd(con)+1;
1586
1587 read_tty=1;
1588 write_tty=0;
1589 tty_on=0;
1590 read_ssl=1;
1591 write_ssl=1;
1592
1593 cbuf_len=0;
1594 cbuf_off=0;
1595 sbuf_len=0;
1596 sbuf_off=0;
1597
135c0af1 1598 /* This is an ugly hack that does a lot of assumptions */
ee373e7f
LJ
1599 /* We do have to handle multi-line responses which may come
1600 in a single packet or not. We therefore have to use
1601 BIO_gets() which does need a buffering BIO. So during
1602 the initial chitchat we do push a buffering BIO into the
1603 chain that is removed again later on to not disturb the
1604 rest of the s_client operation. */
85c67492 1605 if (starttls_proto == PROTO_SMTP)
135c0af1 1606 {
8d72476e 1607 int foundit=0;
ee373e7f
LJ
1608 BIO *fbio = BIO_new(BIO_f_buffer());
1609 BIO_push(fbio, sbio);
85c67492
RL
1610 /* wait for multi-line response to end from SMTP */
1611 do
1612 {
ee373e7f 1613 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
85c67492
RL
1614 }
1615 while (mbuf_len>3 && mbuf[3]=='-');
8d72476e 1616 /* STARTTLS command requires EHLO... */
ee373e7f 1617 BIO_printf(fbio,"EHLO openssl.client.net\r\n");
710069c1 1618 (void)BIO_flush(fbio);
8d72476e
LJ
1619 /* wait for multi-line response to end EHLO SMTP response */
1620 do
1621 {
ee373e7f 1622 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
8d72476e
LJ
1623 if (strstr(mbuf,"STARTTLS"))
1624 foundit=1;
1625 }
1626 while (mbuf_len>3 && mbuf[3]=='-');
710069c1 1627 (void)BIO_flush(fbio);
ee373e7f
LJ
1628 BIO_pop(fbio);
1629 BIO_free(fbio);
8d72476e
LJ
1630 if (!foundit)
1631 BIO_printf(bio_err,
1632 "didn't found starttls in server response,"
1633 " try anyway...\n");
135c0af1
RL
1634 BIO_printf(sbio,"STARTTLS\r\n");
1635 BIO_read(sbio,sbuf,BUFSIZZ);
1636 }
85c67492 1637 else if (starttls_proto == PROTO_POP3)
4f17dfcd
LJ
1638 {
1639 BIO_read(sbio,mbuf,BUFSIZZ);
1640 BIO_printf(sbio,"STLS\r\n");
1641 BIO_read(sbio,sbuf,BUFSIZZ);
1642 }
85c67492
RL
1643 else if (starttls_proto == PROTO_IMAP)
1644 {
8d72476e 1645 int foundit=0;
ee373e7f
LJ
1646 BIO *fbio = BIO_new(BIO_f_buffer());
1647 BIO_push(fbio, sbio);
1648 BIO_gets(fbio,mbuf,BUFSIZZ);
8d72476e 1649 /* STARTTLS command requires CAPABILITY... */
ee373e7f 1650 BIO_printf(fbio,". CAPABILITY\r\n");
710069c1 1651 (void)BIO_flush(fbio);
8d72476e
LJ
1652 /* wait for multi-line CAPABILITY response */
1653 do
1654 {
ee373e7f 1655 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
8d72476e
LJ
1656 if (strstr(mbuf,"STARTTLS"))
1657 foundit=1;
1658 }
ee373e7f 1659 while (mbuf_len>3 && mbuf[0]!='.');
710069c1 1660 (void)BIO_flush(fbio);
ee373e7f
LJ
1661 BIO_pop(fbio);
1662 BIO_free(fbio);
8d72476e
LJ
1663 if (!foundit)
1664 BIO_printf(bio_err,
1665 "didn't found STARTTLS in server response,"
1666 " try anyway...\n");
1667 BIO_printf(sbio,". STARTTLS\r\n");
85c67492
RL
1668 BIO_read(sbio,sbuf,BUFSIZZ);
1669 }
1670 else if (starttls_proto == PROTO_FTP)
1671 {
ee373e7f
LJ
1672 BIO *fbio = BIO_new(BIO_f_buffer());
1673 BIO_push(fbio, sbio);
85c67492
RL
1674 /* wait for multi-line response to end from FTP */
1675 do
1676 {
ee373e7f 1677 mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
85c67492
RL
1678 }
1679 while (mbuf_len>3 && mbuf[3]=='-');
710069c1 1680 (void)BIO_flush(fbio);
ee373e7f
LJ
1681 BIO_pop(fbio);
1682 BIO_free(fbio);
85c67492
RL
1683 BIO_printf(sbio,"AUTH TLS\r\n");
1684 BIO_read(sbio,sbuf,BUFSIZZ);
1685 }
d5bbead4
BL
1686 if (starttls_proto == PROTO_XMPP)
1687 {
1688 int seen = 0;
1689 BIO_printf(sbio,"<stream:stream "
1690 "xmlns:stream='http://etherx.jabber.org/streams' "
d2625fd6
BL
1691 "xmlns='jabber:client' to='%s' version='1.0'>", xmpphost ?
1692 xmpphost : host);
d5bbead4
BL
1693 seen = BIO_read(sbio,mbuf,BUFSIZZ);
1694 mbuf[seen] = 0;
4e48c775
CALP
1695 while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'") &&
1696 !strstr(mbuf, "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\""))
d5bbead4 1697 {
d5bbead4 1698 seen = BIO_read(sbio,mbuf,BUFSIZZ);
4249d4ba
CALP
1699
1700 if (seen <= 0)
1701 goto shut;
1702
d5bbead4
BL
1703 mbuf[seen] = 0;
1704 }
1705 BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1706 seen = BIO_read(sbio,sbuf,BUFSIZZ);
1707 sbuf[seen] = 0;
1708 if (!strstr(sbuf, "<proceed"))
1709 goto shut;
1710 mbuf[0] = 0;
1711 }
135c0af1 1712
d02b48c6
RE
1713 for (;;)
1714 {
1715 FD_ZERO(&readfds);
1716 FD_ZERO(&writefds);
1717
b972fbaa
DSH
1718 if ((SSL_version(con) == DTLS1_VERSION) &&
1719 DTLSv1_get_timeout(con, &timeout))
1720 timeoutp = &timeout;
1721 else
1722 timeoutp = NULL;
1723
58964a49 1724 if (SSL_in_init(con) && !SSL_total_renegotiations(con))
d02b48c6
RE
1725 {
1726 in_init=1;
1727 tty_on=0;
1728 }
1729 else
1730 {
1731 tty_on=1;
1732 if (in_init)
1733 {
1734 in_init=0;
761772d7 1735#if 0 /* This test doesn't really work as intended (needs to be fixed) */
ed3883d2 1736#ifndef OPENSSL_NO_TLSEXT
b166f13e
BM
1737 if (servername != NULL && !SSL_session_reused(con))
1738 {
1739 BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1740 }
761772d7 1741#endif
ed3883d2 1742#endif
6434abbf
DSH
1743 if (sess_out)
1744 {
1745 BIO *stmp = BIO_new_file(sess_out, "w");
1746 if (stmp)
1747 {
1748 PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1749 BIO_free(stmp);
1750 }
1751 else
1752 BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1753 }
2a7cbe77
DSH
1754 if (c_brief)
1755 {
1756 BIO_puts(bio_err,
1757 "CONNECTION ESTABLISHED\n");
1758 print_ssl_summary(bio_err, con);
1759 }
67c408ce 1760
d02b48c6
RE
1761 print_stuff(bio_c_out,con,full_log);
1762 if (full_log > 0) full_log--;
1763
4f17dfcd 1764 if (starttls_proto)
135c0af1
RL
1765 {
1766 BIO_printf(bio_err,"%s",mbuf);
1767 /* We don't need to know any more */
85c67492 1768 starttls_proto = PROTO_OFF;
135c0af1
RL
1769 }
1770
d02b48c6
RE
1771 if (reconnect)
1772 {
1773 reconnect--;
1774 BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1775 SSL_shutdown(con);
1776 SSL_set_connect_state(con);
1777 SHUTDOWN(SSL_get_fd(con));
1778 goto re_start;
1779 }
1780 }
1781 }
1782
c7ac31e2
BM
1783 ssl_pending = read_ssl && SSL_pending(con);
1784
1785 if (!ssl_pending)
d02b48c6 1786 {
4700aea9 1787#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
c7ac31e2
BM
1788 if (tty_on)
1789 {
7bf7333d
DSH
1790 if (read_tty) openssl_fdset(fileno(stdin),&readfds);
1791 if (write_tty) openssl_fdset(fileno(stdout),&writefds);
c7ac31e2 1792 }
c7ac31e2 1793 if (read_ssl)
7bf7333d 1794 openssl_fdset(SSL_get_fd(con),&readfds);
c7ac31e2 1795 if (write_ssl)
7bf7333d 1796 openssl_fdset(SSL_get_fd(con),&writefds);
06f4536a
DSH
1797#else
1798 if(!tty_on || !write_tty) {
1799 if (read_ssl)
7bf7333d 1800 openssl_fdset(SSL_get_fd(con),&readfds);
06f4536a 1801 if (write_ssl)
7bf7333d 1802 openssl_fdset(SSL_get_fd(con),&writefds);
06f4536a
DSH
1803 }
1804#endif
c7ac31e2
BM
1805/* printf("mode tty(%d %d%d) ssl(%d%d)\n",
1806 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
d02b48c6 1807
75e0770d 1808 /* Note: under VMS with SOCKETSHR the second parameter
7d7d2cbc
UM
1809 * is currently of type (int *) whereas under other
1810 * systems it is (void *) if you don't have a cast it
1811 * will choke the compiler: if you do have a cast then
1812 * you can either go for (int *) or (void *).
1813 */
3d7c4a5a
RL
1814#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1815 /* Under Windows/DOS we make the assumption that we can
06f4536a
DSH
1816 * always write to the tty: therefore if we need to
1817 * write to the tty we just fall through. Otherwise
1818 * we timeout the select every second and see if there
1819 * are any keypresses. Note: this is a hack, in a proper
1820 * Windows application we wouldn't do this.
1821 */
4ec19e20 1822 i=0;
06f4536a
DSH
1823 if(!write_tty) {
1824 if(read_tty) {
1825 tv.tv_sec = 1;
1826 tv.tv_usec = 0;
1827 i=select(width,(void *)&readfds,(void *)&writefds,
1828 NULL,&tv);
3d7c4a5a 1829#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
0bf23d9b
RL
1830 if(!i && (!_kbhit() || !read_tty) ) continue;
1831#else
a9ef75c5 1832 if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
0bf23d9b 1833#endif
06f4536a 1834 } else i=select(width,(void *)&readfds,(void *)&writefds,
b972fbaa 1835 NULL,timeoutp);
06f4536a 1836 }
47c1735a
RL
1837#elif defined(OPENSSL_SYS_NETWARE)
1838 if(!write_tty) {
1839 if(read_tty) {
1840 tv.tv_sec = 1;
1841 tv.tv_usec = 0;
1842 i=select(width,(void *)&readfds,(void *)&writefds,
1843 NULL,&tv);
1844 } else i=select(width,(void *)&readfds,(void *)&writefds,
b972fbaa 1845 NULL,timeoutp);
47c1735a 1846 }
4700aea9
UM
1847#elif defined(OPENSSL_SYS_BEOS_R5)
1848 /* Under BeOS-R5 the situation is similar to DOS */
1849 i=0;
1850 stdin_set = 0;
1851 (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1852 if(!write_tty) {
1853 if(read_tty) {
1854 tv.tv_sec = 1;
1855 tv.tv_usec = 0;
1856 i=select(width,(void *)&readfds,(void *)&writefds,
1857 NULL,&tv);
1858 if (read(fileno(stdin), sbuf, 0) >= 0)
1859 stdin_set = 1;
1860 if (!i && (stdin_set != 1 || !read_tty))
1861 continue;
1862 } else i=select(width,(void *)&readfds,(void *)&writefds,
b972fbaa 1863 NULL,timeoutp);
4700aea9
UM
1864 }
1865 (void)fcntl(fileno(stdin), F_SETFL, 0);
06f4536a 1866#else
7d7d2cbc 1867 i=select(width,(void *)&readfds,(void *)&writefds,
b972fbaa 1868 NULL,timeoutp);
06f4536a 1869#endif
c7ac31e2
BM
1870 if ( i < 0)
1871 {
1872 BIO_printf(bio_err,"bad select %d\n",
58964a49 1873 get_last_socket_error());
c7ac31e2
BM
1874 goto shut;
1875 /* goto end; */
1876 }
d02b48c6
RE
1877 }
1878
b972fbaa
DSH
1879 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1880 {
478b50cf 1881 BIO_printf(bio_err,"TIMEOUT occurred\n");
b972fbaa
DSH
1882 }
1883
c7ac31e2 1884 if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
d02b48c6
RE
1885 {
1886 k=SSL_write(con,&(cbuf[cbuf_off]),
1887 (unsigned int)cbuf_len);
1888 switch (SSL_get_error(con,k))
1889 {
1890 case SSL_ERROR_NONE:
1891 cbuf_off+=k;
1892 cbuf_len-=k;
1893 if (k <= 0) goto end;
1894 /* we have done a write(con,NULL,0); */
1895 if (cbuf_len <= 0)
1896 {
1897 read_tty=1;
1898 write_ssl=0;
1899 }
1900 else /* if (cbuf_len > 0) */
1901 {
1902 read_tty=0;
1903 write_ssl=1;
1904 }
1905 break;
1906 case SSL_ERROR_WANT_WRITE:
1907 BIO_printf(bio_c_out,"write W BLOCK\n");
1908 write_ssl=1;
1909 read_tty=0;
1910 break;
1911 case SSL_ERROR_WANT_READ:
1912 BIO_printf(bio_c_out,"write R BLOCK\n");
1913 write_tty=0;
1914 read_ssl=1;
1915 write_ssl=0;
1916 break;
1917 case SSL_ERROR_WANT_X509_LOOKUP:
1918 BIO_printf(bio_c_out,"write X BLOCK\n");
1919 break;
1920 case SSL_ERROR_ZERO_RETURN:
1921 if (cbuf_len != 0)
1922 {
1923 BIO_printf(bio_c_out,"shutdown\n");
0e1dba93 1924 ret = 0;
d02b48c6
RE
1925 goto shut;
1926 }
1927 else
1928 {
1929 read_tty=1;
1930 write_ssl=0;
1931 break;
1932 }
1933
1934 case SSL_ERROR_SYSCALL:
1935 if ((k != 0) || (cbuf_len != 0))
1936 {
1937 BIO_printf(bio_err,"write:errno=%d\n",
58964a49 1938 get_last_socket_error());
d02b48c6
RE
1939 goto shut;
1940 }
1941 else
1942 {
1943 read_tty=1;
1944 write_ssl=0;
1945 }
1946 break;
1947 case SSL_ERROR_SSL:
1948 ERR_print_errors(bio_err);
1949 goto shut;
1950 }
1951 }
4700aea9
UM
1952#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1953 /* Assume Windows/DOS/BeOS can always write */
06f4536a
DSH
1954 else if (!ssl_pending && write_tty)
1955#else
c7ac31e2 1956 else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
06f4536a 1957#endif
d02b48c6 1958 {
a53955d8
UM
1959#ifdef CHARSET_EBCDIC
1960 ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1961#endif
ffa10187 1962 i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
d02b48c6
RE
1963
1964 if (i <= 0)
1965 {
1966 BIO_printf(bio_c_out,"DONE\n");
0e1dba93 1967 ret = 0;
d02b48c6
RE
1968 goto shut;
1969 /* goto end; */
1970 }
1971
1972 sbuf_len-=i;;
1973 sbuf_off+=i;
1974 if (sbuf_len <= 0)
1975 {
1976 read_ssl=1;
1977 write_tty=0;
1978 }
1979 }
c7ac31e2 1980 else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
d02b48c6 1981 {
58964a49
RE
1982#ifdef RENEG
1983{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1984#endif
dfeab068 1985#if 1
58964a49 1986 k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
dfeab068
RE
1987#else
1988/* Demo for pending and peek :-) */
1989 k=SSL_read(con,sbuf,16);
1990{ char zbuf[10240];
1991printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1992}
1993#endif
d02b48c6
RE
1994
1995 switch (SSL_get_error(con,k))
1996 {
1997 case SSL_ERROR_NONE:
1998 if (k <= 0)
1999 goto end;
2000 sbuf_off=0;
2001 sbuf_len=k;
2002
2003 read_ssl=0;
2004 write_tty=1;
2005 break;
2006 case SSL_ERROR_WANT_WRITE:
2007 BIO_printf(bio_c_out,"read W BLOCK\n");
2008 write_ssl=1;
2009 read_tty=0;
2010 break;
2011 case SSL_ERROR_WANT_READ:
2012 BIO_printf(bio_c_out,"read R BLOCK\n");
2013 write_tty=0;
2014 read_ssl=1;
2015 if ((read_tty == 0) && (write_ssl == 0))
2016 write_ssl=1;
2017 break;
2018 case SSL_ERROR_WANT_X509_LOOKUP:
2019 BIO_printf(bio_c_out,"read X BLOCK\n");
2020 break;
2021 case SSL_ERROR_SYSCALL:
0e1dba93 2022 ret=get_last_socket_error();
2537d469 2023 if (c_brief)
66d9f2e5
DSH
2024 BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
2025 else
2026 BIO_printf(bio_err,"read:errno=%d\n",ret);
d02b48c6
RE
2027 goto shut;
2028 case SSL_ERROR_ZERO_RETURN:
2029 BIO_printf(bio_c_out,"closed\n");
0e1dba93 2030 ret=0;
d02b48c6
RE
2031 goto shut;
2032 case SSL_ERROR_SSL:
2033 ERR_print_errors(bio_err);
2034 goto shut;
dfeab068 2035 /* break; */
d02b48c6
RE
2036 }
2037 }
2038
3d7c4a5a
RL
2039#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
2040#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
0bf23d9b
RL
2041 else if (_kbhit())
2042#else
a9ef75c5 2043 else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
0bf23d9b 2044#endif
4d8743f4 2045#elif defined (OPENSSL_SYS_NETWARE)
ffa10187 2046 else if (_kbhit())
4700aea9
UM
2047#elif defined(OPENSSL_SYS_BEOS_R5)
2048 else if (stdin_set)
06f4536a 2049#else
d02b48c6 2050 else if (FD_ISSET(fileno(stdin),&readfds))
06f4536a 2051#endif
d02b48c6 2052 {
1bdb8633
BM
2053 if (crlf)
2054 {
2055 int j, lf_num;
2056
ffa10187 2057 i=raw_read_stdin(cbuf,BUFSIZZ/2);
1bdb8633
BM
2058 lf_num = 0;
2059 /* both loops are skipped when i <= 0 */
2060 for (j = 0; j < i; j++)
2061 if (cbuf[j] == '\n')
2062 lf_num++;
2063 for (j = i-1; j >= 0; j--)
2064 {
2065 cbuf[j+lf_num] = cbuf[j];
2066 if (cbuf[j] == '\n')
2067 {
2068 lf_num--;
2069 i++;
2070 cbuf[j+lf_num] = '\r';
2071 }
2072 }
2073 assert(lf_num == 0);
2074 }
2075 else
ffa10187 2076 i=raw_read_stdin(cbuf,BUFSIZZ);
d02b48c6 2077
ce301b6b 2078 if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
d02b48c6
RE
2079 {
2080 BIO_printf(bio_err,"DONE\n");
0e1dba93 2081 ret=0;
d02b48c6
RE
2082 goto shut;
2083 }
2084
ce301b6b 2085 if ((!c_ign_eof) && (cbuf[0] == 'R'))
d02b48c6 2086 {
3bb307c1 2087 BIO_printf(bio_err,"RENEGOTIATING\n");
d02b48c6 2088 SSL_renegotiate(con);
3bb307c1 2089 cbuf_len=0;
d02b48c6 2090 }
4817504d
DSH
2091#ifndef OPENSSL_NO_HEARTBEATS
2092 else if ((!c_ign_eof) && (cbuf[0] == 'B'))
2093 {
2094 BIO_printf(bio_err,"HEARTBEATING\n");
2095 SSL_heartbeat(con);
2096 cbuf_len=0;
2097 }
2098#endif
d02b48c6
RE
2099 else
2100 {
2101 cbuf_len=i;
2102 cbuf_off=0;
a53955d8
UM
2103#ifdef CHARSET_EBCDIC
2104 ebcdic2ascii(cbuf, cbuf, i);
2105#endif
d02b48c6
RE
2106 }
2107
d02b48c6 2108 write_ssl=1;
3bb307c1 2109 read_tty=0;
d02b48c6 2110 }
d02b48c6 2111 }
0e1dba93
DSH
2112
2113 ret=0;
d02b48c6 2114shut:
b166f13e
BM
2115 if (in_init)
2116 print_stuff(bio_c_out,con,full_log);
d02b48c6
RE
2117 SSL_shutdown(con);
2118 SHUTDOWN(SSL_get_fd(con));
d02b48c6 2119end:
d916ba1b
NL
2120 if (con != NULL)
2121 {
2122 if (prexit != 0)
2123 print_stuff(bio_c_out,con,1);
2124 SSL_free(con);
2125 }
dd251659
DSH
2126#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2127 if (next_proto.data)
2128 OPENSSL_free(next_proto.data);
2129#endif
d02b48c6 2130 if (ctx != NULL) SSL_CTX_free(ctx);
826a42a0
DSH
2131 if (cert)
2132 X509_free(cert);
fdb78f3d
DSH
2133 if (crls)
2134 sk_X509_CRL_pop_free(crls, X509_CRL_free);
826a42a0
DSH
2135 if (key)
2136 EVP_PKEY_free(key);
4e71d952
DSH
2137 if (chain)
2138 sk_X509_pop_free(chain, X509_free);
826a42a0
DSH
2139 if (pass)
2140 OPENSSL_free(pass);
22b5d7c8
DSH
2141 if (vpm)
2142 X509_VERIFY_PARAM_free(vpm);
3208fc59 2143 ssl_excert_free(exc);
5d2e07f1
DSH
2144 if (ssl_args)
2145 sk_OPENSSL_STRING_free(ssl_args);
2146 if (cctx)
2147 SSL_CONF_CTX_free(cctx);
b252cf0d
DSH
2148#ifndef OPENSSL_NO_JPAKE
2149 if (jpake_secret && psk_key)
2150 OPENSSL_free(psk_key);
2151#endif
4579924b
RL
2152 if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
2153 if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
2154 if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
d02b48c6
RE
2155 if (bio_c_out != NULL)
2156 {
2157 BIO_free(bio_c_out);
2158 bio_c_out=NULL;
2159 }
93ab9e42
DSH
2160 if (bio_c_msg != NULL)
2161 {
2162 BIO_free(bio_c_msg);
2163 bio_c_msg=NULL;
2164 }
c04f8cf4 2165 apps_shutdown();
1c3e4a36 2166 OPENSSL_EXIT(ret);
d02b48c6
RE
2167 }
2168
2169
6b691a5c 2170static void print_stuff(BIO *bio, SSL *s, int full)
d02b48c6 2171 {
58964a49 2172 X509 *peer=NULL;
d02b48c6 2173 char *p;
7d727231 2174 static const char *space=" ";
d02b48c6 2175 char buf[BUFSIZ];
f73e07cf
BL
2176 STACK_OF(X509) *sk;
2177 STACK_OF(X509_NAME) *sk2;
babb3798 2178 const SSL_CIPHER *c;
d02b48c6
RE
2179 X509_NAME *xn;
2180 int j,i;
09b6c2ef 2181#ifndef OPENSSL_NO_COMP
d8ec0dcf 2182 const COMP_METHOD *comp, *expansion;
09b6c2ef 2183#endif
e0af0405 2184 unsigned char *exportedkeymat;
d02b48c6
RE
2185
2186 if (full)
2187 {
bc2e519a
BM
2188 int got_a_chain = 0;
2189
d02b48c6
RE
2190 sk=SSL_get_peer_cert_chain(s);
2191 if (sk != NULL)
2192 {
bc2e519a
BM
2193 got_a_chain = 1; /* we don't have it for SSL2 (yet) */
2194
dfeab068 2195 BIO_printf(bio,"---\nCertificate chain\n");
f73e07cf 2196 for (i=0; i<sk_X509_num(sk); i++)
d02b48c6 2197 {
f73e07cf 2198 X509_NAME_oneline(X509_get_subject_name(
54a656ef 2199 sk_X509_value(sk,i)),buf,sizeof buf);
d02b48c6 2200 BIO_printf(bio,"%2d s:%s\n",i,buf);
f73e07cf 2201 X509_NAME_oneline(X509_get_issuer_name(
54a656ef 2202 sk_X509_value(sk,i)),buf,sizeof buf);
d02b48c6 2203 BIO_printf(bio," i:%s\n",buf);
6d02d8e4 2204 if (c_showcerts)
f73e07cf 2205 PEM_write_bio_X509(bio,sk_X509_value(sk,i));
d02b48c6
RE
2206 }
2207 }
2208
2209 BIO_printf(bio,"---\n");
2210 peer=SSL_get_peer_certificate(s);
2211 if (peer != NULL)
2212 {
2213 BIO_printf(bio,"Server certificate\n");
bc2e519a 2214 if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
6d02d8e4 2215 PEM_write_bio_X509(bio,peer);
d02b48c6 2216 X509_NAME_oneline(X509_get_subject_name(peer),
54a656ef 2217 buf,sizeof buf);
d02b48c6
RE
2218 BIO_printf(bio,"subject=%s\n",buf);
2219 X509_NAME_oneline(X509_get_issuer_name(peer),
54a656ef 2220 buf,sizeof buf);
d02b48c6 2221 BIO_printf(bio,"issuer=%s\n",buf);
d02b48c6
RE
2222 }
2223 else
2224 BIO_printf(bio,"no peer certificate available\n");
2225
f73e07cf 2226 sk2=SSL_get_client_CA_list(s);
d91f8c3c 2227 if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
d02b48c6
RE
2228 {
2229 BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
f73e07cf 2230 for (i=0; i<sk_X509_NAME_num(sk2); i++)
d02b48c6 2231 {
f73e07cf 2232 xn=sk_X509_NAME_value(sk2,i);
d02b48c6
RE
2233 X509_NAME_oneline(xn,buf,sizeof(buf));
2234 BIO_write(bio,buf,strlen(buf));
2235 BIO_write(bio,"\n",1);
2236 }
2237 }
2238 else
2239 {
2240 BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2241 }
54a656ef 2242 p=SSL_get_shared_ciphers(s,buf,sizeof buf);
d02b48c6
RE
2243 if (p != NULL)
2244 {
67a47285
BM
2245 /* This works only for SSL 2. In later protocol
2246 * versions, the client does not know what other
2247 * ciphers (in addition to the one to be used
2248 * in the current connection) the server supports. */
2249
d02b48c6
RE
2250 BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2251 j=i=0;
2252 while (*p)
2253 {
2254 if (*p == ':')
2255 {
58964a49 2256 BIO_write(bio,space,15-j%25);
d02b48c6
RE
2257 i++;
2258 j=0;
2259 BIO_write(bio,((i%3)?" ":"\n"),1);
2260 }
2261 else
2262 {
2263 BIO_write(bio,p,1);
2264 j++;
2265 }
2266 p++;
2267 }
2268 BIO_write(bio,"\n",1);
2269 }
2270
9f27b1ee 2271 ssl_print_sigalgs(bio, s);
33a8de69 2272 ssl_print_tmp_key(bio, s);
e7f8ff43 2273
d02b48c6
RE
2274 BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2275 BIO_number_read(SSL_get_rbio(s)),
2276 BIO_number_written(SSL_get_wbio(s)));
2277 }
08557cf2 2278 BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
d02b48c6
RE
2279 c=SSL_get_current_cipher(s);
2280 BIO_printf(bio,"%s, Cipher is %s\n",
2281 SSL_CIPHER_get_version(c),
2282 SSL_CIPHER_get_name(c));
a8236c8c
DSH
2283 if (peer != NULL) {
2284 EVP_PKEY *pktmp;
2285 pktmp = X509_get_pubkey(peer);
58964a49 2286 BIO_printf(bio,"Server public key is %d bit\n",
a8236c8c
DSH
2287 EVP_PKEY_bits(pktmp));
2288 EVP_PKEY_free(pktmp);
2289 }
5430200b
DSH
2290 BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2291 SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
09b6c2ef 2292#ifndef OPENSSL_NO_COMP
f44e184e 2293 comp=SSL_get_current_compression(s);
d8ec0dcf 2294 expansion=SSL_get_current_expansion(s);
f44e184e
RL
2295 BIO_printf(bio,"Compression: %s\n",
2296 comp ? SSL_COMP_get_name(comp) : "NONE");
2297 BIO_printf(bio,"Expansion: %s\n",
d8ec0dcf 2298 expansion ? SSL_COMP_get_name(expansion) : "NONE");
09b6c2ef 2299#endif
71fa4513 2300
57559471 2301#ifdef SSL_DEBUG
a2f9200f
DSH
2302 {
2303 /* Print out local port of connection: useful for debugging */
2304 int sock;
2305 struct sockaddr_in ladd;
2306 socklen_t ladd_size = sizeof(ladd);
2307 sock = SSL_get_fd(s);
2308 getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2309 BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2310 }
2311#endif
2312
6f017a8f
AL
2313#if !defined(OPENSSL_NO_TLSEXT)
2314# if !defined(OPENSSL_NO_NEXTPROTONEG)
71fa4513
BL
2315 if (next_proto.status != -1) {
2316 const unsigned char *proto;
2317 unsigned int proto_len;
2318 SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2319 BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2320 BIO_write(bio, proto, proto_len);
2321 BIO_write(bio, "\n", 1);
2322 }
2911575c 2323# endif
6f017a8f
AL
2324 {
2325 const unsigned char *proto;
2326 unsigned int proto_len;
2327 SSL_get0_alpn_selected(s, &proto, &proto_len);
2328 if (proto_len > 0)
2329 {
2330 BIO_printf(bio, "ALPN protocol: ");
2331 BIO_write(bio, proto, proto_len);
2332 BIO_write(bio, "\n", 1);
2333 }
2334 else
2335 BIO_printf(bio, "No ALPN negotiated\n");
2336 }
71fa4513
BL
2337#endif
2338
333f926d
BL
2339 {
2340 SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2341
2342 if(srtp_profile)
2343 BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2344 srtp_profile->name);
2345 }
2346
d02b48c6 2347 SSL_SESSION_print(bio,SSL_get_session(s));
be81f4dd
DSH
2348 if (keymatexportlabel != NULL)
2349 {
e0af0405
BL
2350 BIO_printf(bio, "Keying material exporter:\n");
2351 BIO_printf(bio, " Label: '%s'\n", keymatexportlabel);
2352 BIO_printf(bio, " Length: %i bytes\n", keymatexportlen);
2353 exportedkeymat = OPENSSL_malloc(keymatexportlen);
be81f4dd
DSH
2354 if (exportedkeymat != NULL)
2355 {
2356 if (!SSL_export_keying_material(s, exportedkeymat,
2357 keymatexportlen,
2358 keymatexportlabel,
2359 strlen(keymatexportlabel),
2360 NULL, 0, 0))
2361 {
2362 BIO_printf(bio, " Error\n");
2363 }
2364 else
2365 {
e0af0405
BL
2366 BIO_printf(bio, " Keying material: ");
2367 for (i=0; i<keymatexportlen; i++)
2368 BIO_printf(bio, "%02X",
2369 exportedkeymat[i]);
2370 BIO_printf(bio, "\n");
be81f4dd 2371 }
e0af0405 2372 OPENSSL_free(exportedkeymat);
be81f4dd 2373 }
e0af0405 2374 }
d02b48c6 2375 BIO_printf(bio,"---\n");
58964a49
RE
2376 if (peer != NULL)
2377 X509_free(peer);
41ebed27 2378 /* flush, or debugging output gets mixed with http response */
710069c1 2379 (void)BIO_flush(bio);
d02b48c6
RE
2380 }
2381
0702150f
DSH
2382#ifndef OPENSSL_NO_TLSEXT
2383
67c8e7f4
DSH
2384static int ocsp_resp_cb(SSL *s, void *arg)
2385 {
2386 const unsigned char *p;
2387 int len;
2388 OCSP_RESPONSE *rsp;
2389 len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2390 BIO_puts(arg, "OCSP response: ");
2391 if (!p)
2392 {
2393 BIO_puts(arg, "no response sent\n");
2394 return 1;
2395 }
2396 rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2397 if (!rsp)
2398 {
2399 BIO_puts(arg, "response parse error\n");
2400 BIO_dump_indent(arg, (char *)p, len, 4);
2401 return 0;
2402 }
2403 BIO_puts(arg, "\n======================================\n");
2404 OCSP_RESPONSE_print(arg, rsp, 0);
2405 BIO_puts(arg, "======================================\n");
2406 OCSP_RESPONSE_free(rsp);
2407 return 1;
2408 }
0702150f
DSH
2409
2410#endif