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-2001 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#include <assert.h>
113#include <stdio.h>
114#include <stdlib.h>
115#include <string.h>
116#include <openssl/e_os2.h>
117#ifdef OPENSSL_NO_STDIO
118#define APPS_WIN16
119#endif
120
121/* With IPv6, it looks like Digital has mixed up the proper order of
122   recursive header file inclusion, resulting in the compiler complaining
123   that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
124   is needed to have fileno() declared correctly...  So let's define u_int */
125#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
126#define __U_INT
127typedef unsigned int u_int;
128#endif
129
130#define USE_SOCKETS
131#include "apps.h"
132#include <openssl/x509.h>
133#include <openssl/ssl.h>
134#include <openssl/err.h>
135#include <openssl/pem.h>
136#include <openssl/rand.h>
137#include <openssl/ocsp.h>
138#include "s_apps.h"
139#include "timeouts.h"
140
141#ifdef OPENSSL_SYS_WINCE
142/* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
143#ifdef fileno
144#undef fileno
145#endif
146#define fileno(a) (int)_fileno(a)
147#endif
148
149
150#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
151/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
152#undef FIONBIO
153#endif
154
155#undef PROG
156#define PROG	s_client_main
157
158/*#define SSL_HOST_NAME	"www.netscape.com" */
159/*#define SSL_HOST_NAME	"193.118.187.102" */
160#define SSL_HOST_NAME	"localhost"
161
162/*#define TEST_CERT "client.pem" */ /* no default cert. */
163
164#undef BUFSIZZ
165#define BUFSIZZ 1024*8
166
167extern int verify_depth;
168extern int verify_error;
169
170#ifdef FIONBIO
171static int c_nbio=0;
172#endif
173static int c_Pause=0;
174static int c_debug=0;
175#ifndef OPENSSL_NO_TLSEXT
176static int c_tlsextdebug=0;
177static int c_status_req=0;
178#endif
179static int c_msg=0;
180static int c_showcerts=0;
181
182static void sc_usage(void);
183static void print_stuff(BIO *berr,SSL *con,int full);
184#ifndef OPENSSL_NO_TLSEXT
185static int ocsp_resp_cb(SSL *s, void *arg);
186#endif
187static BIO *bio_c_out=NULL;
188static int c_quiet=0;
189static int c_ign_eof=0;
190
191static void sc_usage(void)
192	{
193	BIO_printf(bio_err,"usage: s_client args\n");
194	BIO_printf(bio_err,"\n");
195	BIO_printf(bio_err," -host host     - use -connect instead\n");
196	BIO_printf(bio_err," -port port     - use -connect instead\n");
197	BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
198
199	BIO_printf(bio_err," -verify depth - turn on peer certificate verification\n");
200	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
201	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
202	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
203	BIO_printf(bio_err,"                 not specified but cert file is.\n");
204	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
205	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
206	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
207	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
208	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
209	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
210	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
211	BIO_printf(bio_err," -debug        - extra output\n");
212#ifdef WATT32
213	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
214#endif
215	BIO_printf(bio_err," -msg          - Show protocol messages\n");
216	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
217	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
218#ifdef FIONBIO
219	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
220#endif
221	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
222	BIO_printf(bio_err," -quiet        - no s_client output\n");
223	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
224	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
225	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
226	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
227	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
228	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
229	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
230	BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
231	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
232	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
233	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
234	BIO_printf(bio_err,"                 command to see what is available\n");
235	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
236	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
237	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
238	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
239	BIO_printf(bio_err,"                 are supported.\n");
240#ifndef OPENSSL_NO_ENGINE
241	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
242#endif
243	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
244	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
245	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
246#ifndef OPENSSL_NO_TLSEXT
247	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
248	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
249	BIO_printf(bio_err," -status           - request certificate status from server\n");
250	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
251#endif
252	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
253	}
254
255#ifndef OPENSSL_NO_TLSEXT
256
257/* This is a context that we pass to callbacks */
258typedef struct tlsextctx_st {
259   BIO * biodebug;
260   int ack;
261} tlsextctx;
262
263
264static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
265	{
266	tlsextctx * p = (tlsextctx *) arg;
267	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
268	if (SSL_get_servername_type(s) != -1)
269 	        p->ack = !SSL_session_reused(s) && hn != NULL;
270	else
271		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
272
273	return SSL_TLSEXT_ERR_OK;
274	}
275#endif
276enum
277{
278	PROTO_OFF	= 0,
279	PROTO_SMTP,
280	PROTO_POP3,
281	PROTO_IMAP,
282	PROTO_FTP,
283	PROTO_XMPP
284};
285
286int MAIN(int, char **);
287
288int MAIN(int argc, char **argv)
289	{
290	int off=0, clr = 0;
291	SSL *con=NULL,*con2=NULL;
292	X509_STORE *store = NULL;
293	int s,k,width,state=0;
294	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
295	int cbuf_len,cbuf_off;
296	int sbuf_len,sbuf_off;
297	fd_set readfds,writefds;
298	short port=PORT;
299	int full_log=1;
300	char *host=SSL_HOST_NAME;
301	char *cert_file=NULL,*key_file=NULL;
302	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
303	char *passarg = NULL, *pass = NULL;
304	X509 *cert = NULL;
305	EVP_PKEY *key = NULL;
306	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
307	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
308	int crlf=0;
309	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
310	SSL_CTX *ctx=NULL;
311	int ret=1,in_init=1,i,nbio_test=0;
312	int starttls_proto = PROTO_OFF;
313	int prexit = 0, vflags = 0;
314	SSL_METHOD *meth=NULL;
315#ifdef sock_type
316#undef sock_type
317#endif
318	int sock_type=SOCK_STREAM;
319	BIO *sbio;
320	char *inrand=NULL;
321	int mbuf_len=0;
322	struct timeval timeout, *timeoutp;
323#ifndef OPENSSL_NO_ENGINE
324	char *engine_id=NULL;
325	char *ssl_client_engine_id=NULL;
326	ENGINE *ssl_client_engine=NULL;
327#endif
328	ENGINE *e=NULL;
329#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
330	struct timeval tv;
331#endif
332
333#ifndef OPENSSL_NO_TLSEXT
334	char *servername = NULL;
335        tlsextctx tlsextcbp =
336        {NULL,0};
337#endif
338	char *sess_in = NULL;
339	char *sess_out = NULL;
340	struct sockaddr peer;
341	int peerlen = sizeof(peer);
342	int enable_timeouts = 0 ;
343	long socket_mtu = 0;
344#ifndef OPENSSL_NO_JPAKE
345	char *jpake_secret = NULL;
346#endif
347
348	meth=SSLv23_client_method();
349
350	apps_startup();
351	c_Pause=0;
352	c_quiet=0;
353	c_ign_eof=0;
354	c_debug=0;
355	c_msg=0;
356	c_showcerts=0;
357
358	if (bio_err == NULL)
359		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
360
361	if (!load_config(bio_err, NULL))
362		goto end;
363
364	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
365		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
366		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
367		{
368		BIO_printf(bio_err,"out of memory\n");
369		goto end;
370		}
371
372	verify_depth=0;
373	verify_error=X509_V_OK;
374#ifdef FIONBIO
375	c_nbio=0;
376#endif
377
378	argc--;
379	argv++;
380	while (argc >= 1)
381		{
382		if	(strcmp(*argv,"-host") == 0)
383			{
384			if (--argc < 1) goto bad;
385			host= *(++argv);
386			}
387		else if	(strcmp(*argv,"-port") == 0)
388			{
389			if (--argc < 1) goto bad;
390			port=atoi(*(++argv));
391			if (port == 0) goto bad;
392			}
393		else if (strcmp(*argv,"-connect") == 0)
394			{
395			if (--argc < 1) goto bad;
396			if (!extract_host_port(*(++argv),&host,NULL,&port))
397				goto bad;
398			}
399		else if	(strcmp(*argv,"-verify") == 0)
400			{
401			verify=SSL_VERIFY_PEER;
402			if (--argc < 1) goto bad;
403			verify_depth=atoi(*(++argv));
404			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
405			}
406		else if	(strcmp(*argv,"-cert") == 0)
407			{
408			if (--argc < 1) goto bad;
409			cert_file= *(++argv);
410			}
411		else if	(strcmp(*argv,"-sess_out") == 0)
412			{
413			if (--argc < 1) goto bad;
414			sess_out = *(++argv);
415			}
416		else if	(strcmp(*argv,"-sess_in") == 0)
417			{
418			if (--argc < 1) goto bad;
419			sess_in = *(++argv);
420			}
421		else if	(strcmp(*argv,"-certform") == 0)
422			{
423			if (--argc < 1) goto bad;
424			cert_format = str2fmt(*(++argv));
425			}
426		else if	(strcmp(*argv,"-crl_check") == 0)
427			vflags |= X509_V_FLAG_CRL_CHECK;
428		else if	(strcmp(*argv,"-crl_check_all") == 0)
429			vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL;
430		else if	(strcmp(*argv,"-prexit") == 0)
431			prexit=1;
432		else if	(strcmp(*argv,"-crlf") == 0)
433			crlf=1;
434		else if	(strcmp(*argv,"-quiet") == 0)
435			{
436			c_quiet=1;
437			c_ign_eof=1;
438			}
439		else if	(strcmp(*argv,"-ign_eof") == 0)
440			c_ign_eof=1;
441		else if	(strcmp(*argv,"-no_ign_eof") == 0)
442			c_ign_eof=0;
443		else if	(strcmp(*argv,"-pause") == 0)
444			c_Pause=1;
445		else if	(strcmp(*argv,"-debug") == 0)
446			c_debug=1;
447#ifndef OPENSSL_NO_TLSEXT
448		else if	(strcmp(*argv,"-tlsextdebug") == 0)
449			c_tlsextdebug=1;
450		else if	(strcmp(*argv,"-status") == 0)
451			c_status_req=1;
452#endif
453#ifdef WATT32
454		else if (strcmp(*argv,"-wdebug") == 0)
455			dbug_init();
456#endif
457		else if	(strcmp(*argv,"-msg") == 0)
458			c_msg=1;
459		else if	(strcmp(*argv,"-showcerts") == 0)
460			c_showcerts=1;
461		else if	(strcmp(*argv,"-nbio_test") == 0)
462			nbio_test=1;
463		else if	(strcmp(*argv,"-state") == 0)
464			state=1;
465#ifndef OPENSSL_NO_SSL2
466		else if	(strcmp(*argv,"-ssl2") == 0)
467			meth=SSLv2_client_method();
468#endif
469#ifndef OPENSSL_NO_SSL3
470		else if	(strcmp(*argv,"-ssl3") == 0)
471			meth=SSLv3_client_method();
472#endif
473#ifndef OPENSSL_NO_TLS1
474		else if	(strcmp(*argv,"-tls1") == 0)
475			meth=TLSv1_client_method();
476#endif
477#ifndef OPENSSL_NO_DTLS1
478		else if	(strcmp(*argv,"-dtls1") == 0)
479			{
480			meth=DTLSv1_client_method();
481			sock_type=SOCK_DGRAM;
482			}
483		else if (strcmp(*argv,"-timeout") == 0)
484			enable_timeouts=1;
485		else if (strcmp(*argv,"-mtu") == 0)
486			{
487			if (--argc < 1) goto bad;
488			socket_mtu = atol(*(++argv));
489			}
490#endif
491		else if (strcmp(*argv,"-bugs") == 0)
492			bugs=1;
493		else if	(strcmp(*argv,"-keyform") == 0)
494			{
495			if (--argc < 1) goto bad;
496			key_format = str2fmt(*(++argv));
497			}
498		else if	(strcmp(*argv,"-pass") == 0)
499			{
500			if (--argc < 1) goto bad;
501			passarg = *(++argv);
502			}
503		else if	(strcmp(*argv,"-key") == 0)
504			{
505			if (--argc < 1) goto bad;
506			key_file= *(++argv);
507			}
508		else if	(strcmp(*argv,"-reconnect") == 0)
509			{
510			reconnect=5;
511			}
512		else if	(strcmp(*argv,"-CApath") == 0)
513			{
514			if (--argc < 1) goto bad;
515			CApath= *(++argv);
516			}
517		else if	(strcmp(*argv,"-CAfile") == 0)
518			{
519			if (--argc < 1) goto bad;
520			CAfile= *(++argv);
521			}
522		else if (strcmp(*argv,"-no_tls1") == 0)
523			off|=SSL_OP_NO_TLSv1;
524		else if (strcmp(*argv,"-no_ssl3") == 0)
525			off|=SSL_OP_NO_SSLv3;
526		else if (strcmp(*argv,"-no_ssl2") == 0)
527			off|=SSL_OP_NO_SSLv2;
528#ifndef OPENSSL_NO_TLSEXT
529		else if	(strcmp(*argv,"-no_ticket") == 0)
530			{ off|=SSL_OP_NO_TICKET; }
531#endif
532		else if (strcmp(*argv,"-serverpref") == 0)
533			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
534		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
535			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
536		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
537			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
538		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
539			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
540		else if	(strcmp(*argv,"-cipher") == 0)
541			{
542			if (--argc < 1) goto bad;
543			cipher= *(++argv);
544			}
545#ifdef FIONBIO
546		else if (strcmp(*argv,"-nbio") == 0)
547			{ c_nbio=1; }
548#endif
549		else if	(strcmp(*argv,"-starttls") == 0)
550			{
551			if (--argc < 1) goto bad;
552			++argv;
553			if (strcmp(*argv,"smtp") == 0)
554				starttls_proto = PROTO_SMTP;
555			else if (strcmp(*argv,"pop3") == 0)
556				starttls_proto = PROTO_POP3;
557			else if (strcmp(*argv,"imap") == 0)
558				starttls_proto = PROTO_IMAP;
559			else if (strcmp(*argv,"ftp") == 0)
560				starttls_proto = PROTO_FTP;
561			else if (strcmp(*argv, "xmpp") == 0)
562				starttls_proto = PROTO_XMPP;
563			else
564				goto bad;
565			}
566#ifndef OPENSSL_NO_ENGINE
567		else if	(strcmp(*argv,"-engine") == 0)
568			{
569			if (--argc < 1) goto bad;
570			engine_id = *(++argv);
571			}
572		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
573			{
574			if (--argc < 1) goto bad;
575			ssl_client_engine_id = *(++argv);
576			}
577#endif
578		else if (strcmp(*argv,"-rand") == 0)
579			{
580			if (--argc < 1) goto bad;
581			inrand= *(++argv);
582			}
583#ifndef OPENSSL_NO_TLSEXT
584		else if (strcmp(*argv,"-servername") == 0)
585			{
586			if (--argc < 1) goto bad;
587			servername= *(++argv);
588			/* meth=TLSv1_client_method(); */
589			}
590#endif
591#ifndef OPENSSL_NO_JPAKE
592		else if (strcmp(*argv,"-jpake") == 0)
593			{
594			if (--argc < 1) goto bad;
595			jpake_secret = *++argv;
596			}
597#endif
598		else
599			{
600			BIO_printf(bio_err,"unknown option %s\n",*argv);
601			badop=1;
602			break;
603			}
604		argc--;
605		argv++;
606		}
607	if (badop)
608		{
609bad:
610		sc_usage();
611		goto end;
612		}
613
614	OpenSSL_add_ssl_algorithms();
615	SSL_load_error_strings();
616
617#ifndef OPENSSL_NO_ENGINE
618        e = setup_engine(bio_err, engine_id, 1);
619	if (ssl_client_engine_id)
620		{
621		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
622		if (!ssl_client_engine)
623			{
624			BIO_printf(bio_err,
625					"Error getting client auth engine\n");
626			goto end;
627			}
628		}
629#endif
630	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
631		{
632		BIO_printf(bio_err, "Error getting password\n");
633		goto end;
634		}
635
636	if (key_file == NULL)
637		key_file = cert_file;
638
639
640	if (key_file)
641
642		{
643
644		key = load_key(bio_err, key_file, key_format, 0, pass, e,
645			       "client certificate private key file");
646		if (!key)
647			{
648			ERR_print_errors(bio_err);
649			goto end;
650			}
651
652		}
653
654	if (cert_file)
655
656		{
657		cert = load_cert(bio_err,cert_file,cert_format,
658				NULL, e, "client certificate file");
659
660		if (!cert)
661			{
662			ERR_print_errors(bio_err);
663			goto end;
664			}
665		}
666
667	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
668		&& !RAND_status())
669		{
670		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
671		}
672	if (inrand != NULL)
673		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
674			app_RAND_load_files(inrand));
675
676	if (bio_c_out == NULL)
677		{
678		if (c_quiet && !c_debug && !c_msg)
679			{
680			bio_c_out=BIO_new(BIO_s_null());
681			}
682		else
683			{
684			if (bio_c_out == NULL)
685				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
686			}
687		}
688
689	ctx=SSL_CTX_new(meth);
690	if (ctx == NULL)
691		{
692		ERR_print_errors(bio_err);
693		goto end;
694		}
695
696#ifndef OPENSSL_NO_ENGINE
697	if (ssl_client_engine)
698		{
699		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
700			{
701			BIO_puts(bio_err, "Error setting client auth engine\n");
702			ERR_print_errors(bio_err);
703			ENGINE_free(ssl_client_engine);
704			goto end;
705			}
706		ENGINE_free(ssl_client_engine);
707		}
708#endif
709
710	if (bugs)
711		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
712	else
713		SSL_CTX_set_options(ctx,off);
714
715	if (clr)
716		SSL_CTX_clear_options(ctx, clr);
717	/* DTLS: partial reads end up discarding unread UDP bytes :-(
718	 * Setting read ahead solves this problem.
719	 */
720	if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
721
722	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
723	if (cipher != NULL)
724		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
725		BIO_printf(bio_err,"error setting cipher list\n");
726		ERR_print_errors(bio_err);
727		goto end;
728	}
729#if 0
730	else
731		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
732#endif
733
734	SSL_CTX_set_verify(ctx,verify,verify_callback);
735	if (!set_cert_key_stuff(ctx,cert,key))
736		goto end;
737
738	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
739		(!SSL_CTX_set_default_verify_paths(ctx)))
740		{
741		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
742		ERR_print_errors(bio_err);
743		/* goto end; */
744		}
745
746	store = SSL_CTX_get_cert_store(ctx);
747	X509_STORE_set_flags(store, vflags);
748#ifndef OPENSSL_NO_TLSEXT
749	if (servername != NULL)
750		{
751		tlsextcbp.biodebug = bio_err;
752		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
753		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
754		}
755#endif
756
757	con=SSL_new(ctx);
758	if (sess_in)
759		{
760		SSL_SESSION *sess;
761		BIO *stmp = BIO_new_file(sess_in, "r");
762		if (!stmp)
763			{
764			BIO_printf(bio_err, "Can't open session file %s\n",
765						sess_in);
766			ERR_print_errors(bio_err);
767			goto end;
768			}
769		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
770		BIO_free(stmp);
771		if (!sess)
772			{
773			BIO_printf(bio_err, "Can't open session file %s\n",
774						sess_in);
775			ERR_print_errors(bio_err);
776			goto end;
777			}
778		SSL_set_session(con, sess);
779		SSL_SESSION_free(sess);
780		}
781#ifndef OPENSSL_NO_TLSEXT
782	if (servername != NULL)
783		{
784		if (!SSL_set_tlsext_host_name(con,servername))
785			{
786			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
787			ERR_print_errors(bio_err);
788			goto end;
789			}
790		}
791#endif
792
793#ifndef OPENSSL_NO_KRB5
794	if (con  &&  (con->kssl_ctx = kssl_ctx_new()) != NULL)
795                {
796                kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);
797		}
798#endif	/* OPENSSL_NO_KRB5  */
799/*	SSL_set_cipher_list(con,"RC4-MD5"); */
800
801re_start:
802
803	if (init_client(&s,host,port,sock_type) == 0)
804		{
805		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
806		SHUTDOWN(s);
807		goto end;
808		}
809	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
810
811#ifdef FIONBIO
812	if (c_nbio)
813		{
814		unsigned long l=1;
815		BIO_printf(bio_c_out,"turning on non blocking io\n");
816		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
817			{
818			ERR_print_errors(bio_err);
819			goto end;
820			}
821		}
822#endif
823	if (c_Pause & 0x01) con->debug=1;
824
825	if ( SSL_version(con) == DTLS1_VERSION)
826		{
827
828		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
829		if (getsockname(s, &peer, (void *)&peerlen) < 0)
830			{
831			BIO_printf(bio_err, "getsockname:errno=%d\n",
832				get_last_socket_error());
833			SHUTDOWN(s);
834			goto end;
835			}
836
837		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
838
839		if ( enable_timeouts)
840			{
841			timeout.tv_sec = 0;
842			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
843			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
844
845			timeout.tv_sec = 0;
846			timeout.tv_usec = DGRAM_SND_TIMEOUT;
847			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
848			}
849
850		if (socket_mtu > 28)
851			{
852			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
853			SSL_set_mtu(con, socket_mtu - 28);
854			}
855		else
856			/* want to do MTU discovery */
857			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
858		}
859	else
860		sbio=BIO_new_socket(s,BIO_NOCLOSE);
861
862	if (nbio_test)
863		{
864		BIO *test;
865
866		test=BIO_new(BIO_f_nbio_test());
867		sbio=BIO_push(test,sbio);
868		}
869
870	if (c_debug)
871		{
872		con->debug=1;
873		BIO_set_callback(sbio,bio_dump_callback);
874		BIO_set_callback_arg(sbio,(char *)bio_c_out);
875		}
876	if (c_msg)
877		{
878		SSL_set_msg_callback(con, msg_cb);
879		SSL_set_msg_callback_arg(con, bio_c_out);
880		}
881#ifndef OPENSSL_NO_TLSEXT
882	if (c_tlsextdebug)
883		{
884		SSL_set_tlsext_debug_callback(con, tlsext_cb);
885		SSL_set_tlsext_debug_arg(con, bio_c_out);
886		}
887	if (c_status_req)
888		{
889		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
890		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
891		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
892#if 0
893{
894STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
895OCSP_RESPID *id = OCSP_RESPID_new();
896id->value.byKey = ASN1_OCTET_STRING_new();
897id->type = V_OCSP_RESPID_KEY;
898ASN1_STRING_set(id->value.byKey, "Hello World", -1);
899sk_OCSP_RESPID_push(ids, id);
900SSL_set_tlsext_status_ids(con, ids);
901}
902#endif
903		}
904#endif
905#ifndef OPENSSL_NO_JPAKE
906	if (jpake_secret)
907		jpake_client_auth(bio_c_out, sbio, jpake_secret);
908#endif
909
910	SSL_set_bio(con,sbio,sbio);
911	SSL_set_connect_state(con);
912
913	/* ok, lets connect */
914	width=SSL_get_fd(con)+1;
915
916	read_tty=1;
917	write_tty=0;
918	tty_on=0;
919	read_ssl=1;
920	write_ssl=1;
921
922	cbuf_len=0;
923	cbuf_off=0;
924	sbuf_len=0;
925	sbuf_off=0;
926
927	/* This is an ugly hack that does a lot of assumptions */
928	/* We do have to handle multi-line responses which may come
929 	   in a single packet or not. We therefore have to use
930	   BIO_gets() which does need a buffering BIO. So during
931	   the initial chitchat we do push a buffering BIO into the
932	   chain that is removed again later on to not disturb the
933	   rest of the s_client operation. */
934	if (starttls_proto == PROTO_SMTP)
935		{
936		int foundit=0;
937		BIO *fbio = BIO_new(BIO_f_buffer());
938		BIO_push(fbio, sbio);
939		/* wait for multi-line response to end from SMTP */
940		do
941			{
942			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
943			}
944		while (mbuf_len>3 && mbuf[3]=='-');
945		/* STARTTLS command requires EHLO... */
946		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
947		(void)BIO_flush(fbio);
948		/* wait for multi-line response to end EHLO SMTP response */
949		do
950			{
951			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
952			if (strstr(mbuf,"STARTTLS"))
953				foundit=1;
954			}
955		while (mbuf_len>3 && mbuf[3]=='-');
956		(void)BIO_flush(fbio);
957		BIO_pop(fbio);
958		BIO_free(fbio);
959		if (!foundit)
960			BIO_printf(bio_err,
961				   "didn't found starttls in server response,"
962				   " try anyway...\n");
963		BIO_printf(sbio,"STARTTLS\r\n");
964		BIO_read(sbio,sbuf,BUFSIZZ);
965		}
966	else if (starttls_proto == PROTO_POP3)
967		{
968		BIO_read(sbio,mbuf,BUFSIZZ);
969		BIO_printf(sbio,"STLS\r\n");
970		BIO_read(sbio,sbuf,BUFSIZZ);
971		}
972	else if (starttls_proto == PROTO_IMAP)
973		{
974		int foundit=0;
975		BIO *fbio = BIO_new(BIO_f_buffer());
976		BIO_push(fbio, sbio);
977		BIO_gets(fbio,mbuf,BUFSIZZ);
978		/* STARTTLS command requires CAPABILITY... */
979		BIO_printf(fbio,". CAPABILITY\r\n");
980		(void)BIO_flush(fbio);
981		/* wait for multi-line CAPABILITY response */
982		do
983			{
984			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
985			if (strstr(mbuf,"STARTTLS"))
986				foundit=1;
987			}
988		while (mbuf_len>3 && mbuf[0]!='.');
989		(void)BIO_flush(fbio);
990		BIO_pop(fbio);
991		BIO_free(fbio);
992		if (!foundit)
993			BIO_printf(bio_err,
994				   "didn't found STARTTLS in server response,"
995				   " try anyway...\n");
996		BIO_printf(sbio,". STARTTLS\r\n");
997		BIO_read(sbio,sbuf,BUFSIZZ);
998		}
999	else if (starttls_proto == PROTO_FTP)
1000		{
1001		BIO *fbio = BIO_new(BIO_f_buffer());
1002		BIO_push(fbio, sbio);
1003		/* wait for multi-line response to end from FTP */
1004		do
1005			{
1006			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1007			}
1008		while (mbuf_len>3 && mbuf[3]=='-');
1009		(void)BIO_flush(fbio);
1010		BIO_pop(fbio);
1011		BIO_free(fbio);
1012		BIO_printf(sbio,"AUTH TLS\r\n");
1013		BIO_read(sbio,sbuf,BUFSIZZ);
1014		}
1015	if (starttls_proto == PROTO_XMPP)
1016		{
1017		int seen = 0;
1018		BIO_printf(sbio,"<stream:stream "
1019		    "xmlns:stream='http://etherx.jabber.org/streams' "
1020		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1021		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1022		mbuf[seen] = 0;
1023		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1024			{
1025			if (strstr(mbuf, "/stream:features>"))
1026				goto shut;
1027			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1028			mbuf[seen] = 0;
1029			}
1030		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1031		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1032		sbuf[seen] = 0;
1033		if (!strstr(sbuf, "<proceed"))
1034			goto shut;
1035		mbuf[0] = 0;
1036		}
1037
1038	for (;;)
1039		{
1040		FD_ZERO(&readfds);
1041		FD_ZERO(&writefds);
1042
1043		if ((SSL_version(con) == DTLS1_VERSION) &&
1044			DTLSv1_get_timeout(con, &timeout))
1045			timeoutp = &timeout;
1046		else
1047			timeoutp = NULL;
1048
1049		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1050			{
1051			in_init=1;
1052			tty_on=0;
1053			}
1054		else
1055			{
1056			tty_on=1;
1057			if (in_init)
1058				{
1059				in_init=0;
1060				if (sess_out)
1061					{
1062					BIO *stmp = BIO_new_file(sess_out, "w");
1063					if (stmp)
1064						{
1065						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1066						BIO_free(stmp);
1067						}
1068					else
1069						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1070					}
1071				print_stuff(bio_c_out,con,full_log);
1072				if (full_log > 0) full_log--;
1073
1074				if (starttls_proto)
1075					{
1076					BIO_printf(bio_err,"%s",mbuf);
1077					/* We don't need to know any more */
1078					starttls_proto = PROTO_OFF;
1079					}
1080
1081				if (reconnect)
1082					{
1083					reconnect--;
1084					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1085					SSL_shutdown(con);
1086					SSL_set_connect_state(con);
1087					SHUTDOWN(SSL_get_fd(con));
1088					goto re_start;
1089					}
1090				}
1091			}
1092
1093		ssl_pending = read_ssl && SSL_pending(con);
1094
1095		if (!ssl_pending)
1096			{
1097#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
1098			if (tty_on)
1099				{
1100				if (read_tty)  FD_SET(fileno(stdin),&readfds);
1101				if (write_tty) FD_SET(fileno(stdout),&writefds);
1102				}
1103			if (read_ssl)
1104				FD_SET(SSL_get_fd(con),&readfds);
1105			if (write_ssl)
1106				FD_SET(SSL_get_fd(con),&writefds);
1107#else
1108			if(!tty_on || !write_tty) {
1109				if (read_ssl)
1110					FD_SET(SSL_get_fd(con),&readfds);
1111				if (write_ssl)
1112					FD_SET(SSL_get_fd(con),&writefds);
1113			}
1114#endif
1115/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1116				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1117
1118			/* Note: under VMS with SOCKETSHR the second parameter
1119			 * is currently of type (int *) whereas under other
1120			 * systems it is (void *) if you don't have a cast it
1121			 * will choke the compiler: if you do have a cast then
1122			 * you can either go for (int *) or (void *).
1123			 */
1124#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1125                        /* Under Windows/DOS we make the assumption that we can
1126			 * always write to the tty: therefore if we need to
1127			 * write to the tty we just fall through. Otherwise
1128			 * we timeout the select every second and see if there
1129			 * are any keypresses. Note: this is a hack, in a proper
1130			 * Windows application we wouldn't do this.
1131			 */
1132			i=0;
1133			if(!write_tty) {
1134				if(read_tty) {
1135					tv.tv_sec = 1;
1136					tv.tv_usec = 0;
1137					i=select(width,(void *)&readfds,(void *)&writefds,
1138						 NULL,&tv);
1139#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1140					if(!i && (!_kbhit() || !read_tty) ) continue;
1141#else
1142					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1143#endif
1144				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1145					 NULL,timeoutp);
1146			}
1147#elif defined(OPENSSL_SYS_NETWARE)
1148			if(!write_tty) {
1149				if(read_tty) {
1150					tv.tv_sec = 1;
1151					tv.tv_usec = 0;
1152					i=select(width,(void *)&readfds,(void *)&writefds,
1153						NULL,&tv);
1154				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1155					NULL,timeoutp);
1156			}
1157#else
1158			i=select(width,(void *)&readfds,(void *)&writefds,
1159				 NULL,timeoutp);
1160#endif
1161			if ( i < 0)
1162				{
1163				BIO_printf(bio_err,"bad select %d\n",
1164				get_last_socket_error());
1165				goto shut;
1166				/* goto end; */
1167				}
1168			}
1169
1170		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1171			{
1172			BIO_printf(bio_err,"TIMEOUT occured\n");
1173			}
1174
1175		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1176			{
1177			k=SSL_write(con,&(cbuf[cbuf_off]),
1178				(unsigned int)cbuf_len);
1179			switch (SSL_get_error(con,k))
1180				{
1181			case SSL_ERROR_NONE:
1182				cbuf_off+=k;
1183				cbuf_len-=k;
1184				if (k <= 0) goto end;
1185				/* we have done a  write(con,NULL,0); */
1186				if (cbuf_len <= 0)
1187					{
1188					read_tty=1;
1189					write_ssl=0;
1190					}
1191				else /* if (cbuf_len > 0) */
1192					{
1193					read_tty=0;
1194					write_ssl=1;
1195					}
1196				break;
1197			case SSL_ERROR_WANT_WRITE:
1198				BIO_printf(bio_c_out,"write W BLOCK\n");
1199				write_ssl=1;
1200				read_tty=0;
1201				break;
1202			case SSL_ERROR_WANT_READ:
1203				BIO_printf(bio_c_out,"write R BLOCK\n");
1204				write_tty=0;
1205				read_ssl=1;
1206				write_ssl=0;
1207				break;
1208			case SSL_ERROR_WANT_X509_LOOKUP:
1209				BIO_printf(bio_c_out,"write X BLOCK\n");
1210				break;
1211			case SSL_ERROR_ZERO_RETURN:
1212				if (cbuf_len != 0)
1213					{
1214					BIO_printf(bio_c_out,"shutdown\n");
1215					goto shut;
1216					}
1217				else
1218					{
1219					read_tty=1;
1220					write_ssl=0;
1221					break;
1222					}
1223
1224			case SSL_ERROR_SYSCALL:
1225				if ((k != 0) || (cbuf_len != 0))
1226					{
1227					BIO_printf(bio_err,"write:errno=%d\n",
1228						get_last_socket_error());
1229					goto shut;
1230					}
1231				else
1232					{
1233					read_tty=1;
1234					write_ssl=0;
1235					}
1236				break;
1237			case SSL_ERROR_SSL:
1238				ERR_print_errors(bio_err);
1239				goto shut;
1240				}
1241			}
1242#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
1243		/* Assume Windows/DOS can always write */
1244		else if (!ssl_pending && write_tty)
1245#else
1246		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1247#endif
1248			{
1249#ifdef CHARSET_EBCDIC
1250			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1251#endif
1252			i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
1253
1254			if (i <= 0)
1255				{
1256				BIO_printf(bio_c_out,"DONE\n");
1257				goto shut;
1258				/* goto end; */
1259				}
1260
1261			sbuf_len-=i;;
1262			sbuf_off+=i;
1263			if (sbuf_len <= 0)
1264				{
1265				read_ssl=1;
1266				write_tty=0;
1267				}
1268			}
1269		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1270			{
1271#ifdef RENEG
1272{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1273#endif
1274#if 1
1275			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1276#else
1277/* Demo for pending and peek :-) */
1278			k=SSL_read(con,sbuf,16);
1279{ char zbuf[10240];
1280printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1281}
1282#endif
1283
1284			switch (SSL_get_error(con,k))
1285				{
1286			case SSL_ERROR_NONE:
1287				if (k <= 0)
1288					goto end;
1289				sbuf_off=0;
1290				sbuf_len=k;
1291
1292				read_ssl=0;
1293				write_tty=1;
1294				break;
1295			case SSL_ERROR_WANT_WRITE:
1296				BIO_printf(bio_c_out,"read W BLOCK\n");
1297				write_ssl=1;
1298				read_tty=0;
1299				break;
1300			case SSL_ERROR_WANT_READ:
1301				BIO_printf(bio_c_out,"read R BLOCK\n");
1302				write_tty=0;
1303				read_ssl=1;
1304				if ((read_tty == 0) && (write_ssl == 0))
1305					write_ssl=1;
1306				break;
1307			case SSL_ERROR_WANT_X509_LOOKUP:
1308				BIO_printf(bio_c_out,"read X BLOCK\n");
1309				break;
1310			case SSL_ERROR_SYSCALL:
1311				BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error());
1312				goto shut;
1313			case SSL_ERROR_ZERO_RETURN:
1314				BIO_printf(bio_c_out,"closed\n");
1315				goto shut;
1316			case SSL_ERROR_SSL:
1317				ERR_print_errors(bio_err);
1318				goto shut;
1319				/* break; */
1320				}
1321			}
1322
1323#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1324#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1325		else if (_kbhit())
1326#else
1327		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1328#endif
1329#elif defined (OPENSSL_SYS_NETWARE)
1330        else if (_kbhit())
1331#else
1332		else if (FD_ISSET(fileno(stdin),&readfds))
1333#endif
1334			{
1335			if (crlf)
1336				{
1337				int j, lf_num;
1338
1339				i=read(fileno(stdin),cbuf,BUFSIZZ/2);
1340				lf_num = 0;
1341				/* both loops are skipped when i <= 0 */
1342				for (j = 0; j < i; j++)
1343					if (cbuf[j] == '\n')
1344						lf_num++;
1345				for (j = i-1; j >= 0; j--)
1346					{
1347					cbuf[j+lf_num] = cbuf[j];
1348					if (cbuf[j] == '\n')
1349						{
1350						lf_num--;
1351						i++;
1352						cbuf[j+lf_num] = '\r';
1353						}
1354					}
1355				assert(lf_num == 0);
1356				}
1357			else
1358				i=read(fileno(stdin),cbuf,BUFSIZZ);
1359
1360			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1361				{
1362				BIO_printf(bio_err,"DONE\n");
1363				goto shut;
1364				}
1365
1366			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1367				{
1368				BIO_printf(bio_err,"RENEGOTIATING\n");
1369				SSL_renegotiate(con);
1370				cbuf_len=0;
1371				}
1372			else
1373				{
1374				cbuf_len=i;
1375				cbuf_off=0;
1376#ifdef CHARSET_EBCDIC
1377				ebcdic2ascii(cbuf, cbuf, i);
1378#endif
1379				}
1380
1381			write_ssl=1;
1382			read_tty=0;
1383			}
1384		}
1385shut:
1386	SSL_shutdown(con);
1387	SHUTDOWN(SSL_get_fd(con));
1388	ret=0;
1389end:
1390	if(prexit) print_stuff(bio_c_out,con,1);
1391	if (con != NULL) SSL_free(con);
1392	if (con2 != NULL) SSL_free(con2);
1393	if (ctx != NULL) SSL_CTX_free(ctx);
1394	if (cert)
1395		X509_free(cert);
1396	if (key)
1397		EVP_PKEY_free(key);
1398	if (pass)
1399		OPENSSL_free(pass);
1400	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1401	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1402	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1403	if (bio_c_out != NULL)
1404		{
1405		BIO_free(bio_c_out);
1406		bio_c_out=NULL;
1407		}
1408	apps_shutdown();
1409	OPENSSL_EXIT(ret);
1410	}
1411
1412
1413static void print_stuff(BIO *bio, SSL *s, int full)
1414	{
1415	X509 *peer=NULL;
1416	char *p;
1417	static const char *space="                ";
1418	char buf[BUFSIZ];
1419	STACK_OF(X509) *sk;
1420	STACK_OF(X509_NAME) *sk2;
1421	SSL_CIPHER *c;
1422	X509_NAME *xn;
1423	int j,i;
1424#ifndef OPENSSL_NO_COMP
1425	const COMP_METHOD *comp, *expansion;
1426#endif
1427
1428	if (full)
1429		{
1430		int got_a_chain = 0;
1431
1432		sk=SSL_get_peer_cert_chain(s);
1433		if (sk != NULL)
1434			{
1435			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1436
1437			BIO_printf(bio,"---\nCertificate chain\n");
1438			for (i=0; i<sk_X509_num(sk); i++)
1439				{
1440				X509_NAME_oneline(X509_get_subject_name(
1441					sk_X509_value(sk,i)),buf,sizeof buf);
1442				BIO_printf(bio,"%2d s:%s\n",i,buf);
1443				X509_NAME_oneline(X509_get_issuer_name(
1444					sk_X509_value(sk,i)),buf,sizeof buf);
1445				BIO_printf(bio,"   i:%s\n",buf);
1446				if (c_showcerts)
1447					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1448				}
1449			}
1450
1451		BIO_printf(bio,"---\n");
1452		peer=SSL_get_peer_certificate(s);
1453		if (peer != NULL)
1454			{
1455			BIO_printf(bio,"Server certificate\n");
1456			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1457				PEM_write_bio_X509(bio,peer);
1458			X509_NAME_oneline(X509_get_subject_name(peer),
1459				buf,sizeof buf);
1460			BIO_printf(bio,"subject=%s\n",buf);
1461			X509_NAME_oneline(X509_get_issuer_name(peer),
1462				buf,sizeof buf);
1463			BIO_printf(bio,"issuer=%s\n",buf);
1464			}
1465		else
1466			BIO_printf(bio,"no peer certificate available\n");
1467
1468		sk2=SSL_get_client_CA_list(s);
1469		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
1470			{
1471			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
1472			for (i=0; i<sk_X509_NAME_num(sk2); i++)
1473				{
1474				xn=sk_X509_NAME_value(sk2,i);
1475				X509_NAME_oneline(xn,buf,sizeof(buf));
1476				BIO_write(bio,buf,strlen(buf));
1477				BIO_write(bio,"\n",1);
1478				}
1479			}
1480		else
1481			{
1482			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
1483			}
1484		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
1485		if (p != NULL)
1486			{
1487			/* This works only for SSL 2.  In later protocol
1488			 * versions, the client does not know what other
1489			 * ciphers (in addition to the one to be used
1490			 * in the current connection) the server supports. */
1491
1492			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
1493			j=i=0;
1494			while (*p)
1495				{
1496				if (*p == ':')
1497					{
1498					BIO_write(bio,space,15-j%25);
1499					i++;
1500					j=0;
1501					BIO_write(bio,((i%3)?" ":"\n"),1);
1502					}
1503				else
1504					{
1505					BIO_write(bio,p,1);
1506					j++;
1507					}
1508				p++;
1509				}
1510			BIO_write(bio,"\n",1);
1511			}
1512
1513		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
1514			BIO_number_read(SSL_get_rbio(s)),
1515			BIO_number_written(SSL_get_wbio(s)));
1516		}
1517	BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
1518	c=SSL_get_current_cipher(s);
1519	BIO_printf(bio,"%s, Cipher is %s\n",
1520		SSL_CIPHER_get_version(c),
1521		SSL_CIPHER_get_name(c));
1522	if (peer != NULL) {
1523		EVP_PKEY *pktmp;
1524		pktmp = X509_get_pubkey(peer);
1525		BIO_printf(bio,"Server public key is %d bit\n",
1526							 EVP_PKEY_bits(pktmp));
1527		EVP_PKEY_free(pktmp);
1528	}
1529	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
1530			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
1531#ifndef OPENSSL_NO_COMP
1532	comp=SSL_get_current_compression(s);
1533	expansion=SSL_get_current_expansion(s);
1534	BIO_printf(bio,"Compression: %s\n",
1535		comp ? SSL_COMP_get_name(comp) : "NONE");
1536	BIO_printf(bio,"Expansion: %s\n",
1537		expansion ? SSL_COMP_get_name(expansion) : "NONE");
1538#endif
1539	SSL_SESSION_print(bio,SSL_get_session(s));
1540	BIO_printf(bio,"---\n");
1541	if (peer != NULL)
1542		X509_free(peer);
1543	/* flush, or debugging output gets mixed with http response */
1544	(void)BIO_flush(bio);
1545	}
1546
1547#ifndef OPENSSL_NO_TLSEXT
1548
1549static int ocsp_resp_cb(SSL *s, void *arg)
1550	{
1551	const unsigned char *p;
1552	int len;
1553	OCSP_RESPONSE *rsp;
1554	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1555	BIO_puts(arg, "OCSP response: ");
1556	if (!p)
1557		{
1558		BIO_puts(arg, "no response sent\n");
1559		return 1;
1560		}
1561	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
1562	if (!rsp)
1563		{
1564		BIO_puts(arg, "response parse error\n");
1565		BIO_dump_indent(arg, (char *)p, len, 4);
1566		return 0;
1567		}
1568	BIO_puts(arg, "\n======================================\n");
1569	OCSP_RESPONSE_print(arg, rsp, 0);
1570	BIO_puts(arg, "======================================\n");
1571	OCSP_RESPONSE_free(rsp);
1572	return 1;
1573	}
1574#endif  /* ndef OPENSSL_NO_TLSEXT */
1575