s_client.c revision 273415
1/* apps/s_client.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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 */
58/* ====================================================================
59 * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 *    notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 *    notice, this list of conditions and the following disclaimer in
70 *    the documentation and/or other materials provided with the
71 *    distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 *    software must display the following acknowledgment:
75 *    "This product includes software developed by the OpenSSL Project
76 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 *    endorse or promote products derived from this software without
80 *    prior written permission. For written permission, please contact
81 *    openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 *    nor may "OpenSSL" appear in their names without prior written
85 *    permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 *    acknowledgment:
89 *    "This product includes software developed by the OpenSSL Project
90 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com).  This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
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 */
137
138#include <assert.h>
139#include <ctype.h>
140#include <stdio.h>
141#include <stdlib.h>
142#include <string.h>
143#include <openssl/e_os2.h>
144#ifdef OPENSSL_NO_STDIO
145#define APPS_WIN16
146#endif
147
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 */
152#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
153#define __U_INT
154typedef unsigned int u_int;
155#endif
156
157#define USE_SOCKETS
158#include "apps.h"
159#include <openssl/x509.h>
160#include <openssl/ssl.h>
161#include <openssl/err.h>
162#include <openssl/pem.h>
163#include <openssl/rand.h>
164#include <openssl/ocsp.h>
165#include <openssl/bn.h>
166#ifndef OPENSSL_NO_SRP
167#include <openssl/srp.h>
168#endif
169#include "s_apps.h"
170#include "timeouts.h"
171
172#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
173/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
174#undef FIONBIO
175#endif
176
177#if defined(OPENSSL_SYS_BEOS_R5)
178#include <fcntl.h>
179#endif
180
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;
195extern int verify_return_error;
196
197#ifdef FIONBIO
198static int c_nbio=0;
199#endif
200static int c_Pause=0;
201static int c_debug=0;
202#ifndef OPENSSL_NO_TLSEXT
203static int c_tlsextdebug=0;
204static int c_status_req=0;
205#endif
206static int c_msg=0;
207static int c_showcerts=0;
208
209static char *keymatexportlabel=NULL;
210static int keymatexportlen=20;
211
212static void sc_usage(void);
213static void print_stuff(BIO *berr,SSL *con,int full);
214#ifndef OPENSSL_NO_TLSEXT
215static int ocsp_resp_cb(SSL *s, void *arg);
216#endif
217static BIO *bio_c_out=NULL;
218static int c_quiet=0;
219static int c_ign_eof=0;
220
221#ifndef OPENSSL_NO_PSK
222/* Default PSK identity and key */
223static char *psk_identity="Client_identity";
224/*char *psk_key=NULL;  by default PSK is not used */
225
226static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
227	unsigned int max_identity_len, unsigned char *psk,
228	unsigned int max_psk_len)
229	{
230	unsigned int psk_len = 0;
231	int ret;
232        BIGNUM *bn=NULL;
233
234	if (c_debug)
235		BIO_printf(bio_c_out, "psk_client_cb\n");
236	if (!hint)
237                {
238                /* no ServerKeyExchange message*/
239		if (c_debug)
240			BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
241                }
242        else if (c_debug)
243		BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
244
245	/* lookup PSK identity and PSK key based on the given identity hint here */
246	ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
247	if (ret < 0 || (unsigned int)ret > max_identity_len)
248		goto out_err;
249	if (c_debug)
250		BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
251        ret=BN_hex2bn(&bn, psk_key);
252        if (!ret)
253                {
254                BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
255                if (bn)
256                        BN_free(bn);
257                return 0;
258                }
259
260        if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
261                {
262                BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
263                        max_psk_len, BN_num_bytes(bn));
264                BN_free(bn);
265                return 0;
266                }
267
268        psk_len=BN_bn2bin(bn, psk);
269        BN_free(bn);
270        if (psk_len == 0)
271                goto out_err;
272
273	if (c_debug)
274		BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
275
276        return psk_len;
277 out_err:
278	if (c_debug)
279		BIO_printf(bio_err, "Error in PSK client callback\n");
280        return 0;
281	}
282#endif
283
284static void sc_usage(void)
285	{
286	BIO_printf(bio_err,"usage: s_client args\n");
287	BIO_printf(bio_err,"\n");
288	BIO_printf(bio_err," -host host     - use -connect instead\n");
289	BIO_printf(bio_err," -port port     - use -connect instead\n");
290	BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
291
292	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
293	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
294	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
295	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
296	BIO_printf(bio_err,"                 not specified but cert file is.\n");
297	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
298	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
299	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
300	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
301	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
302	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
303	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
304	BIO_printf(bio_err," -debug        - extra output\n");
305#ifdef WATT32
306	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
307#endif
308	BIO_printf(bio_err," -msg          - Show protocol messages\n");
309	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
310	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
311#ifdef FIONBIO
312	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
313#endif
314	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
315	BIO_printf(bio_err," -quiet        - no s_client output\n");
316	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
317	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
318#ifndef OPENSSL_NO_PSK
319	BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
320	BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
321# ifndef OPENSSL_NO_JPAKE
322	BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
323# endif
324#endif
325#ifndef OPENSSL_NO_SRP
326	BIO_printf(bio_err," -srpuser user     - SRP authentification for 'user'\n");
327	BIO_printf(bio_err," -srppass arg      - password for 'user'\n");
328	BIO_printf(bio_err," -srp_lateuser     - SRP username into second ClientHello message\n");
329	BIO_printf(bio_err," -srp_moregroups   - Tolerate other than the known g N values.\n");
330	BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
331#endif
332	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
333	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
334	BIO_printf(bio_err," -tls1_2       - just use TLSv1.2\n");
335	BIO_printf(bio_err," -tls1_1       - just use TLSv1.1\n");
336	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
337	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
338	BIO_printf(bio_err," -fallback_scsv - send TLS_FALLBACK_SCSV\n");
339	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
340	BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
341	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
342	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
343	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
344	BIO_printf(bio_err,"                 command to see what is available\n");
345	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
346	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
347	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
348	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
349	BIO_printf(bio_err,"                 are supported.\n");
350#ifndef OPENSSL_NO_ENGINE
351	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
352#endif
353	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
354	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
355	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
356#ifndef OPENSSL_NO_TLSEXT
357	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
358	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
359	BIO_printf(bio_err," -status           - request certificate status from server\n");
360	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
361# ifndef OPENSSL_NO_NEXTPROTONEG
362	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
363# endif
364#endif
365	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
366#ifndef OPENSSL_NO_SRTP
367	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
368#endif
369 	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");
371	}
372
373#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
382static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
383	{
384	tlsextctx * p = (tlsextctx *) arg;
385	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
386	if (SSL_get_servername_type(s) != -1)
387 	        p->ack = !SSL_session_reused(s) && hn != NULL;
388	else
389		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
390
391	return SSL_TLSEXT_ERR_OK;
392	}
393
394#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
409static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
410	{
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) &&
416		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
417		p != NULL && BN_rshift1(p, N) &&
418
419		/* p = (N-1)/2 */
420		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
421		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
437/* 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
452static 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
474/* The srp_moregroups is a real debugging feature.
475   Implementors should rather add the value to the known ones.
476   The minimal size has already been tested.
477*/
478		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
479			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
507#endif
508#ifndef OPENSSL_NO_SRTP
509	char *srtp_profiles = NULL;
510#endif
511
512# ifndef OPENSSL_NO_NEXTPROTONEG
513/* This the context that we pass to next_proto_cb */
514typedef struct tlsextnextprotoctx_st {
515	unsigned char *data;
516	unsigned short len;
517	int status;
518} tlsextnextprotoctx;
519
520static tlsextnextprotoctx next_proto;
521
522static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
523	{
524	tlsextnextprotoctx *ctx = arg;
525
526	if (!c_quiet)
527		{
528		/* We can assume that |in| is syntactically valid. */
529		unsigned i;
530		BIO_printf(bio_c_out, "Protocols advertised by server: ");
531		for (i = 0; i < inlen; )
532			{
533			if (i)
534				BIO_write(bio_c_out, ", ", 2);
535			BIO_write(bio_c_out, &in[i + 1], in[i]);
536			i += in[i] + 1;
537			}
538		BIO_write(bio_c_out, "\n", 1);
539		}
540
541	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
542	return SSL_TLSEXT_ERR_OK;
543	}
544# endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
545#endif
546
547enum
548{
549	PROTO_OFF	= 0,
550	PROTO_SMTP,
551	PROTO_POP3,
552	PROTO_IMAP,
553	PROTO_FTP,
554	PROTO_XMPP
555};
556
557int MAIN(int, char **);
558
559int MAIN(int argc, char **argv)
560	{
561	unsigned int off=0, clr=0;
562	SSL *con=NULL;
563#ifndef OPENSSL_NO_KRB5
564	KSSL_CTX *kctx;
565#endif
566	int s,k,width,state=0;
567	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
568	int cbuf_len,cbuf_off;
569	int sbuf_len,sbuf_off;
570	fd_set readfds,writefds;
571	short port=PORT;
572	int full_log=1;
573	char *host=SSL_HOST_NAME;
574	char *cert_file=NULL,*key_file=NULL;
575	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
576	char *passarg = NULL, *pass = NULL;
577	X509 *cert = NULL;
578	EVP_PKEY *key = NULL;
579	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
580	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
581	int crlf=0;
582	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
583	SSL_CTX *ctx=NULL;
584	int ret=1,in_init=1,i,nbio_test=0;
585	int starttls_proto = PROTO_OFF;
586	int prexit = 0;
587	X509_VERIFY_PARAM *vpm = NULL;
588	int badarg = 0;
589	const SSL_METHOD *meth=NULL;
590	int socket_type=SOCK_STREAM;
591	BIO *sbio;
592	char *inrand=NULL;
593	int mbuf_len=0;
594	struct timeval timeout, *timeoutp;
595#ifndef OPENSSL_NO_ENGINE
596	char *engine_id=NULL;
597	char *ssl_client_engine_id=NULL;
598	ENGINE *ssl_client_engine=NULL;
599#endif
600	ENGINE *e=NULL;
601#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
602	struct timeval tv;
603#if defined(OPENSSL_SYS_BEOS_R5)
604	int stdin_set = 0;
605#endif
606#endif
607#ifndef OPENSSL_NO_TLSEXT
608	char *servername = NULL;
609        tlsextctx tlsextcbp =
610        {NULL,0};
611# ifndef OPENSSL_NO_NEXTPROTONEG
612	const char *next_proto_neg_in = NULL;
613# endif
614#endif
615	char *sess_in = NULL;
616	char *sess_out = NULL;
617	struct sockaddr peer;
618	int peerlen = sizeof(peer);
619	int fallback_scsv = 0;
620	int enable_timeouts = 0 ;
621	long socket_mtu = 0;
622#ifndef OPENSSL_NO_JPAKE
623	char *jpake_secret = NULL;
624#endif
625#ifndef OPENSSL_NO_SRP
626	char * srppass = NULL;
627	int srp_lateuser = 0;
628	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
629#endif
630
631	meth=SSLv23_client_method();
632
633	apps_startup();
634	c_Pause=0;
635	c_quiet=0;
636	c_ign_eof=0;
637	c_debug=0;
638	c_msg=0;
639	c_showcerts=0;
640
641	if (bio_err == NULL)
642		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
643
644	if (!load_config(bio_err, NULL))
645		goto end;
646
647	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
648		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
649		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
650		{
651		BIO_printf(bio_err,"out of memory\n");
652		goto end;
653		}
654
655	verify_depth=0;
656	verify_error=X509_V_OK;
657#ifdef FIONBIO
658	c_nbio=0;
659#endif
660
661	argc--;
662	argv++;
663	while (argc >= 1)
664		{
665		if	(strcmp(*argv,"-host") == 0)
666			{
667			if (--argc < 1) goto bad;
668			host= *(++argv);
669			}
670		else if	(strcmp(*argv,"-port") == 0)
671			{
672			if (--argc < 1) goto bad;
673			port=atoi(*(++argv));
674			if (port == 0) goto bad;
675			}
676		else if (strcmp(*argv,"-connect") == 0)
677			{
678			if (--argc < 1) goto bad;
679			if (!extract_host_port(*(++argv),&host,NULL,&port))
680				goto bad;
681			}
682		else if	(strcmp(*argv,"-verify") == 0)
683			{
684			verify=SSL_VERIFY_PEER;
685			if (--argc < 1) goto bad;
686			verify_depth=atoi(*(++argv));
687			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
688			}
689		else if	(strcmp(*argv,"-cert") == 0)
690			{
691			if (--argc < 1) goto bad;
692			cert_file= *(++argv);
693			}
694		else if	(strcmp(*argv,"-sess_out") == 0)
695			{
696			if (--argc < 1) goto bad;
697			sess_out = *(++argv);
698			}
699		else if	(strcmp(*argv,"-sess_in") == 0)
700			{
701			if (--argc < 1) goto bad;
702			sess_in = *(++argv);
703			}
704		else if	(strcmp(*argv,"-certform") == 0)
705			{
706			if (--argc < 1) goto bad;
707			cert_format = str2fmt(*(++argv));
708			}
709		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
710			{
711			if (badarg)
712				goto bad;
713			continue;
714			}
715		else if (strcmp(*argv,"-verify_return_error") == 0)
716			verify_return_error = 1;
717		else if	(strcmp(*argv,"-prexit") == 0)
718			prexit=1;
719		else if	(strcmp(*argv,"-crlf") == 0)
720			crlf=1;
721		else if	(strcmp(*argv,"-quiet") == 0)
722			{
723			c_quiet=1;
724			c_ign_eof=1;
725			}
726		else if	(strcmp(*argv,"-ign_eof") == 0)
727			c_ign_eof=1;
728		else if	(strcmp(*argv,"-no_ign_eof") == 0)
729			c_ign_eof=0;
730		else if	(strcmp(*argv,"-pause") == 0)
731			c_Pause=1;
732		else if	(strcmp(*argv,"-debug") == 0)
733			c_debug=1;
734#ifndef OPENSSL_NO_TLSEXT
735		else if	(strcmp(*argv,"-tlsextdebug") == 0)
736			c_tlsextdebug=1;
737		else if	(strcmp(*argv,"-status") == 0)
738			c_status_req=1;
739#endif
740#ifdef WATT32
741		else if (strcmp(*argv,"-wdebug") == 0)
742			dbug_init();
743#endif
744		else if	(strcmp(*argv,"-msg") == 0)
745			c_msg=1;
746		else if	(strcmp(*argv,"-showcerts") == 0)
747			c_showcerts=1;
748		else if	(strcmp(*argv,"-nbio_test") == 0)
749			nbio_test=1;
750		else if	(strcmp(*argv,"-state") == 0)
751			state=1;
752#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                                {
766                                if (isxdigit((unsigned char)psk_key[j]))
767                                        continue;
768                                BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
769                                goto bad;
770                                }
771			}
772#endif
773#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
804#ifndef OPENSSL_NO_SSL2
805		else if	(strcmp(*argv,"-ssl2") == 0)
806			meth=SSLv2_client_method();
807#endif
808#ifndef OPENSSL_NO_SSL3
809		else if	(strcmp(*argv,"-ssl3") == 0)
810			meth=SSLv3_client_method();
811#endif
812#ifndef OPENSSL_NO_TLS1
813		else if	(strcmp(*argv,"-tls1_2") == 0)
814			meth=TLSv1_2_client_method();
815		else if	(strcmp(*argv,"-tls1_1") == 0)
816			meth=TLSv1_1_client_method();
817		else if	(strcmp(*argv,"-tls1") == 0)
818			meth=TLSv1_client_method();
819#endif
820#ifndef OPENSSL_NO_DTLS1
821		else if	(strcmp(*argv,"-dtls1") == 0)
822			{
823			meth=DTLSv1_client_method();
824			socket_type=SOCK_DGRAM;
825			}
826		else if (strcmp(*argv,"-fallback_scsv") == 0)
827			{
828			fallback_scsv = 1;
829			}
830		else if (strcmp(*argv,"-timeout") == 0)
831			enable_timeouts=1;
832		else if (strcmp(*argv,"-mtu") == 0)
833			{
834			if (--argc < 1) goto bad;
835			socket_mtu = atol(*(++argv));
836			}
837#endif
838		else if (strcmp(*argv,"-bugs") == 0)
839			bugs=1;
840		else if	(strcmp(*argv,"-keyform") == 0)
841			{
842			if (--argc < 1) goto bad;
843			key_format = str2fmt(*(++argv));
844			}
845		else if	(strcmp(*argv,"-pass") == 0)
846			{
847			if (--argc < 1) goto bad;
848			passarg = *(++argv);
849			}
850		else if	(strcmp(*argv,"-key") == 0)
851			{
852			if (--argc < 1) goto bad;
853			key_file= *(++argv);
854			}
855		else if	(strcmp(*argv,"-reconnect") == 0)
856			{
857			reconnect=5;
858			}
859		else if	(strcmp(*argv,"-CApath") == 0)
860			{
861			if (--argc < 1) goto bad;
862			CApath= *(++argv);
863			}
864		else if	(strcmp(*argv,"-CAfile") == 0)
865			{
866			if (--argc < 1) goto bad;
867			CAfile= *(++argv);
868			}
869		else if (strcmp(*argv,"-no_tls1_2") == 0)
870			off|=SSL_OP_NO_TLSv1_2;
871		else if (strcmp(*argv,"-no_tls1_1") == 0)
872			off|=SSL_OP_NO_TLSv1_1;
873		else if (strcmp(*argv,"-no_tls1") == 0)
874			off|=SSL_OP_NO_TLSv1;
875		else if (strcmp(*argv,"-no_ssl3") == 0)
876			off|=SSL_OP_NO_SSLv3;
877		else if (strcmp(*argv,"-no_ssl2") == 0)
878			off|=SSL_OP_NO_SSLv2;
879		else if	(strcmp(*argv,"-no_comp") == 0)
880			{ off|=SSL_OP_NO_COMPRESSION; }
881#ifndef OPENSSL_NO_TLSEXT
882		else if	(strcmp(*argv,"-no_ticket") == 0)
883			{ off|=SSL_OP_NO_TICKET; }
884# ifndef OPENSSL_NO_NEXTPROTONEG
885		else if (strcmp(*argv,"-nextprotoneg") == 0)
886			{
887			if (--argc < 1) goto bad;
888			next_proto_neg_in = *(++argv);
889			}
890# endif
891#endif
892		else if (strcmp(*argv,"-serverpref") == 0)
893			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
894		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
895			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
896		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
897			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
898		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
899			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
900		else if	(strcmp(*argv,"-cipher") == 0)
901			{
902			if (--argc < 1) goto bad;
903			cipher= *(++argv);
904			}
905#ifdef FIONBIO
906		else if (strcmp(*argv,"-nbio") == 0)
907			{ c_nbio=1; }
908#endif
909		else if	(strcmp(*argv,"-starttls") == 0)
910			{
911			if (--argc < 1) goto bad;
912			++argv;
913			if (strcmp(*argv,"smtp") == 0)
914				starttls_proto = PROTO_SMTP;
915			else if (strcmp(*argv,"pop3") == 0)
916				starttls_proto = PROTO_POP3;
917			else if (strcmp(*argv,"imap") == 0)
918				starttls_proto = PROTO_IMAP;
919			else if (strcmp(*argv,"ftp") == 0)
920				starttls_proto = PROTO_FTP;
921			else if (strcmp(*argv, "xmpp") == 0)
922				starttls_proto = PROTO_XMPP;
923			else
924				goto bad;
925			}
926#ifndef OPENSSL_NO_ENGINE
927		else if	(strcmp(*argv,"-engine") == 0)
928			{
929			if (--argc < 1) goto bad;
930			engine_id = *(++argv);
931			}
932		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
933			{
934			if (--argc < 1) goto bad;
935			ssl_client_engine_id = *(++argv);
936			}
937#endif
938		else if (strcmp(*argv,"-rand") == 0)
939			{
940			if (--argc < 1) goto bad;
941			inrand= *(++argv);
942			}
943#ifndef OPENSSL_NO_TLSEXT
944		else if (strcmp(*argv,"-servername") == 0)
945			{
946			if (--argc < 1) goto bad;
947			servername= *(++argv);
948			/* meth=TLSv1_client_method(); */
949			}
950#endif
951#ifndef OPENSSL_NO_JPAKE
952		else if (strcmp(*argv,"-jpake") == 0)
953			{
954			if (--argc < 1) goto bad;
955			jpake_secret = *++argv;
956			}
957#endif
958#ifndef OPENSSL_NO_SRTP
959		else if (strcmp(*argv,"-use_srtp") == 0)
960			{
961			if (--argc < 1) goto bad;
962			srtp_profiles = *(++argv);
963			}
964#endif
965		else if (strcmp(*argv,"-keymatexport") == 0)
966			{
967			if (--argc < 1) goto bad;
968			keymatexportlabel= *(++argv);
969			}
970		else if (strcmp(*argv,"-keymatexportlen") == 0)
971			{
972			if (--argc < 1) goto bad;
973			keymatexportlen=atoi(*(++argv));
974			if (keymatexportlen == 0) goto bad;
975			}
976                else
977			{
978			BIO_printf(bio_err,"unknown option %s\n",*argv);
979			badop=1;
980			break;
981			}
982		argc--;
983		argv++;
984		}
985	if (badop)
986		{
987bad:
988		sc_usage();
989		goto end;
990		}
991
992#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
993	if (jpake_secret)
994		{
995		if (psk_key)
996			{
997			BIO_printf(bio_err,
998				   "Can't use JPAKE and PSK together\n");
999			goto end;
1000			}
1001		psk_identity = "JPAKE";
1002		if (cipher)
1003			{
1004			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1005			goto end;
1006			}
1007		cipher = "PSK";
1008		}
1009#endif
1010
1011	OpenSSL_add_ssl_algorithms();
1012	SSL_load_error_strings();
1013
1014#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1015	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
1029#ifndef OPENSSL_NO_ENGINE
1030        e = setup_engine(bio_err, engine_id, 1);
1031	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
1042#endif
1043	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
1052
1053	if (key_file)
1054
1055		{
1056
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
1065		}
1066
1067	if (cert_file)
1068
1069		{
1070		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			}
1078		}
1079
1080	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));
1088
1089	if (bio_c_out == NULL)
1090		{
1091		if (c_quiet && !c_debug && !c_msg)
1092			{
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
1102#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
1110	ctx=SSL_CTX_new(meth);
1111	if (ctx == NULL)
1112		{
1113		ERR_print_errors(bio_err);
1114		goto end;
1115		}
1116
1117	if (vpm)
1118		SSL_CTX_set1_param(ctx, vpm);
1119
1120#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
1134#ifndef OPENSSL_NO_PSK
1135#ifdef OPENSSL_NO_JPAKE
1136	if (psk_key != NULL)
1137#else
1138	if (psk_key != NULL || jpake_secret)
1139#endif
1140		{
1141		if (c_debug)
1142			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
1143		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1144		}
1145#endif
1146#ifndef OPENSSL_NO_SRTP
1147	if (srtp_profiles != NULL)
1148		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1149#endif
1150	if (bugs)
1151		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1152	else
1153		SSL_CTX_set_options(ctx,off);
1154
1155	if (clr)
1156		SSL_CTX_clear_options(ctx, clr);
1157	/* DTLS: partial reads end up discarding unread UDP bytes :-(
1158	 * Setting read ahead solves this problem.
1159	 */
1160	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1161
1162#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1163	if (next_proto.data)
1164		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1165#endif
1166
1167	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1168	if (cipher != NULL)
1169		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1170		BIO_printf(bio_err,"error setting cipher list\n");
1171		ERR_print_errors(bio_err);
1172		goto end;
1173	}
1174#if 0
1175	else
1176		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1177#endif
1178
1179	SSL_CTX_set_verify(ctx,verify,verify_callback);
1180	if (!set_cert_key_stuff(ctx,cert,key))
1181		goto end;
1182
1183	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1184		(!SSL_CTX_set_default_verify_paths(ctx)))
1185		{
1186		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
1187		ERR_print_errors(bio_err);
1188		/* goto end; */
1189		}
1190
1191#ifndef OPENSSL_NO_TLSEXT
1192	if (servername != NULL)
1193		{
1194		tlsextcbp.biodebug = bio_err;
1195		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1196		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1197		}
1198#ifndef OPENSSL_NO_SRP
1199        if (srp_arg.srplogin)
1200		{
1201		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
1202			{
1203			BIO_printf(bio_err,"Unable to set SRP username\n");
1204			goto end;
1205			}
1206		srp_arg.msg = c_msg;
1207		srp_arg.debug = c_debug ;
1208		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1209		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1210		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1211		if (c_msg || c_debug || srp_arg.amp == 0)
1212			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1213		}
1214
1215#endif
1216#endif
1217
1218	con=SSL_new(ctx);
1219	if (sess_in)
1220		{
1221		SSL_SESSION *sess;
1222		BIO *stmp = BIO_new_file(sess_in, "r");
1223		if (!stmp)
1224			{
1225			BIO_printf(bio_err, "Can't open session file %s\n",
1226						sess_in);
1227			ERR_print_errors(bio_err);
1228			goto end;
1229			}
1230		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1231		BIO_free(stmp);
1232		if (!sess)
1233			{
1234			BIO_printf(bio_err, "Can't open session file %s\n",
1235						sess_in);
1236			ERR_print_errors(bio_err);
1237			goto end;
1238			}
1239		SSL_set_session(con, sess);
1240		SSL_SESSION_free(sess);
1241		}
1242
1243	if (fallback_scsv)
1244		SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
1245
1246#ifndef OPENSSL_NO_TLSEXT
1247	if (servername != NULL)
1248		{
1249		if (!SSL_set_tlsext_host_name(con,servername))
1250			{
1251			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1252			ERR_print_errors(bio_err);
1253			goto end;
1254			}
1255		}
1256#endif
1257#ifndef OPENSSL_NO_KRB5
1258	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
1259                {
1260		SSL_set0_kssl_ctx(con, kctx);
1261                kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1262		}
1263#endif	/* OPENSSL_NO_KRB5  */
1264/*	SSL_set_cipher_list(con,"RC4-MD5"); */
1265#if 0
1266#ifdef TLSEXT_TYPE_opaque_prf_input
1267	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1268#endif
1269#endif
1270
1271re_start:
1272
1273	if (init_client(&s,host,port,socket_type) == 0)
1274		{
1275		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1276		SHUTDOWN(s);
1277		goto end;
1278		}
1279	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1280
1281#ifdef FIONBIO
1282	if (c_nbio)
1283		{
1284		unsigned long l=1;
1285		BIO_printf(bio_c_out,"turning on non blocking io\n");
1286		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1287			{
1288			ERR_print_errors(bio_err);
1289			goto end;
1290			}
1291		}
1292#endif
1293	if (c_Pause & 0x01) SSL_set_debug(con, 1);
1294
1295	if ( SSL_version(con) == DTLS1_VERSION)
1296		{
1297
1298		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1299		if (getsockname(s, &peer, (void *)&peerlen) < 0)
1300			{
1301			BIO_printf(bio_err, "getsockname:errno=%d\n",
1302				get_last_socket_error());
1303			SHUTDOWN(s);
1304			goto end;
1305			}
1306
1307		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
1308
1309		if (enable_timeouts)
1310			{
1311			timeout.tv_sec = 0;
1312			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1313			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1314
1315			timeout.tv_sec = 0;
1316			timeout.tv_usec = DGRAM_SND_TIMEOUT;
1317			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1318			}
1319
1320		if (socket_mtu > 28)
1321			{
1322			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1323			SSL_set_mtu(con, socket_mtu - 28);
1324			}
1325		else
1326			/* want to do MTU discovery */
1327			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1328		}
1329	else
1330		sbio=BIO_new_socket(s,BIO_NOCLOSE);
1331
1332	if (nbio_test)
1333		{
1334		BIO *test;
1335
1336		test=BIO_new(BIO_f_nbio_test());
1337		sbio=BIO_push(test,sbio);
1338		}
1339
1340	if (c_debug)
1341		{
1342		SSL_set_debug(con, 1);
1343		BIO_set_callback(sbio,bio_dump_callback);
1344		BIO_set_callback_arg(sbio,(char *)bio_c_out);
1345		}
1346	if (c_msg)
1347		{
1348		SSL_set_msg_callback(con, msg_cb);
1349		SSL_set_msg_callback_arg(con, bio_c_out);
1350		}
1351#ifndef OPENSSL_NO_TLSEXT
1352	if (c_tlsextdebug)
1353		{
1354		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1355		SSL_set_tlsext_debug_arg(con, bio_c_out);
1356		}
1357	if (c_status_req)
1358		{
1359		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1360		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1361		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1362#if 0
1363{
1364STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1365OCSP_RESPID *id = OCSP_RESPID_new();
1366id->value.byKey = ASN1_OCTET_STRING_new();
1367id->type = V_OCSP_RESPID_KEY;
1368ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1369sk_OCSP_RESPID_push(ids, id);
1370SSL_set_tlsext_status_ids(con, ids);
1371}
1372#endif
1373		}
1374#endif
1375#ifndef OPENSSL_NO_JPAKE
1376	if (jpake_secret)
1377		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1378#endif
1379
1380	SSL_set_bio(con,sbio,sbio);
1381	SSL_set_connect_state(con);
1382
1383	/* ok, lets connect */
1384	width=SSL_get_fd(con)+1;
1385
1386	read_tty=1;
1387	write_tty=0;
1388	tty_on=0;
1389	read_ssl=1;
1390	write_ssl=1;
1391
1392	cbuf_len=0;
1393	cbuf_off=0;
1394	sbuf_len=0;
1395	sbuf_off=0;
1396
1397	/* This is an ugly hack that does a lot of assumptions */
1398	/* We do have to handle multi-line responses which may come
1399 	   in a single packet or not. We therefore have to use
1400	   BIO_gets() which does need a buffering BIO. So during
1401	   the initial chitchat we do push a buffering BIO into the
1402	   chain that is removed again later on to not disturb the
1403	   rest of the s_client operation. */
1404	if (starttls_proto == PROTO_SMTP)
1405		{
1406		int foundit=0;
1407		BIO *fbio = BIO_new(BIO_f_buffer());
1408		BIO_push(fbio, sbio);
1409		/* wait for multi-line response to end from SMTP */
1410		do
1411			{
1412			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1413			}
1414		while (mbuf_len>3 && mbuf[3]=='-');
1415		/* STARTTLS command requires EHLO... */
1416		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1417		(void)BIO_flush(fbio);
1418		/* wait for multi-line response to end EHLO SMTP response */
1419		do
1420			{
1421			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1422			if (strstr(mbuf,"STARTTLS"))
1423				foundit=1;
1424			}
1425		while (mbuf_len>3 && mbuf[3]=='-');
1426		(void)BIO_flush(fbio);
1427		BIO_pop(fbio);
1428		BIO_free(fbio);
1429		if (!foundit)
1430			BIO_printf(bio_err,
1431				   "didn't found starttls in server response,"
1432				   " try anyway...\n");
1433		BIO_printf(sbio,"STARTTLS\r\n");
1434		BIO_read(sbio,sbuf,BUFSIZZ);
1435		}
1436	else if (starttls_proto == PROTO_POP3)
1437		{
1438		BIO_read(sbio,mbuf,BUFSIZZ);
1439		BIO_printf(sbio,"STLS\r\n");
1440		BIO_read(sbio,sbuf,BUFSIZZ);
1441		}
1442	else if (starttls_proto == PROTO_IMAP)
1443		{
1444		int foundit=0;
1445		BIO *fbio = BIO_new(BIO_f_buffer());
1446		BIO_push(fbio, sbio);
1447		BIO_gets(fbio,mbuf,BUFSIZZ);
1448		/* STARTTLS command requires CAPABILITY... */
1449		BIO_printf(fbio,". CAPABILITY\r\n");
1450		(void)BIO_flush(fbio);
1451		/* wait for multi-line CAPABILITY response */
1452		do
1453			{
1454			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1455			if (strstr(mbuf,"STARTTLS"))
1456				foundit=1;
1457			}
1458		while (mbuf_len>3 && mbuf[0]!='.');
1459		(void)BIO_flush(fbio);
1460		BIO_pop(fbio);
1461		BIO_free(fbio);
1462		if (!foundit)
1463			BIO_printf(bio_err,
1464				   "didn't found STARTTLS in server response,"
1465				   " try anyway...\n");
1466		BIO_printf(sbio,". STARTTLS\r\n");
1467		BIO_read(sbio,sbuf,BUFSIZZ);
1468		}
1469	else if (starttls_proto == PROTO_FTP)
1470		{
1471		BIO *fbio = BIO_new(BIO_f_buffer());
1472		BIO_push(fbio, sbio);
1473		/* wait for multi-line response to end from FTP */
1474		do
1475			{
1476			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1477			}
1478		while (mbuf_len>3 && mbuf[3]=='-');
1479		(void)BIO_flush(fbio);
1480		BIO_pop(fbio);
1481		BIO_free(fbio);
1482		BIO_printf(sbio,"AUTH TLS\r\n");
1483		BIO_read(sbio,sbuf,BUFSIZZ);
1484		}
1485	if (starttls_proto == PROTO_XMPP)
1486		{
1487		int seen = 0;
1488		BIO_printf(sbio,"<stream:stream "
1489		    "xmlns:stream='http://etherx.jabber.org/streams' "
1490		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1491		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1492		mbuf[seen] = 0;
1493		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1494			{
1495			if (strstr(mbuf, "/stream:features>"))
1496				goto shut;
1497			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1498			mbuf[seen] = 0;
1499			}
1500		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1501		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1502		sbuf[seen] = 0;
1503		if (!strstr(sbuf, "<proceed"))
1504			goto shut;
1505		mbuf[0] = 0;
1506		}
1507
1508	for (;;)
1509		{
1510		FD_ZERO(&readfds);
1511		FD_ZERO(&writefds);
1512
1513		if ((SSL_version(con) == DTLS1_VERSION) &&
1514			DTLSv1_get_timeout(con, &timeout))
1515			timeoutp = &timeout;
1516		else
1517			timeoutp = NULL;
1518
1519		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1520			{
1521			in_init=1;
1522			tty_on=0;
1523			}
1524		else
1525			{
1526			tty_on=1;
1527			if (in_init)
1528				{
1529				in_init=0;
1530#if 0 /* This test doesn't really work as intended (needs to be fixed) */
1531#ifndef OPENSSL_NO_TLSEXT
1532				if (servername != NULL && !SSL_session_reused(con))
1533					{
1534					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1535					}
1536#endif
1537#endif
1538				if (sess_out)
1539					{
1540					BIO *stmp = BIO_new_file(sess_out, "w");
1541					if (stmp)
1542						{
1543						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1544						BIO_free(stmp);
1545						}
1546					else
1547						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1548					}
1549				print_stuff(bio_c_out,con,full_log);
1550				if (full_log > 0) full_log--;
1551
1552				if (starttls_proto)
1553					{
1554					BIO_printf(bio_err,"%s",mbuf);
1555					/* We don't need to know any more */
1556					starttls_proto = PROTO_OFF;
1557					}
1558
1559				if (reconnect)
1560					{
1561					reconnect--;
1562					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1563					SSL_shutdown(con);
1564					SSL_set_connect_state(con);
1565					SHUTDOWN(SSL_get_fd(con));
1566					goto re_start;
1567					}
1568				}
1569			}
1570
1571		ssl_pending = read_ssl && SSL_pending(con);
1572
1573		if (!ssl_pending)
1574			{
1575#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1576			if (tty_on)
1577				{
1578				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
1579				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
1580				}
1581			if (read_ssl)
1582				openssl_fdset(SSL_get_fd(con),&readfds);
1583			if (write_ssl)
1584				openssl_fdset(SSL_get_fd(con),&writefds);
1585#else
1586			if(!tty_on || !write_tty) {
1587				if (read_ssl)
1588					openssl_fdset(SSL_get_fd(con),&readfds);
1589				if (write_ssl)
1590					openssl_fdset(SSL_get_fd(con),&writefds);
1591			}
1592#endif
1593/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1594				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1595
1596			/* Note: under VMS with SOCKETSHR the second parameter
1597			 * is currently of type (int *) whereas under other
1598			 * systems it is (void *) if you don't have a cast it
1599			 * will choke the compiler: if you do have a cast then
1600			 * you can either go for (int *) or (void *).
1601			 */
1602#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1603                        /* Under Windows/DOS we make the assumption that we can
1604			 * always write to the tty: therefore if we need to
1605			 * write to the tty we just fall through. Otherwise
1606			 * we timeout the select every second and see if there
1607			 * are any keypresses. Note: this is a hack, in a proper
1608			 * Windows application we wouldn't do this.
1609			 */
1610			i=0;
1611			if(!write_tty) {
1612				if(read_tty) {
1613					tv.tv_sec = 1;
1614					tv.tv_usec = 0;
1615					i=select(width,(void *)&readfds,(void *)&writefds,
1616						 NULL,&tv);
1617#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1618					if(!i && (!_kbhit() || !read_tty) ) continue;
1619#else
1620					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1621#endif
1622				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1623					 NULL,timeoutp);
1624			}
1625#elif defined(OPENSSL_SYS_NETWARE)
1626			if(!write_tty) {
1627				if(read_tty) {
1628					tv.tv_sec = 1;
1629					tv.tv_usec = 0;
1630					i=select(width,(void *)&readfds,(void *)&writefds,
1631						NULL,&tv);
1632				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1633					NULL,timeoutp);
1634			}
1635#elif defined(OPENSSL_SYS_BEOS_R5)
1636			/* Under BeOS-R5 the situation is similar to DOS */
1637			i=0;
1638			stdin_set = 0;
1639			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1640			if(!write_tty) {
1641				if(read_tty) {
1642					tv.tv_sec = 1;
1643					tv.tv_usec = 0;
1644					i=select(width,(void *)&readfds,(void *)&writefds,
1645						 NULL,&tv);
1646					if (read(fileno(stdin), sbuf, 0) >= 0)
1647						stdin_set = 1;
1648					if (!i && (stdin_set != 1 || !read_tty))
1649						continue;
1650				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1651					 NULL,timeoutp);
1652			}
1653			(void)fcntl(fileno(stdin), F_SETFL, 0);
1654#else
1655			i=select(width,(void *)&readfds,(void *)&writefds,
1656				 NULL,timeoutp);
1657#endif
1658			if ( i < 0)
1659				{
1660				BIO_printf(bio_err,"bad select %d\n",
1661				get_last_socket_error());
1662				goto shut;
1663				/* goto end; */
1664				}
1665			}
1666
1667		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1668			{
1669			BIO_printf(bio_err,"TIMEOUT occured\n");
1670			}
1671
1672		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1673			{
1674			k=SSL_write(con,&(cbuf[cbuf_off]),
1675				(unsigned int)cbuf_len);
1676			switch (SSL_get_error(con,k))
1677				{
1678			case SSL_ERROR_NONE:
1679				cbuf_off+=k;
1680				cbuf_len-=k;
1681				if (k <= 0) goto end;
1682				/* we have done a  write(con,NULL,0); */
1683				if (cbuf_len <= 0)
1684					{
1685					read_tty=1;
1686					write_ssl=0;
1687					}
1688				else /* if (cbuf_len > 0) */
1689					{
1690					read_tty=0;
1691					write_ssl=1;
1692					}
1693				break;
1694			case SSL_ERROR_WANT_WRITE:
1695				BIO_printf(bio_c_out,"write W BLOCK\n");
1696				write_ssl=1;
1697				read_tty=0;
1698				break;
1699			case SSL_ERROR_WANT_READ:
1700				BIO_printf(bio_c_out,"write R BLOCK\n");
1701				write_tty=0;
1702				read_ssl=1;
1703				write_ssl=0;
1704				break;
1705			case SSL_ERROR_WANT_X509_LOOKUP:
1706				BIO_printf(bio_c_out,"write X BLOCK\n");
1707				break;
1708			case SSL_ERROR_ZERO_RETURN:
1709				if (cbuf_len != 0)
1710					{
1711					BIO_printf(bio_c_out,"shutdown\n");
1712					ret = 0;
1713					goto shut;
1714					}
1715				else
1716					{
1717					read_tty=1;
1718					write_ssl=0;
1719					break;
1720					}
1721
1722			case SSL_ERROR_SYSCALL:
1723				if ((k != 0) || (cbuf_len != 0))
1724					{
1725					BIO_printf(bio_err,"write:errno=%d\n",
1726						get_last_socket_error());
1727					goto shut;
1728					}
1729				else
1730					{
1731					read_tty=1;
1732					write_ssl=0;
1733					}
1734				break;
1735			case SSL_ERROR_SSL:
1736				ERR_print_errors(bio_err);
1737				goto shut;
1738				}
1739			}
1740#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1741		/* Assume Windows/DOS/BeOS can always write */
1742		else if (!ssl_pending && write_tty)
1743#else
1744		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1745#endif
1746			{
1747#ifdef CHARSET_EBCDIC
1748			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1749#endif
1750			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
1751
1752			if (i <= 0)
1753				{
1754				BIO_printf(bio_c_out,"DONE\n");
1755				ret = 0;
1756				goto shut;
1757				/* goto end; */
1758				}
1759
1760			sbuf_len-=i;;
1761			sbuf_off+=i;
1762			if (sbuf_len <= 0)
1763				{
1764				read_ssl=1;
1765				write_tty=0;
1766				}
1767			}
1768		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1769			{
1770#ifdef RENEG
1771{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1772#endif
1773#if 1
1774			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1775#else
1776/* Demo for pending and peek :-) */
1777			k=SSL_read(con,sbuf,16);
1778{ char zbuf[10240];
1779printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1780}
1781#endif
1782
1783			switch (SSL_get_error(con,k))
1784				{
1785			case SSL_ERROR_NONE:
1786				if (k <= 0)
1787					goto end;
1788				sbuf_off=0;
1789				sbuf_len=k;
1790
1791				read_ssl=0;
1792				write_tty=1;
1793				break;
1794			case SSL_ERROR_WANT_WRITE:
1795				BIO_printf(bio_c_out,"read W BLOCK\n");
1796				write_ssl=1;
1797				read_tty=0;
1798				break;
1799			case SSL_ERROR_WANT_READ:
1800				BIO_printf(bio_c_out,"read R BLOCK\n");
1801				write_tty=0;
1802				read_ssl=1;
1803				if ((read_tty == 0) && (write_ssl == 0))
1804					write_ssl=1;
1805				break;
1806			case SSL_ERROR_WANT_X509_LOOKUP:
1807				BIO_printf(bio_c_out,"read X BLOCK\n");
1808				break;
1809			case SSL_ERROR_SYSCALL:
1810				ret=get_last_socket_error();
1811				BIO_printf(bio_err,"read:errno=%d\n",ret);
1812				goto shut;
1813			case SSL_ERROR_ZERO_RETURN:
1814				BIO_printf(bio_c_out,"closed\n");
1815				ret=0;
1816				goto shut;
1817			case SSL_ERROR_SSL:
1818				ERR_print_errors(bio_err);
1819				goto shut;
1820				/* break; */
1821				}
1822			}
1823
1824#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1825#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1826		else if (_kbhit())
1827#else
1828		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1829#endif
1830#elif defined (OPENSSL_SYS_NETWARE)
1831		else if (_kbhit())
1832#elif defined(OPENSSL_SYS_BEOS_R5)
1833		else if (stdin_set)
1834#else
1835		else if (FD_ISSET(fileno(stdin),&readfds))
1836#endif
1837			{
1838			if (crlf)
1839				{
1840				int j, lf_num;
1841
1842				i=raw_read_stdin(cbuf,BUFSIZZ/2);
1843				lf_num = 0;
1844				/* both loops are skipped when i <= 0 */
1845				for (j = 0; j < i; j++)
1846					if (cbuf[j] == '\n')
1847						lf_num++;
1848				for (j = i-1; j >= 0; j--)
1849					{
1850					cbuf[j+lf_num] = cbuf[j];
1851					if (cbuf[j] == '\n')
1852						{
1853						lf_num--;
1854						i++;
1855						cbuf[j+lf_num] = '\r';
1856						}
1857					}
1858				assert(lf_num == 0);
1859				}
1860			else
1861				i=raw_read_stdin(cbuf,BUFSIZZ);
1862
1863			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1864				{
1865				BIO_printf(bio_err,"DONE\n");
1866				ret=0;
1867				goto shut;
1868				}
1869
1870			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1871				{
1872				BIO_printf(bio_err,"RENEGOTIATING\n");
1873				SSL_renegotiate(con);
1874				cbuf_len=0;
1875				}
1876#ifndef OPENSSL_NO_HEARTBEATS
1877			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
1878 				{
1879				BIO_printf(bio_err,"HEARTBEATING\n");
1880				SSL_heartbeat(con);
1881				cbuf_len=0;
1882				}
1883#endif
1884			else
1885				{
1886				cbuf_len=i;
1887				cbuf_off=0;
1888#ifdef CHARSET_EBCDIC
1889				ebcdic2ascii(cbuf, cbuf, i);
1890#endif
1891				}
1892
1893			write_ssl=1;
1894			read_tty=0;
1895			}
1896		}
1897
1898	ret=0;
1899shut:
1900	if (in_init)
1901		print_stuff(bio_c_out,con,full_log);
1902	SSL_shutdown(con);
1903	SHUTDOWN(SSL_get_fd(con));
1904end:
1905	if (con != NULL)
1906		{
1907		if (prexit != 0)
1908			print_stuff(bio_c_out,con,1);
1909		SSL_free(con);
1910		}
1911#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1912	if (next_proto.data)
1913		OPENSSL_free(next_proto.data);
1914#endif
1915	if (ctx != NULL) SSL_CTX_free(ctx);
1916	if (cert)
1917		X509_free(cert);
1918	if (key)
1919		EVP_PKEY_free(key);
1920	if (pass)
1921		OPENSSL_free(pass);
1922	if (vpm)
1923		X509_VERIFY_PARAM_free(vpm);
1924	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1925	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1926	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1927	if (bio_c_out != NULL)
1928		{
1929		BIO_free(bio_c_out);
1930		bio_c_out=NULL;
1931		}
1932	apps_shutdown();
1933	OPENSSL_EXIT(ret);
1934	}
1935
1936
1937static void print_stuff(BIO *bio, SSL *s, int full)
1938	{
1939	X509 *peer=NULL;
1940	char *p;
1941	static const char *space="                ";
1942	char buf[BUFSIZ];
1943	STACK_OF(X509) *sk;
1944	STACK_OF(X509_NAME) *sk2;
1945	const SSL_CIPHER *c;
1946	X509_NAME *xn;
1947	int j,i;
1948#ifndef OPENSSL_NO_COMP
1949	const COMP_METHOD *comp, *expansion;
1950#endif
1951	unsigned char *exportedkeymat;
1952
1953	if (full)
1954		{
1955		int got_a_chain = 0;
1956
1957		sk=SSL_get_peer_cert_chain(s);
1958		if (sk != NULL)
1959			{
1960			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1961
1962			BIO_printf(bio,"---\nCertificate chain\n");
1963			for (i=0; i<sk_X509_num(sk); i++)
1964				{
1965				X509_NAME_oneline(X509_get_subject_name(
1966					sk_X509_value(sk,i)),buf,sizeof buf);
1967				BIO_printf(bio,"%2d s:%s\n",i,buf);
1968				X509_NAME_oneline(X509_get_issuer_name(
1969					sk_X509_value(sk,i)),buf,sizeof buf);
1970				BIO_printf(bio,"   i:%s\n",buf);
1971				if (c_showcerts)
1972					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1973				}
1974			}
1975
1976		BIO_printf(bio,"---\n");
1977		peer=SSL_get_peer_certificate(s);
1978		if (peer != NULL)
1979			{
1980			BIO_printf(bio,"Server certificate\n");
1981			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1982				PEM_write_bio_X509(bio,peer);
1983			X509_NAME_oneline(X509_get_subject_name(peer),
1984				buf,sizeof buf);
1985			BIO_printf(bio,"subject=%s\n",buf);
1986			X509_NAME_oneline(X509_get_issuer_name(peer),
1987				buf,sizeof buf);
1988			BIO_printf(bio,"issuer=%s\n",buf);
1989			}
1990		else
1991			BIO_printf(bio,"no peer certificate available\n");
1992
1993		sk2=SSL_get_client_CA_list(s);
1994		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
1995			{
1996			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
1997			for (i=0; i<sk_X509_NAME_num(sk2); i++)
1998				{
1999				xn=sk_X509_NAME_value(sk2,i);
2000				X509_NAME_oneline(xn,buf,sizeof(buf));
2001				BIO_write(bio,buf,strlen(buf));
2002				BIO_write(bio,"\n",1);
2003				}
2004			}
2005		else
2006			{
2007			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2008			}
2009		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
2010		if (p != NULL)
2011			{
2012			/* This works only for SSL 2.  In later protocol
2013			 * versions, the client does not know what other
2014			 * ciphers (in addition to the one to be used
2015			 * in the current connection) the server supports. */
2016
2017			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2018			j=i=0;
2019			while (*p)
2020				{
2021				if (*p == ':')
2022					{
2023					BIO_write(bio,space,15-j%25);
2024					i++;
2025					j=0;
2026					BIO_write(bio,((i%3)?" ":"\n"),1);
2027					}
2028				else
2029					{
2030					BIO_write(bio,p,1);
2031					j++;
2032					}
2033				p++;
2034				}
2035			BIO_write(bio,"\n",1);
2036			}
2037
2038		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2039			BIO_number_read(SSL_get_rbio(s)),
2040			BIO_number_written(SSL_get_wbio(s)));
2041		}
2042	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
2043	c=SSL_get_current_cipher(s);
2044	BIO_printf(bio,"%s, Cipher is %s\n",
2045		SSL_CIPHER_get_version(c),
2046		SSL_CIPHER_get_name(c));
2047	if (peer != NULL) {
2048		EVP_PKEY *pktmp;
2049		pktmp = X509_get_pubkey(peer);
2050		BIO_printf(bio,"Server public key is %d bit\n",
2051							 EVP_PKEY_bits(pktmp));
2052		EVP_PKEY_free(pktmp);
2053	}
2054	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2055			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2056#ifndef OPENSSL_NO_COMP
2057	comp=SSL_get_current_compression(s);
2058	expansion=SSL_get_current_expansion(s);
2059	BIO_printf(bio,"Compression: %s\n",
2060		comp ? SSL_COMP_get_name(comp) : "NONE");
2061	BIO_printf(bio,"Expansion: %s\n",
2062		expansion ? SSL_COMP_get_name(expansion) : "NONE");
2063#endif
2064
2065#ifdef SSL_DEBUG
2066	{
2067	/* Print out local port of connection: useful for debugging */
2068	int sock;
2069	struct sockaddr_in ladd;
2070	socklen_t ladd_size = sizeof(ladd);
2071	sock = SSL_get_fd(s);
2072	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2073	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2074	}
2075#endif
2076
2077#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2078	if (next_proto.status != -1) {
2079		const unsigned char *proto;
2080		unsigned int proto_len;
2081		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2082		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2083		BIO_write(bio, proto, proto_len);
2084		BIO_write(bio, "\n", 1);
2085	}
2086#endif
2087
2088#ifndef OPENSSL_NO_SRTP
2089 	{
2090 	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2091
2092	if(srtp_profile)
2093		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2094			   srtp_profile->name);
2095	}
2096#endif
2097
2098	SSL_SESSION_print(bio,SSL_get_session(s));
2099	if (keymatexportlabel != NULL)
2100		{
2101		BIO_printf(bio, "Keying material exporter:\n");
2102		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2103		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2104		exportedkeymat = OPENSSL_malloc(keymatexportlen);
2105		if (exportedkeymat != NULL)
2106			{
2107			if (!SSL_export_keying_material(s, exportedkeymat,
2108						        keymatexportlen,
2109						        keymatexportlabel,
2110						        strlen(keymatexportlabel),
2111						        NULL, 0, 0))
2112				{
2113				BIO_printf(bio, "    Error\n");
2114				}
2115			else
2116				{
2117				BIO_printf(bio, "    Keying material: ");
2118				for (i=0; i<keymatexportlen; i++)
2119					BIO_printf(bio, "%02X",
2120						   exportedkeymat[i]);
2121				BIO_printf(bio, "\n");
2122				}
2123			OPENSSL_free(exportedkeymat);
2124			}
2125		}
2126	BIO_printf(bio,"---\n");
2127	if (peer != NULL)
2128		X509_free(peer);
2129	/* flush, or debugging output gets mixed with http response */
2130	(void)BIO_flush(bio);
2131	}
2132
2133#ifndef OPENSSL_NO_TLSEXT
2134
2135static int ocsp_resp_cb(SSL *s, void *arg)
2136	{
2137	const unsigned char *p;
2138	int len;
2139	OCSP_RESPONSE *rsp;
2140	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2141	BIO_puts(arg, "OCSP response: ");
2142	if (!p)
2143		{
2144		BIO_puts(arg, "no response sent\n");
2145		return 1;
2146		}
2147	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2148	if (!rsp)
2149		{
2150		BIO_puts(arg, "response parse error\n");
2151		BIO_dump_indent(arg, (char *)p, len, 4);
2152		return 0;
2153		}
2154	BIO_puts(arg, "\n======================================\n");
2155	OCSP_RESPONSE_print(arg, rsp, 0);
2156	BIO_puts(arg, "======================================\n");
2157	OCSP_RESPONSE_free(rsp);
2158	return 1;
2159	}
2160
2161#endif
2162