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," -mtu          - set the link layer MTU\n");
339	BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
340	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
341	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
342	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
343	BIO_printf(bio_err,"                 command to see what is available\n");
344	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
345	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
346	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
347	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
348	BIO_printf(bio_err,"                 are supported.\n");
349#ifndef OPENSSL_NO_ENGINE
350	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
351#endif
352	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
353	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
354	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
355#ifndef OPENSSL_NO_TLSEXT
356	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
357	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
358	BIO_printf(bio_err," -status           - request certificate status from server\n");
359	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
360# ifndef OPENSSL_NO_NEXTPROTONEG
361	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
362# endif
363#endif
364	BIO_printf(bio_err," -cutthrough       - enable 1-RTT full-handshake for strong ciphers\n");
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 cutthrough=0;
582	int crlf=0;
583	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
584	SSL_CTX *ctx=NULL;
585	int ret=1,in_init=1,i,nbio_test=0;
586	int starttls_proto = PROTO_OFF;
587	int prexit = 0;
588	X509_VERIFY_PARAM *vpm = NULL;
589	int badarg = 0;
590	const SSL_METHOD *meth=NULL;
591	int socket_type=SOCK_STREAM;
592	BIO *sbio;
593	char *inrand=NULL;
594	int mbuf_len=0;
595	struct timeval timeout, *timeoutp;
596#ifndef OPENSSL_NO_ENGINE
597	char *engine_id=NULL;
598	char *ssl_client_engine_id=NULL;
599	ENGINE *ssl_client_engine=NULL;
600#endif
601	ENGINE *e=NULL;
602#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
603	struct timeval tv;
604#if defined(OPENSSL_SYS_BEOS_R5)
605	int stdin_set = 0;
606#endif
607#endif
608#ifndef OPENSSL_NO_TLSEXT
609	char *servername = NULL;
610        tlsextctx tlsextcbp =
611        {NULL,0};
612# ifndef OPENSSL_NO_NEXTPROTONEG
613	const char *next_proto_neg_in = NULL;
614# endif
615#endif
616	char *sess_in = NULL;
617	char *sess_out = NULL;
618	struct sockaddr peer;
619	int peerlen = sizeof(peer);
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,"-timeout") == 0)
827			enable_timeouts=1;
828		else if (strcmp(*argv,"-mtu") == 0)
829			{
830			if (--argc < 1) goto bad;
831			socket_mtu = atol(*(++argv));
832			}
833#endif
834		else if (strcmp(*argv,"-bugs") == 0)
835			bugs=1;
836		else if	(strcmp(*argv,"-keyform") == 0)
837			{
838			if (--argc < 1) goto bad;
839			key_format = str2fmt(*(++argv));
840			}
841		else if	(strcmp(*argv,"-pass") == 0)
842			{
843			if (--argc < 1) goto bad;
844			passarg = *(++argv);
845			}
846		else if	(strcmp(*argv,"-key") == 0)
847			{
848			if (--argc < 1) goto bad;
849			key_file= *(++argv);
850			}
851		else if	(strcmp(*argv,"-reconnect") == 0)
852			{
853			reconnect=5;
854			}
855		else if	(strcmp(*argv,"-CApath") == 0)
856			{
857			if (--argc < 1) goto bad;
858			CApath= *(++argv);
859			}
860		else if	(strcmp(*argv,"-CAfile") == 0)
861			{
862			if (--argc < 1) goto bad;
863			CAfile= *(++argv);
864			}
865		else if (strcmp(*argv,"-no_tls1_2") == 0)
866			off|=SSL_OP_NO_TLSv1_2;
867		else if (strcmp(*argv,"-no_tls1_1") == 0)
868			off|=SSL_OP_NO_TLSv1_1;
869		else if (strcmp(*argv,"-no_tls1") == 0)
870			off|=SSL_OP_NO_TLSv1;
871		else if (strcmp(*argv,"-no_ssl3") == 0)
872			off|=SSL_OP_NO_SSLv3;
873		else if (strcmp(*argv,"-no_ssl2") == 0)
874			off|=SSL_OP_NO_SSLv2;
875		else if	(strcmp(*argv,"-no_comp") == 0)
876			{ off|=SSL_OP_NO_COMPRESSION; }
877#ifndef OPENSSL_NO_TLSEXT
878		else if	(strcmp(*argv,"-no_ticket") == 0)
879			{ off|=SSL_OP_NO_TICKET; }
880# ifndef OPENSSL_NO_NEXTPROTONEG
881		else if (strcmp(*argv,"-nextprotoneg") == 0)
882			{
883			if (--argc < 1) goto bad;
884			next_proto_neg_in = *(++argv);
885			}
886# endif
887#endif
888		else if (strcmp(*argv,"-cutthrough") == 0)
889			cutthrough=1;
890		else if (strcmp(*argv,"-serverpref") == 0)
891			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
892		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
893			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
894		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
895			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
896		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
897			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
898		else if	(strcmp(*argv,"-cipher") == 0)
899			{
900			if (--argc < 1) goto bad;
901			cipher= *(++argv);
902			}
903#ifdef FIONBIO
904		else if (strcmp(*argv,"-nbio") == 0)
905			{ c_nbio=1; }
906#endif
907		else if	(strcmp(*argv,"-starttls") == 0)
908			{
909			if (--argc < 1) goto bad;
910			++argv;
911			if (strcmp(*argv,"smtp") == 0)
912				starttls_proto = PROTO_SMTP;
913			else if (strcmp(*argv,"pop3") == 0)
914				starttls_proto = PROTO_POP3;
915			else if (strcmp(*argv,"imap") == 0)
916				starttls_proto = PROTO_IMAP;
917			else if (strcmp(*argv,"ftp") == 0)
918				starttls_proto = PROTO_FTP;
919			else if (strcmp(*argv, "xmpp") == 0)
920				starttls_proto = PROTO_XMPP;
921			else
922				goto bad;
923			}
924#ifndef OPENSSL_NO_ENGINE
925		else if	(strcmp(*argv,"-engine") == 0)
926			{
927			if (--argc < 1) goto bad;
928			engine_id = *(++argv);
929			}
930		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
931			{
932			if (--argc < 1) goto bad;
933			ssl_client_engine_id = *(++argv);
934			}
935#endif
936		else if (strcmp(*argv,"-rand") == 0)
937			{
938			if (--argc < 1) goto bad;
939			inrand= *(++argv);
940			}
941#ifndef OPENSSL_NO_TLSEXT
942		else if (strcmp(*argv,"-servername") == 0)
943			{
944			if (--argc < 1) goto bad;
945			servername= *(++argv);
946			/* meth=TLSv1_client_method(); */
947			}
948#endif
949#ifndef OPENSSL_NO_JPAKE
950		else if (strcmp(*argv,"-jpake") == 0)
951			{
952			if (--argc < 1) goto bad;
953			jpake_secret = *++argv;
954			}
955#endif
956#ifndef OPENSSL_NO_SRTP
957		else if (strcmp(*argv,"-use_srtp") == 0)
958			{
959			if (--argc < 1) goto bad;
960			srtp_profiles = *(++argv);
961			}
962#endif
963		else if (strcmp(*argv,"-keymatexport") == 0)
964			{
965			if (--argc < 1) goto bad;
966			keymatexportlabel= *(++argv);
967			}
968		else if (strcmp(*argv,"-keymatexportlen") == 0)
969			{
970			if (--argc < 1) goto bad;
971			keymatexportlen=atoi(*(++argv));
972			if (keymatexportlen == 0) goto bad;
973			}
974                else
975			{
976			BIO_printf(bio_err,"unknown option %s\n",*argv);
977			badop=1;
978			break;
979			}
980		argc--;
981		argv++;
982		}
983	if (badop)
984		{
985bad:
986		sc_usage();
987		goto end;
988		}
989
990#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
991	if (jpake_secret)
992		{
993		if (psk_key)
994			{
995			BIO_printf(bio_err,
996				   "Can't use JPAKE and PSK together\n");
997			goto end;
998			}
999		psk_identity = "JPAKE";
1000		if (cipher)
1001			{
1002			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1003			goto end;
1004			}
1005		cipher = "PSK";
1006		}
1007#endif
1008
1009	OpenSSL_add_ssl_algorithms();
1010	SSL_load_error_strings();
1011
1012#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1013	next_proto.status = -1;
1014	if (next_proto_neg_in)
1015		{
1016		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1017		if (next_proto.data == NULL)
1018			{
1019			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1020			goto end;
1021			}
1022		}
1023	else
1024		next_proto.data = NULL;
1025#endif
1026
1027#ifndef OPENSSL_NO_ENGINE
1028        e = setup_engine(bio_err, engine_id, 1);
1029	if (ssl_client_engine_id)
1030		{
1031		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1032		if (!ssl_client_engine)
1033			{
1034			BIO_printf(bio_err,
1035					"Error getting client auth engine\n");
1036			goto end;
1037			}
1038		}
1039
1040#endif
1041	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1042		{
1043		BIO_printf(bio_err, "Error getting password\n");
1044		goto end;
1045		}
1046
1047	if (key_file == NULL)
1048		key_file = cert_file;
1049
1050
1051	if (key_file)
1052
1053		{
1054
1055		key = load_key(bio_err, key_file, key_format, 0, pass, e,
1056			       "client certificate private key file");
1057		if (!key)
1058			{
1059			ERR_print_errors(bio_err);
1060			goto end;
1061			}
1062
1063		}
1064
1065	if (cert_file)
1066
1067		{
1068		cert = load_cert(bio_err,cert_file,cert_format,
1069				NULL, e, "client certificate file");
1070
1071		if (!cert)
1072			{
1073			ERR_print_errors(bio_err);
1074			goto end;
1075			}
1076		}
1077
1078	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1079		&& !RAND_status())
1080		{
1081		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1082		}
1083	if (inrand != NULL)
1084		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1085			app_RAND_load_files(inrand));
1086
1087	if (bio_c_out == NULL)
1088		{
1089		if (c_quiet && !c_debug && !c_msg)
1090			{
1091			bio_c_out=BIO_new(BIO_s_null());
1092			}
1093		else
1094			{
1095			if (bio_c_out == NULL)
1096				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1097			}
1098		}
1099
1100#ifndef OPENSSL_NO_SRP
1101	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1102		{
1103		BIO_printf(bio_err, "Error getting password\n");
1104		goto end;
1105		}
1106#endif
1107
1108	ctx=SSL_CTX_new(meth);
1109	if (ctx == NULL)
1110		{
1111		ERR_print_errors(bio_err);
1112		goto end;
1113		}
1114
1115	if (vpm)
1116		SSL_CTX_set1_param(ctx, vpm);
1117
1118#ifndef OPENSSL_NO_ENGINE
1119	if (ssl_client_engine)
1120		{
1121		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1122			{
1123			BIO_puts(bio_err, "Error setting client auth engine\n");
1124			ERR_print_errors(bio_err);
1125			ENGINE_free(ssl_client_engine);
1126			goto end;
1127			}
1128		ENGINE_free(ssl_client_engine);
1129		}
1130#endif
1131
1132#ifndef OPENSSL_NO_PSK
1133#ifdef OPENSSL_NO_JPAKE
1134	if (psk_key != NULL)
1135#else
1136	if (psk_key != NULL || jpake_secret)
1137#endif
1138		{
1139		if (c_debug)
1140			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
1141		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1142		}
1143#endif
1144#ifndef OPENSSL_NO_SRTP
1145	if (srtp_profiles != NULL)
1146		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1147#endif
1148	if (bugs)
1149		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1150	else
1151		SSL_CTX_set_options(ctx,off);
1152
1153	if (clr)
1154		SSL_CTX_clear_options(ctx, clr);
1155	/* DTLS: partial reads end up discarding unread UDP bytes :-(
1156	 * Setting read ahead solves this problem.
1157	 */
1158	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1159
1160#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1161	if (next_proto.data)
1162		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1163#endif
1164
1165	/* Enable handshake cutthrough for client connections using
1166	 * strong ciphers. */
1167	if (cutthrough)
1168		{
1169		int ssl_mode = SSL_CTX_get_mode(ctx);
1170		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
1171		SSL_CTX_set_mode(ctx, ssl_mode);
1172		}
1173
1174	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1175	if (cipher != NULL)
1176		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1177		BIO_printf(bio_err,"error setting cipher list\n");
1178		ERR_print_errors(bio_err);
1179		goto end;
1180	}
1181#if 0
1182	else
1183		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1184#endif
1185
1186	SSL_CTX_set_verify(ctx,verify,verify_callback);
1187	if (!set_cert_key_stuff(ctx,cert,key))
1188		goto end;
1189
1190	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1191		(!SSL_CTX_set_default_verify_paths(ctx)))
1192		{
1193		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
1194		ERR_print_errors(bio_err);
1195		/* goto end; */
1196		}
1197
1198#ifndef OPENSSL_NO_TLSEXT
1199	if (servername != NULL)
1200		{
1201		tlsextcbp.biodebug = bio_err;
1202		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1203		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1204		}
1205#ifndef OPENSSL_NO_SRP
1206        if (srp_arg.srplogin)
1207		{
1208		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
1209			{
1210			BIO_printf(bio_err,"Unable to set SRP username\n");
1211			goto end;
1212			}
1213		srp_arg.msg = c_msg;
1214		srp_arg.debug = c_debug ;
1215		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1216		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1217		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1218		if (c_msg || c_debug || srp_arg.amp == 0)
1219			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1220		}
1221
1222#endif
1223#endif
1224
1225	con=SSL_new(ctx);
1226	if (sess_in)
1227		{
1228		SSL_SESSION *sess;
1229		BIO *stmp = BIO_new_file(sess_in, "r");
1230		if (!stmp)
1231			{
1232			BIO_printf(bio_err, "Can't open session file %s\n",
1233						sess_in);
1234			ERR_print_errors(bio_err);
1235			goto end;
1236			}
1237		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1238		BIO_free(stmp);
1239		if (!sess)
1240			{
1241			BIO_printf(bio_err, "Can't open session file %s\n",
1242						sess_in);
1243			ERR_print_errors(bio_err);
1244			goto end;
1245			}
1246		SSL_set_session(con, sess);
1247		SSL_SESSION_free(sess);
1248		}
1249#ifndef OPENSSL_NO_TLSEXT
1250	if (servername != NULL)
1251		{
1252		if (!SSL_set_tlsext_host_name(con,servername))
1253			{
1254			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1255			ERR_print_errors(bio_err);
1256			goto end;
1257			}
1258		}
1259#endif
1260#ifndef OPENSSL_NO_KRB5
1261	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
1262                {
1263		SSL_set0_kssl_ctx(con, kctx);
1264                kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1265		}
1266#endif	/* OPENSSL_NO_KRB5  */
1267/*	SSL_set_cipher_list(con,"RC4-MD5"); */
1268#if 0
1269#ifdef TLSEXT_TYPE_opaque_prf_input
1270	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1271#endif
1272#endif
1273
1274re_start:
1275
1276	if (init_client(&s,host,port,socket_type) == 0)
1277		{
1278		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1279		SHUTDOWN(s);
1280		goto end;
1281		}
1282	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1283
1284#ifdef FIONBIO
1285	if (c_nbio)
1286		{
1287		unsigned long l=1;
1288		BIO_printf(bio_c_out,"turning on non blocking io\n");
1289		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1290			{
1291			ERR_print_errors(bio_err);
1292			goto end;
1293			}
1294		}
1295#endif
1296	if (c_Pause & 0x01) SSL_set_debug(con, 1);
1297
1298	if ( SSL_version(con) == DTLS1_VERSION)
1299		{
1300
1301		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1302		if (getsockname(s, &peer, (void *)&peerlen) < 0)
1303			{
1304			BIO_printf(bio_err, "getsockname:errno=%d\n",
1305				get_last_socket_error());
1306			SHUTDOWN(s);
1307			goto end;
1308			}
1309
1310		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
1311
1312		if (enable_timeouts)
1313			{
1314			timeout.tv_sec = 0;
1315			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1316			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1317
1318			timeout.tv_sec = 0;
1319			timeout.tv_usec = DGRAM_SND_TIMEOUT;
1320			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1321			}
1322
1323		if (socket_mtu > 28)
1324			{
1325			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1326			SSL_set_mtu(con, socket_mtu - 28);
1327			}
1328		else
1329			/* want to do MTU discovery */
1330			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1331		}
1332	else
1333		sbio=BIO_new_socket(s,BIO_NOCLOSE);
1334
1335	if (nbio_test)
1336		{
1337		BIO *test;
1338
1339		test=BIO_new(BIO_f_nbio_test());
1340		sbio=BIO_push(test,sbio);
1341		}
1342
1343	if (c_debug)
1344		{
1345		SSL_set_debug(con, 1);
1346		BIO_set_callback(sbio,bio_dump_callback);
1347		BIO_set_callback_arg(sbio,(char *)bio_c_out);
1348		}
1349	if (c_msg)
1350		{
1351		SSL_set_msg_callback(con, msg_cb);
1352		SSL_set_msg_callback_arg(con, bio_c_out);
1353		}
1354#ifndef OPENSSL_NO_TLSEXT
1355	if (c_tlsextdebug)
1356		{
1357		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1358		SSL_set_tlsext_debug_arg(con, bio_c_out);
1359		}
1360	if (c_status_req)
1361		{
1362		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1363		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1364		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1365#if 0
1366{
1367STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1368OCSP_RESPID *id = OCSP_RESPID_new();
1369id->value.byKey = ASN1_OCTET_STRING_new();
1370id->type = V_OCSP_RESPID_KEY;
1371ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1372sk_OCSP_RESPID_push(ids, id);
1373SSL_set_tlsext_status_ids(con, ids);
1374}
1375#endif
1376		}
1377#endif
1378#ifndef OPENSSL_NO_JPAKE
1379	if (jpake_secret)
1380		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1381#endif
1382
1383	SSL_set_bio(con,sbio,sbio);
1384	SSL_set_connect_state(con);
1385
1386	/* ok, lets connect */
1387	width=SSL_get_fd(con)+1;
1388
1389	read_tty=1;
1390	write_tty=0;
1391	tty_on=0;
1392	read_ssl=1;
1393	write_ssl=1;
1394
1395	cbuf_len=0;
1396	cbuf_off=0;
1397	sbuf_len=0;
1398	sbuf_off=0;
1399
1400	/* This is an ugly hack that does a lot of assumptions */
1401	/* We do have to handle multi-line responses which may come
1402 	   in a single packet or not. We therefore have to use
1403	   BIO_gets() which does need a buffering BIO. So during
1404	   the initial chitchat we do push a buffering BIO into the
1405	   chain that is removed again later on to not disturb the
1406	   rest of the s_client operation. */
1407	if (starttls_proto == PROTO_SMTP)
1408		{
1409		int foundit=0;
1410		BIO *fbio = BIO_new(BIO_f_buffer());
1411		BIO_push(fbio, sbio);
1412		/* wait for multi-line response to end from SMTP */
1413		do
1414			{
1415			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1416			}
1417		while (mbuf_len>3 && mbuf[3]=='-');
1418		/* STARTTLS command requires EHLO... */
1419		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1420		(void)BIO_flush(fbio);
1421		/* wait for multi-line response to end EHLO SMTP response */
1422		do
1423			{
1424			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1425			if (strstr(mbuf,"STARTTLS"))
1426				foundit=1;
1427			}
1428		while (mbuf_len>3 && mbuf[3]=='-');
1429		(void)BIO_flush(fbio);
1430		BIO_pop(fbio);
1431		BIO_free(fbio);
1432		if (!foundit)
1433			BIO_printf(bio_err,
1434				   "didn't found starttls in server response,"
1435				   " try anyway...\n");
1436		BIO_printf(sbio,"STARTTLS\r\n");
1437		BIO_read(sbio,sbuf,BUFSIZZ);
1438		}
1439	else if (starttls_proto == PROTO_POP3)
1440		{
1441		BIO_read(sbio,mbuf,BUFSIZZ);
1442		BIO_printf(sbio,"STLS\r\n");
1443		BIO_read(sbio,sbuf,BUFSIZZ);
1444		}
1445	else if (starttls_proto == PROTO_IMAP)
1446		{
1447		int foundit=0;
1448		BIO *fbio = BIO_new(BIO_f_buffer());
1449		BIO_push(fbio, sbio);
1450		BIO_gets(fbio,mbuf,BUFSIZZ);
1451		/* STARTTLS command requires CAPABILITY... */
1452		BIO_printf(fbio,". CAPABILITY\r\n");
1453		(void)BIO_flush(fbio);
1454		/* wait for multi-line CAPABILITY response */
1455		do
1456			{
1457			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1458			if (strstr(mbuf,"STARTTLS"))
1459				foundit=1;
1460			}
1461		while (mbuf_len>3 && mbuf[0]!='.');
1462		(void)BIO_flush(fbio);
1463		BIO_pop(fbio);
1464		BIO_free(fbio);
1465		if (!foundit)
1466			BIO_printf(bio_err,
1467				   "didn't found STARTTLS in server response,"
1468				   " try anyway...\n");
1469		BIO_printf(sbio,". STARTTLS\r\n");
1470		BIO_read(sbio,sbuf,BUFSIZZ);
1471		}
1472	else if (starttls_proto == PROTO_FTP)
1473		{
1474		BIO *fbio = BIO_new(BIO_f_buffer());
1475		BIO_push(fbio, sbio);
1476		/* wait for multi-line response to end from FTP */
1477		do
1478			{
1479			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1480			}
1481		while (mbuf_len>3 && mbuf[3]=='-');
1482		(void)BIO_flush(fbio);
1483		BIO_pop(fbio);
1484		BIO_free(fbio);
1485		BIO_printf(sbio,"AUTH TLS\r\n");
1486		BIO_read(sbio,sbuf,BUFSIZZ);
1487		}
1488	if (starttls_proto == PROTO_XMPP)
1489		{
1490		int seen = 0;
1491		BIO_printf(sbio,"<stream:stream "
1492		    "xmlns:stream='http://etherx.jabber.org/streams' "
1493		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1494		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1495		mbuf[seen] = 0;
1496		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1497			{
1498			if (strstr(mbuf, "/stream:features>"))
1499				goto shut;
1500			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1501			mbuf[seen] = 0;
1502			}
1503		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1504		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1505		sbuf[seen] = 0;
1506		if (!strstr(sbuf, "<proceed"))
1507			goto shut;
1508		mbuf[0] = 0;
1509		}
1510
1511	for (;;)
1512		{
1513		FD_ZERO(&readfds);
1514		FD_ZERO(&writefds);
1515
1516		if ((SSL_version(con) == DTLS1_VERSION) &&
1517			DTLSv1_get_timeout(con, &timeout))
1518			timeoutp = &timeout;
1519		else
1520			timeoutp = NULL;
1521
1522		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1523			{
1524			in_init=1;
1525			tty_on=0;
1526			}
1527		else
1528			{
1529			tty_on=1;
1530			if (in_init)
1531				{
1532				in_init=0;
1533#if 0 /* This test doesn't really work as intended (needs to be fixed) */
1534#ifndef OPENSSL_NO_TLSEXT
1535				if (servername != NULL && !SSL_session_reused(con))
1536					{
1537					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1538					}
1539#endif
1540#endif
1541				if (sess_out)
1542					{
1543					BIO *stmp = BIO_new_file(sess_out, "w");
1544					if (stmp)
1545						{
1546						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1547						BIO_free(stmp);
1548						}
1549					else
1550						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1551					}
1552				print_stuff(bio_c_out,con,full_log);
1553				if (full_log > 0) full_log--;
1554
1555				if (starttls_proto)
1556					{
1557					BIO_printf(bio_err,"%s",mbuf);
1558					/* We don't need to know any more */
1559					starttls_proto = PROTO_OFF;
1560					}
1561
1562				if (reconnect)
1563					{
1564					reconnect--;
1565					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1566					SSL_shutdown(con);
1567					SSL_set_connect_state(con);
1568					SHUTDOWN(SSL_get_fd(con));
1569					goto re_start;
1570					}
1571				}
1572			}
1573
1574		ssl_pending = read_ssl && SSL_pending(con);
1575
1576		if (!ssl_pending)
1577			{
1578#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1579			if (tty_on)
1580				{
1581				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
1582				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
1583				}
1584			if (read_ssl)
1585				openssl_fdset(SSL_get_fd(con),&readfds);
1586			if (write_ssl)
1587				openssl_fdset(SSL_get_fd(con),&writefds);
1588#else
1589			if(!tty_on || !write_tty) {
1590				if (read_ssl)
1591					openssl_fdset(SSL_get_fd(con),&readfds);
1592				if (write_ssl)
1593					openssl_fdset(SSL_get_fd(con),&writefds);
1594			}
1595#endif
1596/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1597				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1598
1599			/* Note: under VMS with SOCKETSHR the second parameter
1600			 * is currently of type (int *) whereas under other
1601			 * systems it is (void *) if you don't have a cast it
1602			 * will choke the compiler: if you do have a cast then
1603			 * you can either go for (int *) or (void *).
1604			 */
1605#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1606                        /* Under Windows/DOS we make the assumption that we can
1607			 * always write to the tty: therefore if we need to
1608			 * write to the tty we just fall through. Otherwise
1609			 * we timeout the select every second and see if there
1610			 * are any keypresses. Note: this is a hack, in a proper
1611			 * Windows application we wouldn't do this.
1612			 */
1613			i=0;
1614			if(!write_tty) {
1615				if(read_tty) {
1616					tv.tv_sec = 1;
1617					tv.tv_usec = 0;
1618					i=select(width,(void *)&readfds,(void *)&writefds,
1619						 NULL,&tv);
1620#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1621					if(!i && (!_kbhit() || !read_tty) ) continue;
1622#else
1623					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1624#endif
1625				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1626					 NULL,timeoutp);
1627			}
1628#elif defined(OPENSSL_SYS_NETWARE)
1629			if(!write_tty) {
1630				if(read_tty) {
1631					tv.tv_sec = 1;
1632					tv.tv_usec = 0;
1633					i=select(width,(void *)&readfds,(void *)&writefds,
1634						NULL,&tv);
1635				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1636					NULL,timeoutp);
1637			}
1638#elif defined(OPENSSL_SYS_BEOS_R5)
1639			/* Under BeOS-R5 the situation is similar to DOS */
1640			i=0;
1641			stdin_set = 0;
1642			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1643			if(!write_tty) {
1644				if(read_tty) {
1645					tv.tv_sec = 1;
1646					tv.tv_usec = 0;
1647					i=select(width,(void *)&readfds,(void *)&writefds,
1648						 NULL,&tv);
1649					if (read(fileno(stdin), sbuf, 0) >= 0)
1650						stdin_set = 1;
1651					if (!i && (stdin_set != 1 || !read_tty))
1652						continue;
1653				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1654					 NULL,timeoutp);
1655			}
1656			(void)fcntl(fileno(stdin), F_SETFL, 0);
1657#else
1658			i=select(width,(void *)&readfds,(void *)&writefds,
1659				 NULL,timeoutp);
1660#endif
1661			if ( i < 0)
1662				{
1663				BIO_printf(bio_err,"bad select %d\n",
1664				get_last_socket_error());
1665				goto shut;
1666				/* goto end; */
1667				}
1668			}
1669
1670		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1671			{
1672			BIO_printf(bio_err,"TIMEOUT occured\n");
1673			}
1674
1675		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1676			{
1677			k=SSL_write(con,&(cbuf[cbuf_off]),
1678				(unsigned int)cbuf_len);
1679			switch (SSL_get_error(con,k))
1680				{
1681			case SSL_ERROR_NONE:
1682				cbuf_off+=k;
1683				cbuf_len-=k;
1684				if (k <= 0) goto end;
1685				/* we have done a  write(con,NULL,0); */
1686				if (cbuf_len <= 0)
1687					{
1688					read_tty=1;
1689					write_ssl=0;
1690					}
1691				else /* if (cbuf_len > 0) */
1692					{
1693					read_tty=0;
1694					write_ssl=1;
1695					}
1696				break;
1697			case SSL_ERROR_WANT_WRITE:
1698				BIO_printf(bio_c_out,"write W BLOCK\n");
1699				write_ssl=1;
1700				read_tty=0;
1701				break;
1702			case SSL_ERROR_WANT_READ:
1703				BIO_printf(bio_c_out,"write R BLOCK\n");
1704				write_tty=0;
1705				read_ssl=1;
1706				write_ssl=0;
1707				break;
1708			case SSL_ERROR_WANT_X509_LOOKUP:
1709				BIO_printf(bio_c_out,"write X BLOCK\n");
1710				break;
1711			case SSL_ERROR_ZERO_RETURN:
1712				if (cbuf_len != 0)
1713					{
1714					BIO_printf(bio_c_out,"shutdown\n");
1715					ret = 0;
1716					goto shut;
1717					}
1718				else
1719					{
1720					read_tty=1;
1721					write_ssl=0;
1722					break;
1723					}
1724
1725			case SSL_ERROR_SYSCALL:
1726				if ((k != 0) || (cbuf_len != 0))
1727					{
1728					BIO_printf(bio_err,"write:errno=%d\n",
1729						get_last_socket_error());
1730					goto shut;
1731					}
1732				else
1733					{
1734					read_tty=1;
1735					write_ssl=0;
1736					}
1737				break;
1738			case SSL_ERROR_SSL:
1739				ERR_print_errors(bio_err);
1740				goto shut;
1741				}
1742			}
1743#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1744		/* Assume Windows/DOS/BeOS can always write */
1745		else if (!ssl_pending && write_tty)
1746#else
1747		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1748#endif
1749			{
1750#ifdef CHARSET_EBCDIC
1751			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1752#endif
1753			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
1754
1755			if (i <= 0)
1756				{
1757				BIO_printf(bio_c_out,"DONE\n");
1758				ret = 0;
1759				goto shut;
1760				/* goto end; */
1761				}
1762
1763			sbuf_len-=i;;
1764			sbuf_off+=i;
1765			if (sbuf_len <= 0)
1766				{
1767				read_ssl=1;
1768				write_tty=0;
1769				}
1770			}
1771		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1772			{
1773#ifdef RENEG
1774{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1775#endif
1776#if 1
1777			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1778#else
1779/* Demo for pending and peek :-) */
1780			k=SSL_read(con,sbuf,16);
1781{ char zbuf[10240];
1782printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1783}
1784#endif
1785
1786			switch (SSL_get_error(con,k))
1787				{
1788			case SSL_ERROR_NONE:
1789				if (k <= 0)
1790					goto end;
1791				sbuf_off=0;
1792				sbuf_len=k;
1793
1794				read_ssl=0;
1795				write_tty=1;
1796				break;
1797			case SSL_ERROR_WANT_WRITE:
1798				BIO_printf(bio_c_out,"read W BLOCK\n");
1799				write_ssl=1;
1800				read_tty=0;
1801				break;
1802			case SSL_ERROR_WANT_READ:
1803				BIO_printf(bio_c_out,"read R BLOCK\n");
1804				write_tty=0;
1805				read_ssl=1;
1806				if ((read_tty == 0) && (write_ssl == 0))
1807					write_ssl=1;
1808				break;
1809			case SSL_ERROR_WANT_X509_LOOKUP:
1810				BIO_printf(bio_c_out,"read X BLOCK\n");
1811				break;
1812			case SSL_ERROR_SYSCALL:
1813				ret=get_last_socket_error();
1814				BIO_printf(bio_err,"read:errno=%d\n",ret);
1815				goto shut;
1816			case SSL_ERROR_ZERO_RETURN:
1817				BIO_printf(bio_c_out,"closed\n");
1818				ret=0;
1819				goto shut;
1820			case SSL_ERROR_SSL:
1821				ERR_print_errors(bio_err);
1822				goto shut;
1823				/* break; */
1824				}
1825			}
1826
1827#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1828#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1829		else if (_kbhit())
1830#else
1831		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1832#endif
1833#elif defined (OPENSSL_SYS_NETWARE)
1834		else if (_kbhit())
1835#elif defined(OPENSSL_SYS_BEOS_R5)
1836		else if (stdin_set)
1837#else
1838		else if (FD_ISSET(fileno(stdin),&readfds))
1839#endif
1840			{
1841			if (crlf)
1842				{
1843				int j, lf_num;
1844
1845				i=raw_read_stdin(cbuf,BUFSIZZ/2);
1846				lf_num = 0;
1847				/* both loops are skipped when i <= 0 */
1848				for (j = 0; j < i; j++)
1849					if (cbuf[j] == '\n')
1850						lf_num++;
1851				for (j = i-1; j >= 0; j--)
1852					{
1853					cbuf[j+lf_num] = cbuf[j];
1854					if (cbuf[j] == '\n')
1855						{
1856						lf_num--;
1857						i++;
1858						cbuf[j+lf_num] = '\r';
1859						}
1860					}
1861				assert(lf_num == 0);
1862				}
1863			else
1864				i=raw_read_stdin(cbuf,BUFSIZZ);
1865
1866			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1867				{
1868				BIO_printf(bio_err,"DONE\n");
1869				ret=0;
1870				goto shut;
1871				}
1872
1873			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1874				{
1875				BIO_printf(bio_err,"RENEGOTIATING\n");
1876				SSL_renegotiate(con);
1877				cbuf_len=0;
1878				}
1879#ifndef OPENSSL_NO_HEARTBEATS
1880			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
1881 				{
1882				BIO_printf(bio_err,"HEARTBEATING\n");
1883				SSL_heartbeat(con);
1884				cbuf_len=0;
1885				}
1886#endif
1887			else
1888				{
1889				cbuf_len=i;
1890				cbuf_off=0;
1891#ifdef CHARSET_EBCDIC
1892				ebcdic2ascii(cbuf, cbuf, i);
1893#endif
1894				}
1895
1896			write_ssl=1;
1897			read_tty=0;
1898			}
1899		}
1900
1901	ret=0;
1902shut:
1903	if (in_init)
1904		print_stuff(bio_c_out,con,full_log);
1905	SSL_shutdown(con);
1906	SHUTDOWN(SSL_get_fd(con));
1907end:
1908	if (con != NULL)
1909		{
1910		if (prexit != 0)
1911			print_stuff(bio_c_out,con,1);
1912		SSL_free(con);
1913		}
1914#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1915	if (next_proto.data)
1916		OPENSSL_free(next_proto.data);
1917#endif
1918	if (ctx != NULL) SSL_CTX_free(ctx);
1919	if (cert)
1920		X509_free(cert);
1921	if (key)
1922		EVP_PKEY_free(key);
1923	if (pass)
1924		OPENSSL_free(pass);
1925	if (vpm)
1926		X509_VERIFY_PARAM_free(vpm);
1927	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1928	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1929	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1930	if (bio_c_out != NULL)
1931		{
1932		BIO_free(bio_c_out);
1933		bio_c_out=NULL;
1934		}
1935	apps_shutdown();
1936	OPENSSL_EXIT(ret);
1937	}
1938
1939
1940static void print_stuff(BIO *bio, SSL *s, int full)
1941	{
1942	X509 *peer=NULL;
1943	char *p;
1944	static const char *space="                ";
1945	char buf[BUFSIZ];
1946	STACK_OF(X509) *sk;
1947	STACK_OF(X509_NAME) *sk2;
1948	const SSL_CIPHER *c;
1949	X509_NAME *xn;
1950	int j,i;
1951#ifndef OPENSSL_NO_COMP
1952	const COMP_METHOD *comp, *expansion;
1953#endif
1954	unsigned char *exportedkeymat;
1955
1956	if (full)
1957		{
1958		int got_a_chain = 0;
1959
1960		sk=SSL_get_peer_cert_chain(s);
1961		if (sk != NULL)
1962			{
1963			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1964
1965			BIO_printf(bio,"---\nCertificate chain\n");
1966			for (i=0; i<sk_X509_num(sk); i++)
1967				{
1968				X509_NAME_oneline(X509_get_subject_name(
1969					sk_X509_value(sk,i)),buf,sizeof buf);
1970				BIO_printf(bio,"%2d s:%s\n",i,buf);
1971				X509_NAME_oneline(X509_get_issuer_name(
1972					sk_X509_value(sk,i)),buf,sizeof buf);
1973				BIO_printf(bio,"   i:%s\n",buf);
1974				if (c_showcerts)
1975					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1976				}
1977			}
1978
1979		BIO_printf(bio,"---\n");
1980		peer=SSL_get_peer_certificate(s);
1981		if (peer != NULL)
1982			{
1983			BIO_printf(bio,"Server certificate\n");
1984			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1985				PEM_write_bio_X509(bio,peer);
1986			X509_NAME_oneline(X509_get_subject_name(peer),
1987				buf,sizeof buf);
1988			BIO_printf(bio,"subject=%s\n",buf);
1989			X509_NAME_oneline(X509_get_issuer_name(peer),
1990				buf,sizeof buf);
1991			BIO_printf(bio,"issuer=%s\n",buf);
1992			}
1993		else
1994			BIO_printf(bio,"no peer certificate available\n");
1995
1996		sk2=SSL_get_client_CA_list(s);
1997		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
1998			{
1999			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
2000			for (i=0; i<sk_X509_NAME_num(sk2); i++)
2001				{
2002				xn=sk_X509_NAME_value(sk2,i);
2003				X509_NAME_oneline(xn,buf,sizeof(buf));
2004				BIO_write(bio,buf,strlen(buf));
2005				BIO_write(bio,"\n",1);
2006				}
2007			}
2008		else
2009			{
2010			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2011			}
2012		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
2013		if (p != NULL)
2014			{
2015			/* This works only for SSL 2.  In later protocol
2016			 * versions, the client does not know what other
2017			 * ciphers (in addition to the one to be used
2018			 * in the current connection) the server supports. */
2019
2020			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2021			j=i=0;
2022			while (*p)
2023				{
2024				if (*p == ':')
2025					{
2026					BIO_write(bio,space,15-j%25);
2027					i++;
2028					j=0;
2029					BIO_write(bio,((i%3)?" ":"\n"),1);
2030					}
2031				else
2032					{
2033					BIO_write(bio,p,1);
2034					j++;
2035					}
2036				p++;
2037				}
2038			BIO_write(bio,"\n",1);
2039			}
2040
2041		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2042			BIO_number_read(SSL_get_rbio(s)),
2043			BIO_number_written(SSL_get_wbio(s)));
2044		}
2045	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
2046	c=SSL_get_current_cipher(s);
2047	BIO_printf(bio,"%s, Cipher is %s\n",
2048		SSL_CIPHER_get_version(c),
2049		SSL_CIPHER_get_name(c));
2050	if (peer != NULL) {
2051		EVP_PKEY *pktmp;
2052		pktmp = X509_get_pubkey(peer);
2053		BIO_printf(bio,"Server public key is %d bit\n",
2054							 EVP_PKEY_bits(pktmp));
2055		EVP_PKEY_free(pktmp);
2056	}
2057	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2058			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2059#ifndef OPENSSL_NO_COMP
2060	comp=SSL_get_current_compression(s);
2061	expansion=SSL_get_current_expansion(s);
2062	BIO_printf(bio,"Compression: %s\n",
2063		comp ? SSL_COMP_get_name(comp) : "NONE");
2064	BIO_printf(bio,"Expansion: %s\n",
2065		expansion ? SSL_COMP_get_name(expansion) : "NONE");
2066#endif
2067
2068#ifdef SSL_DEBUG
2069	{
2070	/* Print out local port of connection: useful for debugging */
2071	int sock;
2072	struct sockaddr_in ladd;
2073	socklen_t ladd_size = sizeof(ladd);
2074	sock = SSL_get_fd(s);
2075	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2076	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2077	}
2078#endif
2079
2080#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2081	if (next_proto.status != -1) {
2082		const unsigned char *proto;
2083		unsigned int proto_len;
2084		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2085		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2086		BIO_write(bio, proto, proto_len);
2087		BIO_write(bio, "\n", 1);
2088	}
2089#endif
2090
2091#ifndef OPENSSL_NO_SRTP
2092 	{
2093 	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2094
2095	if(srtp_profile)
2096		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2097			   srtp_profile->name);
2098	}
2099#endif
2100
2101	SSL_SESSION_print(bio,SSL_get_session(s));
2102	if (keymatexportlabel != NULL)
2103		{
2104		BIO_printf(bio, "Keying material exporter:\n");
2105		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2106		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2107		exportedkeymat = OPENSSL_malloc(keymatexportlen);
2108		if (exportedkeymat != NULL)
2109			{
2110			if (!SSL_export_keying_material(s, exportedkeymat,
2111						        keymatexportlen,
2112						        keymatexportlabel,
2113						        strlen(keymatexportlabel),
2114						        NULL, 0, 0))
2115				{
2116				BIO_printf(bio, "    Error\n");
2117				}
2118			else
2119				{
2120				BIO_printf(bio, "    Keying material: ");
2121				for (i=0; i<keymatexportlen; i++)
2122					BIO_printf(bio, "%02X",
2123						   exportedkeymat[i]);
2124				BIO_printf(bio, "\n");
2125				}
2126			OPENSSL_free(exportedkeymat);
2127			}
2128		}
2129	BIO_printf(bio,"---\n");
2130	if (peer != NULL)
2131		X509_free(peer);
2132	/* flush, or debugging output gets mixed with http response */
2133	(void)BIO_flush(bio);
2134	}
2135
2136#ifndef OPENSSL_NO_TLSEXT
2137
2138static int ocsp_resp_cb(SSL *s, void *arg)
2139	{
2140	const unsigned char *p;
2141	int len;
2142	OCSP_RESPONSE *rsp;
2143	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2144	BIO_puts(arg, "OCSP response: ");
2145	if (!p)
2146		{
2147		BIO_puts(arg, "no response sent\n");
2148		return 1;
2149		}
2150	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2151	if (!rsp)
2152		{
2153		BIO_puts(arg, "response parse error\n");
2154		BIO_dump_indent(arg, (char *)p, len, 4);
2155		return 0;
2156		}
2157	BIO_puts(arg, "\n======================================\n");
2158	OCSP_RESPONSE_print(arg, rsp, 0);
2159	BIO_puts(arg, "======================================\n");
2160	OCSP_RESPONSE_free(rsp);
2161	return 1;
2162	}
2163
2164#endif
2165