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," -verify_return_error - return verification errors\n");
294	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
295	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
296	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
297	BIO_printf(bio_err,"                 not specified but cert file is.\n");
298	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
299	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
300	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
301	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
302	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
303	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
304	BIO_printf(bio_err," -prexit       - print session information even on connection failure\n");
305	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
306	BIO_printf(bio_err," -debug        - extra output\n");
307#ifdef WATT32
308	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
309#endif
310	BIO_printf(bio_err," -msg          - Show protocol messages\n");
311	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
312	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
313#ifdef FIONBIO
314	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
315#endif
316	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
317	BIO_printf(bio_err," -quiet        - no s_client output\n");
318	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
319	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
320#ifndef OPENSSL_NO_PSK
321	BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
322	BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
323# ifndef OPENSSL_NO_JPAKE
324	BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
325# endif
326#endif
327#ifndef OPENSSL_NO_SRP
328	BIO_printf(bio_err," -srpuser user     - SRP authentification for 'user'\n");
329	BIO_printf(bio_err," -srppass arg      - password for 'user'\n");
330	BIO_printf(bio_err," -srp_lateuser     - SRP username into second ClientHello message\n");
331	BIO_printf(bio_err," -srp_moregroups   - Tolerate other than the known g N values.\n");
332	BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
333#endif
334	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
335	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
336	BIO_printf(bio_err," -tls1_2       - just use TLSv1.2\n");
337	BIO_printf(bio_err," -tls1_1       - just use TLSv1.1\n");
338	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
339	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
340	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
341	BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
342	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
343	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
344	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
345	BIO_printf(bio_err,"                 command to see what is available\n");
346	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
347	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
348	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
349	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
350	BIO_printf(bio_err,"                 are supported.\n");
351#ifndef OPENSSL_NO_ENGINE
352	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
353#endif
354	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
355	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
356	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
357#ifndef OPENSSL_NO_TLSEXT
358	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
359	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
360	BIO_printf(bio_err," -status           - request certificate status from server\n");
361	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
362# ifndef OPENSSL_NO_NEXTPROTONEG
363	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
364# endif
365#endif
366	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
367#ifndef OPENSSL_NO_SRTP
368	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
369#endif
370 	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
371 	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
372	}
373
374#ifndef OPENSSL_NO_TLSEXT
375
376/* This is a context that we pass to callbacks */
377typedef struct tlsextctx_st {
378   BIO * biodebug;
379   int ack;
380} tlsextctx;
381
382
383static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
384	{
385	tlsextctx * p = (tlsextctx *) arg;
386	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
387	if (SSL_get_servername_type(s) != -1)
388 	        p->ack = !SSL_session_reused(s) && hn != NULL;
389	else
390		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
391
392	return SSL_TLSEXT_ERR_OK;
393	}
394
395#ifndef OPENSSL_NO_SRP
396
397/* This is a context that we pass to all callbacks */
398typedef struct srp_arg_st
399	{
400	char *srppassin;
401	char *srplogin;
402	int msg;   /* copy from c_msg */
403	int debug; /* copy from c_debug */
404	int amp;   /* allow more groups */
405	int strength /* minimal size for N */ ;
406	} SRP_ARG;
407
408#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
409
410static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
411	{
412	BN_CTX *bn_ctx = BN_CTX_new();
413	BIGNUM *p = BN_new();
414	BIGNUM *r = BN_new();
415	int ret =
416		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
417		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
418		p != NULL && BN_rshift1(p, N) &&
419
420		/* p = (N-1)/2 */
421		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
422		r != NULL &&
423
424		/* verify g^((N-1)/2) == -1 (mod N) */
425		BN_mod_exp(r, g, p, N, bn_ctx) &&
426		BN_add_word(r, 1) &&
427		BN_cmp(r, N) == 0;
428
429	if(r)
430		BN_free(r);
431	if(p)
432		BN_free(p);
433	if(bn_ctx)
434		BN_CTX_free(bn_ctx);
435	return ret;
436	}
437
438/* This callback is used here for two purposes:
439   - extended debugging
440   - making some primality tests for unknown groups
441   The callback is only called for a non default group.
442
443   An application does not need the call back at all if
444   only the stanard groups are used.  In real life situations,
445   client and server already share well known groups,
446   thus there is no need to verify them.
447   Furthermore, in case that a server actually proposes a group that
448   is not one of those defined in RFC 5054, it is more appropriate
449   to add the group to a static list and then compare since
450   primality tests are rather cpu consuming.
451*/
452
453static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
454	{
455	SRP_ARG *srp_arg = (SRP_ARG *)arg;
456	BIGNUM *N = NULL, *g = NULL;
457	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
458		return 0;
459	if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
460		{
461    		BIO_printf(bio_err, "SRP parameters:\n");
462		BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
463		BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
464		BIO_printf(bio_err,"\n");
465		}
466
467	if (SRP_check_known_gN_param(g,N))
468		return 1;
469
470	if (srp_arg->amp == 1)
471		{
472		if (srp_arg->debug)
473			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
474
475/* The srp_moregroups is a real debugging feature.
476   Implementors should rather add the value to the known ones.
477   The minimal size has already been tested.
478*/
479		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
480			return 1;
481		}
482	BIO_printf(bio_err, "SRP param N and g rejected.\n");
483	return 0;
484	}
485
486#define PWD_STRLEN 1024
487
488static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
489	{
490	SRP_ARG *srp_arg = (SRP_ARG *)arg;
491	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
492	PW_CB_DATA cb_tmp;
493	int l;
494
495	cb_tmp.password = (char *)srp_arg->srppassin;
496	cb_tmp.prompt_info = "SRP user";
497	if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
498		{
499		BIO_printf (bio_err, "Can't read Password\n");
500		OPENSSL_free(pass);
501		return NULL;
502		}
503	*(pass+l)= '\0';
504
505	return pass;
506	}
507
508#endif
509#ifndef OPENSSL_NO_SRTP
510	char *srtp_profiles = NULL;
511#endif
512
513# ifndef OPENSSL_NO_NEXTPROTONEG
514/* This the context that we pass to next_proto_cb */
515typedef struct tlsextnextprotoctx_st {
516	unsigned char *data;
517	unsigned short len;
518	int status;
519} tlsextnextprotoctx;
520
521static tlsextnextprotoctx next_proto;
522
523static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
524	{
525	tlsextnextprotoctx *ctx = arg;
526
527	if (!c_quiet)
528		{
529		/* We can assume that |in| is syntactically valid. */
530		unsigned i;
531		BIO_printf(bio_c_out, "Protocols advertised by server: ");
532		for (i = 0; i < inlen; )
533			{
534			if (i)
535				BIO_write(bio_c_out, ", ", 2);
536			BIO_write(bio_c_out, &in[i + 1], in[i]);
537			i += in[i] + 1;
538			}
539		BIO_write(bio_c_out, "\n", 1);
540		}
541
542	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
543	return SSL_TLSEXT_ERR_OK;
544	}
545# endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
546#endif
547
548enum
549{
550	PROTO_OFF	= 0,
551	PROTO_SMTP,
552	PROTO_POP3,
553	PROTO_IMAP,
554	PROTO_FTP,
555	PROTO_XMPP
556};
557
558int MAIN(int, char **);
559
560int MAIN(int argc, char **argv)
561	{
562	unsigned int off=0, clr=0;
563	SSL *con=NULL;
564#ifndef OPENSSL_NO_KRB5
565	KSSL_CTX *kctx;
566#endif
567	int s,k,width,state=0;
568	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
569	int cbuf_len,cbuf_off;
570	int sbuf_len,sbuf_off;
571	fd_set readfds,writefds;
572	int fdin, fdout;
573	short port=PORT;
574	int full_log=1;
575	char *host=SSL_HOST_NAME;
576	char *cert_file=NULL,*key_file=NULL;
577	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
578	char *passarg = NULL, *pass = NULL;
579	X509 *cert = NULL;
580	EVP_PKEY *key = NULL;
581	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
582	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
583	int crlf=0;
584	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
585	SSL_CTX *ctx=NULL;
586	int ret=1,in_init=1,i,nbio_test=0;
587	int starttls_proto = PROTO_OFF;
588	int prexit = 0;
589	X509_VERIFY_PARAM *vpm = NULL;
590	int badarg = 0;
591	const SSL_METHOD *meth=NULL;
592	int socket_type=SOCK_STREAM;
593	BIO *sbio;
594	char *inrand=NULL;
595	int mbuf_len=0;
596	struct timeval timeout, *timeoutp;
597#ifndef OPENSSL_NO_ENGINE
598	char *engine_id=NULL;
599	char *ssl_client_engine_id=NULL;
600	ENGINE *ssl_client_engine=NULL;
601#endif
602	ENGINE *e=NULL;
603#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
604	struct timeval tv;
605#if defined(OPENSSL_SYS_BEOS_R5)
606	int stdin_set = 0;
607#endif
608#endif
609#ifndef OPENSSL_NO_TLSEXT
610	char *servername = NULL;
611        tlsextctx tlsextcbp =
612        {NULL,0};
613# ifndef OPENSSL_NO_NEXTPROTONEG
614	const char *next_proto_neg_in = NULL;
615# endif
616#endif
617	char *sess_in = NULL;
618	char *sess_out = NULL;
619	struct sockaddr peer;
620	int peerlen = sizeof(peer);
621	int enable_timeouts = 0 ;
622	long socket_mtu = 0;
623#ifndef OPENSSL_NO_JPAKE
624	char *jpake_secret = NULL;
625#endif
626#ifndef OPENSSL_NO_SRP
627	char * srppass = NULL;
628	int srp_lateuser = 0;
629	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
630#endif
631
632	meth=SSLv23_client_method();
633
634	apps_startup();
635	c_Pause=0;
636	c_quiet=0;
637	c_ign_eof=0;
638	c_debug=0;
639	c_msg=0;
640	c_showcerts=0;
641
642	if (bio_err == NULL)
643		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
644
645	if (!load_config(bio_err, NULL))
646		goto end;
647
648	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
649		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
650		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
651		{
652		BIO_printf(bio_err,"out of memory\n");
653		goto end;
654		}
655
656	verify_depth=0;
657	verify_error=X509_V_OK;
658#ifdef FIONBIO
659	c_nbio=0;
660#endif
661
662	argc--;
663	argv++;
664	while (argc >= 1)
665		{
666		if	(strcmp(*argv,"-host") == 0)
667			{
668			if (--argc < 1) goto bad;
669			host= *(++argv);
670			}
671		else if	(strcmp(*argv,"-port") == 0)
672			{
673			if (--argc < 1) goto bad;
674			port=atoi(*(++argv));
675			if (port == 0) goto bad;
676			}
677		else if (strcmp(*argv,"-connect") == 0)
678			{
679			if (--argc < 1) goto bad;
680			if (!extract_host_port(*(++argv),&host,NULL,&port))
681				goto bad;
682			}
683		else if	(strcmp(*argv,"-verify") == 0)
684			{
685			verify=SSL_VERIFY_PEER;
686			if (--argc < 1) goto bad;
687			verify_depth=atoi(*(++argv));
688			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
689			}
690		else if	(strcmp(*argv,"-cert") == 0)
691			{
692			if (--argc < 1) goto bad;
693			cert_file= *(++argv);
694			}
695		else if	(strcmp(*argv,"-sess_out") == 0)
696			{
697			if (--argc < 1) goto bad;
698			sess_out = *(++argv);
699			}
700		else if	(strcmp(*argv,"-sess_in") == 0)
701			{
702			if (--argc < 1) goto bad;
703			sess_in = *(++argv);
704			}
705		else if	(strcmp(*argv,"-certform") == 0)
706			{
707			if (--argc < 1) goto bad;
708			cert_format = str2fmt(*(++argv));
709			}
710		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
711			{
712			if (badarg)
713				goto bad;
714			continue;
715			}
716		else if (strcmp(*argv,"-verify_return_error") == 0)
717			verify_return_error = 1;
718		else if	(strcmp(*argv,"-prexit") == 0)
719			prexit=1;
720		else if	(strcmp(*argv,"-crlf") == 0)
721			crlf=1;
722		else if	(strcmp(*argv,"-quiet") == 0)
723			{
724			c_quiet=1;
725			c_ign_eof=1;
726			}
727		else if	(strcmp(*argv,"-ign_eof") == 0)
728			c_ign_eof=1;
729		else if	(strcmp(*argv,"-no_ign_eof") == 0)
730			c_ign_eof=0;
731		else if	(strcmp(*argv,"-pause") == 0)
732			c_Pause=1;
733		else if	(strcmp(*argv,"-debug") == 0)
734			c_debug=1;
735#ifndef OPENSSL_NO_TLSEXT
736		else if	(strcmp(*argv,"-tlsextdebug") == 0)
737			c_tlsextdebug=1;
738		else if	(strcmp(*argv,"-status") == 0)
739			c_status_req=1;
740#endif
741#ifdef WATT32
742		else if (strcmp(*argv,"-wdebug") == 0)
743			dbug_init();
744#endif
745		else if	(strcmp(*argv,"-msg") == 0)
746			c_msg=1;
747		else if	(strcmp(*argv,"-showcerts") == 0)
748			c_showcerts=1;
749		else if	(strcmp(*argv,"-nbio_test") == 0)
750			nbio_test=1;
751		else if	(strcmp(*argv,"-state") == 0)
752			state=1;
753#ifndef OPENSSL_NO_PSK
754                else if (strcmp(*argv,"-psk_identity") == 0)
755			{
756			if (--argc < 1) goto bad;
757			psk_identity=*(++argv);
758			}
759                else if (strcmp(*argv,"-psk") == 0)
760			{
761                        size_t j;
762
763			if (--argc < 1) goto bad;
764			psk_key=*(++argv);
765			for (j = 0; j < strlen(psk_key); j++)
766                                {
767                                if (isxdigit((unsigned char)psk_key[j]))
768                                        continue;
769                                BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
770                                goto bad;
771                                }
772			}
773#endif
774#ifndef OPENSSL_NO_SRP
775		else if (strcmp(*argv,"-srpuser") == 0)
776			{
777			if (--argc < 1) goto bad;
778			srp_arg.srplogin= *(++argv);
779			meth=TLSv1_client_method();
780			}
781		else if (strcmp(*argv,"-srppass") == 0)
782			{
783			if (--argc < 1) goto bad;
784			srppass= *(++argv);
785			meth=TLSv1_client_method();
786			}
787		else if (strcmp(*argv,"-srp_strength") == 0)
788			{
789			if (--argc < 1) goto bad;
790			srp_arg.strength=atoi(*(++argv));
791			BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
792			meth=TLSv1_client_method();
793			}
794		else if (strcmp(*argv,"-srp_lateuser") == 0)
795			{
796			srp_lateuser= 1;
797			meth=TLSv1_client_method();
798			}
799		else if	(strcmp(*argv,"-srp_moregroups") == 0)
800			{
801			srp_arg.amp=1;
802			meth=TLSv1_client_method();
803			}
804#endif
805#ifndef OPENSSL_NO_SSL2
806		else if	(strcmp(*argv,"-ssl2") == 0)
807			meth=SSLv2_client_method();
808#endif
809#ifndef OPENSSL_NO_SSL3
810		else if	(strcmp(*argv,"-ssl3") == 0)
811			meth=SSLv3_client_method();
812#endif
813#ifndef OPENSSL_NO_TLS1
814		else if	(strcmp(*argv,"-tls1_2") == 0)
815			meth=TLSv1_2_client_method();
816		else if	(strcmp(*argv,"-tls1_1") == 0)
817			meth=TLSv1_1_client_method();
818		else if	(strcmp(*argv,"-tls1") == 0)
819			meth=TLSv1_client_method();
820#endif
821#ifndef OPENSSL_NO_DTLS1
822		else if	(strcmp(*argv,"-dtls1") == 0)
823			{
824			meth=DTLSv1_client_method();
825			socket_type=SOCK_DGRAM;
826			}
827		else if (strcmp(*argv,"-timeout") == 0)
828			enable_timeouts=1;
829		else if (strcmp(*argv,"-mtu") == 0)
830			{
831			if (--argc < 1) goto bad;
832			socket_mtu = atol(*(++argv));
833			}
834#endif
835		else if (strcmp(*argv,"-bugs") == 0)
836			bugs=1;
837		else if	(strcmp(*argv,"-keyform") == 0)
838			{
839			if (--argc < 1) goto bad;
840			key_format = str2fmt(*(++argv));
841			}
842		else if	(strcmp(*argv,"-pass") == 0)
843			{
844			if (--argc < 1) goto bad;
845			passarg = *(++argv);
846			}
847		else if	(strcmp(*argv,"-key") == 0)
848			{
849			if (--argc < 1) goto bad;
850			key_file= *(++argv);
851			}
852		else if	(strcmp(*argv,"-reconnect") == 0)
853			{
854			reconnect=5;
855			}
856		else if	(strcmp(*argv,"-CApath") == 0)
857			{
858			if (--argc < 1) goto bad;
859			CApath= *(++argv);
860			}
861		else if	(strcmp(*argv,"-CAfile") == 0)
862			{
863			if (--argc < 1) goto bad;
864			CAfile= *(++argv);
865			}
866		else if (strcmp(*argv,"-no_tls1_2") == 0)
867			off|=SSL_OP_NO_TLSv1_2;
868		else if (strcmp(*argv,"-no_tls1_1") == 0)
869			off|=SSL_OP_NO_TLSv1_1;
870		else if (strcmp(*argv,"-no_tls1") == 0)
871			off|=SSL_OP_NO_TLSv1;
872		else if (strcmp(*argv,"-no_ssl3") == 0)
873			off|=SSL_OP_NO_SSLv3;
874		else if (strcmp(*argv,"-no_ssl2") == 0)
875			off|=SSL_OP_NO_SSLv2;
876		else if	(strcmp(*argv,"-no_comp") == 0)
877			{ off|=SSL_OP_NO_COMPRESSION; }
878#ifndef OPENSSL_NO_TLSEXT
879		else if	(strcmp(*argv,"-no_ticket") == 0)
880			{ off|=SSL_OP_NO_TICKET; }
881# ifndef OPENSSL_NO_NEXTPROTONEG
882		else if (strcmp(*argv,"-nextprotoneg") == 0)
883			{
884			if (--argc < 1) goto bad;
885			next_proto_neg_in = *(++argv);
886			}
887# endif
888#endif
889		else if (strcmp(*argv,"-serverpref") == 0)
890			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
891		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
892			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
893		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
894			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
895		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
896			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
897		else if	(strcmp(*argv,"-cipher") == 0)
898			{
899			if (--argc < 1) goto bad;
900			cipher= *(++argv);
901			}
902#ifdef FIONBIO
903		else if (strcmp(*argv,"-nbio") == 0)
904			{ c_nbio=1; }
905#endif
906		else if	(strcmp(*argv,"-starttls") == 0)
907			{
908			if (--argc < 1) goto bad;
909			++argv;
910			if (strcmp(*argv,"smtp") == 0)
911				starttls_proto = PROTO_SMTP;
912			else if (strcmp(*argv,"pop3") == 0)
913				starttls_proto = PROTO_POP3;
914			else if (strcmp(*argv,"imap") == 0)
915				starttls_proto = PROTO_IMAP;
916			else if (strcmp(*argv,"ftp") == 0)
917				starttls_proto = PROTO_FTP;
918			else if (strcmp(*argv, "xmpp") == 0)
919				starttls_proto = PROTO_XMPP;
920			else
921				goto bad;
922			}
923#ifndef OPENSSL_NO_ENGINE
924		else if	(strcmp(*argv,"-engine") == 0)
925			{
926			if (--argc < 1) goto bad;
927			engine_id = *(++argv);
928			}
929		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
930			{
931			if (--argc < 1) goto bad;
932			ssl_client_engine_id = *(++argv);
933			}
934#endif
935		else if (strcmp(*argv,"-rand") == 0)
936			{
937			if (--argc < 1) goto bad;
938			inrand= *(++argv);
939			}
940#ifndef OPENSSL_NO_TLSEXT
941		else if (strcmp(*argv,"-servername") == 0)
942			{
943			if (--argc < 1) goto bad;
944			servername= *(++argv);
945			/* meth=TLSv1_client_method(); */
946			}
947#endif
948#ifndef OPENSSL_NO_JPAKE
949		else if (strcmp(*argv,"-jpake") == 0)
950			{
951			if (--argc < 1) goto bad;
952			jpake_secret = *++argv;
953			}
954#endif
955#ifndef OPENSSL_NO_SRTP
956		else if (strcmp(*argv,"-use_srtp") == 0)
957			{
958			if (--argc < 1) goto bad;
959			srtp_profiles = *(++argv);
960			}
961#endif
962		else if (strcmp(*argv,"-keymatexport") == 0)
963			{
964			if (--argc < 1) goto bad;
965			keymatexportlabel= *(++argv);
966			}
967		else if (strcmp(*argv,"-keymatexportlen") == 0)
968			{
969			if (--argc < 1) goto bad;
970			keymatexportlen=atoi(*(++argv));
971			if (keymatexportlen == 0) goto bad;
972			}
973                else
974			{
975			BIO_printf(bio_err,"unknown option %s\n",*argv);
976			badop=1;
977			break;
978			}
979		argc--;
980		argv++;
981		}
982	if (badop)
983		{
984bad:
985		sc_usage();
986		goto end;
987		}
988
989#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
990	if (jpake_secret)
991		{
992		if (psk_key)
993			{
994			BIO_printf(bio_err,
995				   "Can't use JPAKE and PSK together\n");
996			goto end;
997			}
998		psk_identity = "JPAKE";
999		if (cipher)
1000			{
1001			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1002			goto end;
1003			}
1004		cipher = "PSK";
1005		}
1006#endif
1007
1008	OpenSSL_add_ssl_algorithms();
1009	SSL_load_error_strings();
1010
1011#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1012	next_proto.status = -1;
1013	if (next_proto_neg_in)
1014		{
1015		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1016		if (next_proto.data == NULL)
1017			{
1018			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1019			goto end;
1020			}
1021		}
1022	else
1023		next_proto.data = NULL;
1024#endif
1025
1026#ifndef OPENSSL_NO_ENGINE
1027        e = setup_engine(bio_err, engine_id, 1);
1028	if (ssl_client_engine_id)
1029		{
1030		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1031		if (!ssl_client_engine)
1032			{
1033			BIO_printf(bio_err,
1034					"Error getting client auth engine\n");
1035			goto end;
1036			}
1037		}
1038
1039#endif
1040	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1041		{
1042		BIO_printf(bio_err, "Error getting password\n");
1043		goto end;
1044		}
1045
1046	if (key_file == NULL)
1047		key_file = cert_file;
1048
1049
1050	if (key_file)
1051
1052		{
1053
1054		key = load_key(bio_err, key_file, key_format, 0, pass, e,
1055			       "client certificate private key file");
1056		if (!key)
1057			{
1058			ERR_print_errors(bio_err);
1059			goto end;
1060			}
1061
1062		}
1063
1064	if (cert_file)
1065
1066		{
1067		cert = load_cert(bio_err,cert_file,cert_format,
1068				NULL, e, "client certificate file");
1069
1070		if (!cert)
1071			{
1072			ERR_print_errors(bio_err);
1073			goto end;
1074			}
1075		}
1076
1077	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1078		&& !RAND_status())
1079		{
1080		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1081		}
1082	if (inrand != NULL)
1083		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1084			app_RAND_load_files(inrand));
1085
1086	if (bio_c_out == NULL)
1087		{
1088		if (c_quiet && !c_debug && !c_msg)
1089			{
1090			bio_c_out=BIO_new(BIO_s_null());
1091			}
1092		else
1093			{
1094			if (bio_c_out == NULL)
1095				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1096			}
1097		}
1098
1099#ifndef OPENSSL_NO_SRP
1100	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1101		{
1102		BIO_printf(bio_err, "Error getting password\n");
1103		goto end;
1104		}
1105#endif
1106
1107	ctx=SSL_CTX_new(meth);
1108	if (ctx == NULL)
1109		{
1110		ERR_print_errors(bio_err);
1111		goto end;
1112		}
1113
1114	if (vpm)
1115		SSL_CTX_set1_param(ctx, vpm);
1116
1117#ifndef OPENSSL_NO_ENGINE
1118	if (ssl_client_engine)
1119		{
1120		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1121			{
1122			BIO_puts(bio_err, "Error setting client auth engine\n");
1123			ERR_print_errors(bio_err);
1124			ENGINE_free(ssl_client_engine);
1125			goto end;
1126			}
1127		ENGINE_free(ssl_client_engine);
1128		}
1129#endif
1130
1131#ifndef OPENSSL_NO_PSK
1132#ifdef OPENSSL_NO_JPAKE
1133	if (psk_key != NULL)
1134#else
1135	if (psk_key != NULL || jpake_secret)
1136#endif
1137		{
1138		if (c_debug)
1139			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
1140		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1141		}
1142#endif
1143#ifndef OPENSSL_NO_SRTP
1144	if (srtp_profiles != NULL)
1145		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1146#endif
1147	if (bugs)
1148		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1149	else
1150		SSL_CTX_set_options(ctx,off);
1151
1152	if (clr)
1153		SSL_CTX_clear_options(ctx, clr);
1154	/* DTLS: partial reads end up discarding unread UDP bytes :-(
1155	 * Setting read ahead solves this problem.
1156	 */
1157	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1158
1159#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1160	if (next_proto.data)
1161		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1162#endif
1163
1164	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1165	if (cipher != NULL)
1166		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1167		BIO_printf(bio_err,"error setting cipher list\n");
1168		ERR_print_errors(bio_err);
1169		goto end;
1170	}
1171#if 0
1172	else
1173		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1174#endif
1175
1176	SSL_CTX_set_verify(ctx,verify,verify_callback);
1177	if (!set_cert_key_stuff(ctx,cert,key))
1178		goto end;
1179
1180	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1181		(!SSL_CTX_set_default_verify_paths(ctx)))
1182		{
1183		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
1184		ERR_print_errors(bio_err);
1185		/* goto end; */
1186		}
1187
1188#ifndef OPENSSL_NO_TLSEXT
1189	if (servername != NULL)
1190		{
1191		tlsextcbp.biodebug = bio_err;
1192		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1193		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1194		}
1195#ifndef OPENSSL_NO_SRP
1196        if (srp_arg.srplogin)
1197		{
1198		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
1199			{
1200			BIO_printf(bio_err,"Unable to set SRP username\n");
1201			goto end;
1202			}
1203		srp_arg.msg = c_msg;
1204		srp_arg.debug = c_debug ;
1205		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1206		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1207		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1208		if (c_msg || c_debug || srp_arg.amp == 0)
1209			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1210		}
1211
1212#endif
1213#endif
1214
1215	con=SSL_new(ctx);
1216	if (sess_in)
1217		{
1218		SSL_SESSION *sess;
1219		BIO *stmp = BIO_new_file(sess_in, "r");
1220		if (!stmp)
1221			{
1222			BIO_printf(bio_err, "Can't open session file %s\n",
1223						sess_in);
1224			ERR_print_errors(bio_err);
1225			goto end;
1226			}
1227		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1228		BIO_free(stmp);
1229		if (!sess)
1230			{
1231			BIO_printf(bio_err, "Can't open session file %s\n",
1232						sess_in);
1233			ERR_print_errors(bio_err);
1234			goto end;
1235			}
1236		SSL_set_session(con, sess);
1237		SSL_SESSION_free(sess);
1238		}
1239#ifndef OPENSSL_NO_TLSEXT
1240	if (servername != NULL)
1241		{
1242		if (!SSL_set_tlsext_host_name(con,servername))
1243			{
1244			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1245			ERR_print_errors(bio_err);
1246			goto end;
1247			}
1248		}
1249#endif
1250#ifndef OPENSSL_NO_KRB5
1251	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
1252                {
1253		SSL_set0_kssl_ctx(con, kctx);
1254                kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1255		}
1256#endif	/* OPENSSL_NO_KRB5  */
1257/*	SSL_set_cipher_list(con,"RC4-MD5"); */
1258#if 0
1259#ifdef TLSEXT_TYPE_opaque_prf_input
1260	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1261#endif
1262#endif
1263
1264re_start:
1265
1266	if (init_client(&s,host,port,socket_type) == 0)
1267		{
1268		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1269		SHUTDOWN(s);
1270		goto end;
1271		}
1272	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1273
1274#ifdef FIONBIO
1275	if (c_nbio)
1276		{
1277		unsigned long l=1;
1278		BIO_printf(bio_c_out,"turning on non blocking io\n");
1279		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1280			{
1281			ERR_print_errors(bio_err);
1282			goto end;
1283			}
1284		}
1285#endif
1286	if (c_Pause & 0x01) SSL_set_debug(con, 1);
1287
1288	if ( SSL_version(con) == DTLS1_VERSION)
1289		{
1290
1291		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1292		if (getsockname(s, &peer, (void *)&peerlen) < 0)
1293			{
1294			BIO_printf(bio_err, "getsockname:errno=%d\n",
1295				get_last_socket_error());
1296			SHUTDOWN(s);
1297			goto end;
1298			}
1299
1300		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
1301
1302		if (enable_timeouts)
1303			{
1304			timeout.tv_sec = 0;
1305			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1306			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1307
1308			timeout.tv_sec = 0;
1309			timeout.tv_usec = DGRAM_SND_TIMEOUT;
1310			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1311			}
1312
1313		if (socket_mtu > 28)
1314			{
1315			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1316			SSL_set_mtu(con, socket_mtu - 28);
1317			}
1318		else
1319			/* want to do MTU discovery */
1320			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1321		}
1322	else
1323		sbio=BIO_new_socket(s,BIO_NOCLOSE);
1324
1325	if (nbio_test)
1326		{
1327		BIO *test;
1328
1329		test=BIO_new(BIO_f_nbio_test());
1330		sbio=BIO_push(test,sbio);
1331		}
1332
1333	if (c_debug)
1334		{
1335		SSL_set_debug(con, 1);
1336		BIO_set_callback(sbio,bio_dump_callback);
1337		BIO_set_callback_arg(sbio,(char *)bio_c_out);
1338		}
1339	if (c_msg)
1340		{
1341		SSL_set_msg_callback(con, msg_cb);
1342		SSL_set_msg_callback_arg(con, bio_c_out);
1343		}
1344#ifndef OPENSSL_NO_TLSEXT
1345	if (c_tlsextdebug)
1346		{
1347		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1348		SSL_set_tlsext_debug_arg(con, bio_c_out);
1349		}
1350	if (c_status_req)
1351		{
1352		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1353		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1354		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1355#if 0
1356{
1357STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1358OCSP_RESPID *id = OCSP_RESPID_new();
1359id->value.byKey = ASN1_OCTET_STRING_new();
1360id->type = V_OCSP_RESPID_KEY;
1361ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1362sk_OCSP_RESPID_push(ids, id);
1363SSL_set_tlsext_status_ids(con, ids);
1364}
1365#endif
1366		}
1367#endif
1368#ifndef OPENSSL_NO_JPAKE
1369	if (jpake_secret)
1370		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1371#endif
1372
1373	SSL_set_bio(con,sbio,sbio);
1374	SSL_set_connect_state(con);
1375
1376	/* ok, lets connect */
1377	width=SSL_get_fd(con)+1;
1378
1379	read_tty=1;
1380	write_tty=0;
1381	tty_on=0;
1382	read_ssl=1;
1383	write_ssl=1;
1384
1385	cbuf_len=0;
1386	cbuf_off=0;
1387	sbuf_len=0;
1388	sbuf_off=0;
1389
1390	/* This is an ugly hack that does a lot of assumptions */
1391	/* We do have to handle multi-line responses which may come
1392 	   in a single packet or not. We therefore have to use
1393	   BIO_gets() which does need a buffering BIO. So during
1394	   the initial chitchat we do push a buffering BIO into the
1395	   chain that is removed again later on to not disturb the
1396	   rest of the s_client operation. */
1397	if (starttls_proto == PROTO_SMTP)
1398		{
1399		int foundit=0;
1400		BIO *fbio = BIO_new(BIO_f_buffer());
1401		BIO_push(fbio, sbio);
1402		/* wait for multi-line response to end from SMTP */
1403		do
1404			{
1405			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1406			}
1407		while (mbuf_len>3 && mbuf[3]=='-');
1408		/* STARTTLS command requires EHLO... */
1409		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1410		(void)BIO_flush(fbio);
1411		/* wait for multi-line response to end EHLO SMTP response */
1412		do
1413			{
1414			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1415			if (strstr(mbuf,"STARTTLS"))
1416				foundit=1;
1417			}
1418		while (mbuf_len>3 && mbuf[3]=='-');
1419		(void)BIO_flush(fbio);
1420		BIO_pop(fbio);
1421		BIO_free(fbio);
1422		if (!foundit)
1423			BIO_printf(bio_err,
1424				   "didn't found starttls in server response,"
1425				   " try anyway...\n");
1426		BIO_printf(sbio,"STARTTLS\r\n");
1427		BIO_read(sbio,sbuf,BUFSIZZ);
1428		}
1429	else if (starttls_proto == PROTO_POP3)
1430		{
1431		BIO_read(sbio,mbuf,BUFSIZZ);
1432		BIO_printf(sbio,"STLS\r\n");
1433		BIO_read(sbio,sbuf,BUFSIZZ);
1434		}
1435	else if (starttls_proto == PROTO_IMAP)
1436		{
1437		int foundit=0;
1438		BIO *fbio = BIO_new(BIO_f_buffer());
1439		BIO_push(fbio, sbio);
1440		BIO_gets(fbio,mbuf,BUFSIZZ);
1441		/* STARTTLS command requires CAPABILITY... */
1442		BIO_printf(fbio,". CAPABILITY\r\n");
1443		(void)BIO_flush(fbio);
1444		/* wait for multi-line CAPABILITY response */
1445		do
1446			{
1447			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1448			if (strstr(mbuf,"STARTTLS"))
1449				foundit=1;
1450			}
1451		while (mbuf_len>3 && mbuf[0]!='.');
1452		(void)BIO_flush(fbio);
1453		BIO_pop(fbio);
1454		BIO_free(fbio);
1455		if (!foundit)
1456			BIO_printf(bio_err,
1457				   "didn't found STARTTLS in server response,"
1458				   " try anyway...\n");
1459		BIO_printf(sbio,". STARTTLS\r\n");
1460		BIO_read(sbio,sbuf,BUFSIZZ);
1461		}
1462	else if (starttls_proto == PROTO_FTP)
1463		{
1464		BIO *fbio = BIO_new(BIO_f_buffer());
1465		BIO_push(fbio, sbio);
1466		/* wait for multi-line response to end from FTP */
1467		do
1468			{
1469			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1470			}
1471		while (mbuf_len>3 && mbuf[3]=='-');
1472		(void)BIO_flush(fbio);
1473		BIO_pop(fbio);
1474		BIO_free(fbio);
1475		BIO_printf(sbio,"AUTH TLS\r\n");
1476		BIO_read(sbio,sbuf,BUFSIZZ);
1477		}
1478	if (starttls_proto == PROTO_XMPP)
1479		{
1480		int seen = 0;
1481		BIO_printf(sbio,"<stream:stream "
1482		    "xmlns:stream='http://etherx.jabber.org/streams' "
1483		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1484		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1485		mbuf[seen] = 0;
1486		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1487			{
1488			if (strstr(mbuf, "/stream:features>"))
1489				goto shut;
1490			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1491			mbuf[seen] = 0;
1492			}
1493		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1494		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1495		sbuf[seen] = 0;
1496		if (!strstr(sbuf, "<proceed"))
1497			goto shut;
1498		mbuf[0] = 0;
1499		}
1500
1501	for (;;)
1502		{
1503		FD_ZERO(&readfds);
1504		FD_ZERO(&writefds);
1505		fdin = fileno(stdin);
1506		if (fdin < 0)
1507			{
1508			BIO_printf(bio_err,"bad fileno for stdin\n");
1509			goto shut;
1510			}
1511		fdout = fileno(stdout);
1512		if (fdout < 0)
1513			{
1514			BIO_printf(bio_err,"bad fileno for stdout\n");
1515			goto shut;
1516			}
1517
1518		if ((SSL_version(con) == DTLS1_VERSION) &&
1519			DTLSv1_get_timeout(con, &timeout))
1520			timeoutp = &timeout;
1521		else
1522			timeoutp = NULL;
1523
1524		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1525			{
1526			in_init=1;
1527			tty_on=0;
1528			}
1529		else
1530			{
1531			tty_on=1;
1532			if (in_init)
1533				{
1534				in_init=0;
1535#if 0 /* This test doesn't really work as intended (needs to be fixed) */
1536#ifndef OPENSSL_NO_TLSEXT
1537				if (servername != NULL && !SSL_session_reused(con))
1538					{
1539					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1540					}
1541#endif
1542#endif
1543				if (sess_out)
1544					{
1545					BIO *stmp = BIO_new_file(sess_out, "w");
1546					if (stmp)
1547						{
1548						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1549						BIO_free(stmp);
1550						}
1551					else
1552						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1553					}
1554				print_stuff(bio_c_out,con,full_log);
1555				if (full_log > 0) full_log--;
1556
1557				if (starttls_proto)
1558					{
1559					BIO_printf(bio_err,"%s",mbuf);
1560					/* We don't need to know any more */
1561					starttls_proto = PROTO_OFF;
1562					}
1563
1564				if (reconnect)
1565					{
1566					reconnect--;
1567					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1568					SSL_shutdown(con);
1569					SSL_set_connect_state(con);
1570					SHUTDOWN(SSL_get_fd(con));
1571					goto re_start;
1572					}
1573				}
1574			}
1575
1576		ssl_pending = read_ssl && SSL_pending(con);
1577
1578		if (!ssl_pending)
1579			{
1580#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1581			if (tty_on)
1582				{
1583				if (read_tty)  openssl_fdset(fdin,&readfds);
1584				if (write_tty) openssl_fdset(fdout,&writefds);
1585				}
1586			if (read_ssl)
1587				openssl_fdset(SSL_get_fd(con),&readfds);
1588			if (write_ssl)
1589				openssl_fdset(SSL_get_fd(con),&writefds);
1590#else
1591			if(!tty_on || !write_tty) {
1592				if (read_ssl)
1593					openssl_fdset(SSL_get_fd(con),&readfds);
1594				if (write_ssl)
1595					openssl_fdset(SSL_get_fd(con),&writefds);
1596			}
1597#endif
1598/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1599				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1600
1601			/* Note: under VMS with SOCKETSHR the second parameter
1602			 * is currently of type (int *) whereas under other
1603			 * systems it is (void *) if you don't have a cast it
1604			 * will choke the compiler: if you do have a cast then
1605			 * you can either go for (int *) or (void *).
1606			 */
1607#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1608                        /* Under Windows/DOS we make the assumption that we can
1609			 * always write to the tty: therefore if we need to
1610			 * write to the tty we just fall through. Otherwise
1611			 * we timeout the select every second and see if there
1612			 * are any keypresses. Note: this is a hack, in a proper
1613			 * Windows application we wouldn't do this.
1614			 */
1615			i=0;
1616			if(!write_tty) {
1617				if(read_tty) {
1618					tv.tv_sec = 1;
1619					tv.tv_usec = 0;
1620					i=select(width,(void *)&readfds,(void *)&writefds,
1621						 NULL,&tv);
1622#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1623					if(!i && (!_kbhit() || !read_tty) ) continue;
1624#else
1625					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1626#endif
1627				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1628					 NULL,timeoutp);
1629			}
1630#elif defined(OPENSSL_SYS_NETWARE)
1631			if(!write_tty) {
1632				if(read_tty) {
1633					tv.tv_sec = 1;
1634					tv.tv_usec = 0;
1635					i=select(width,(void *)&readfds,(void *)&writefds,
1636						NULL,&tv);
1637				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1638					NULL,timeoutp);
1639			}
1640#elif defined(OPENSSL_SYS_BEOS_R5)
1641			/* Under BeOS-R5 the situation is similar to DOS */
1642			i=0;
1643			stdin_set = 0;
1644			(void)fcntl(fdin, F_SETFL, O_NONBLOCK);
1645			if(!write_tty) {
1646				if(read_tty) {
1647					tv.tv_sec = 1;
1648					tv.tv_usec = 0;
1649					i=select(width,(void *)&readfds,(void *)&writefds,
1650						 NULL,&tv);
1651					if (read(fdin, sbuf, 0) >= 0)
1652						stdin_set = 1;
1653					if (!i && (stdin_set != 1 || !read_tty))
1654						continue;
1655				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1656					 NULL,timeoutp);
1657			}
1658			(void)fcntl(fdin, F_SETFL, 0);
1659#else
1660			i=select(width,(void *)&readfds,(void *)&writefds,
1661				 NULL,timeoutp);
1662#endif
1663			if ( i < 0)
1664				{
1665				BIO_printf(bio_err,"bad select %d\n",
1666				get_last_socket_error());
1667				goto shut;
1668				/* goto end; */
1669				}
1670			}
1671
1672		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1673			{
1674			BIO_printf(bio_err,"TIMEOUT occured\n");
1675			}
1676
1677		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1678			{
1679			k=SSL_write(con,&(cbuf[cbuf_off]),
1680				(unsigned int)cbuf_len);
1681			switch (SSL_get_error(con,k))
1682				{
1683			case SSL_ERROR_NONE:
1684				cbuf_off+=k;
1685				cbuf_len-=k;
1686				if (k <= 0) goto end;
1687				/* we have done a  write(con,NULL,0); */
1688				if (cbuf_len <= 0)
1689					{
1690					read_tty=1;
1691					write_ssl=0;
1692					}
1693				else /* if (cbuf_len > 0) */
1694					{
1695					read_tty=0;
1696					write_ssl=1;
1697					}
1698				break;
1699			case SSL_ERROR_WANT_WRITE:
1700				BIO_printf(bio_c_out,"write W BLOCK\n");
1701				write_ssl=1;
1702				read_tty=0;
1703				break;
1704			case SSL_ERROR_WANT_READ:
1705				BIO_printf(bio_c_out,"write R BLOCK\n");
1706				write_tty=0;
1707				read_ssl=1;
1708				write_ssl=0;
1709				break;
1710			case SSL_ERROR_WANT_X509_LOOKUP:
1711				BIO_printf(bio_c_out,"write X BLOCK\n");
1712				break;
1713			case SSL_ERROR_ZERO_RETURN:
1714				if (cbuf_len != 0)
1715					{
1716					BIO_printf(bio_c_out,"shutdown\n");
1717					ret = 0;
1718					goto shut;
1719					}
1720				else
1721					{
1722					read_tty=1;
1723					write_ssl=0;
1724					break;
1725					}
1726
1727			case SSL_ERROR_SYSCALL:
1728				if ((k != 0) || (cbuf_len != 0))
1729					{
1730					BIO_printf(bio_err,"write:errno=%d\n",
1731						get_last_socket_error());
1732					goto shut;
1733					}
1734				else
1735					{
1736					read_tty=1;
1737					write_ssl=0;
1738					}
1739				break;
1740			case SSL_ERROR_SSL:
1741				ERR_print_errors(bio_err);
1742				goto shut;
1743				}
1744			}
1745#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1746		/* Assume Windows/DOS/BeOS can always write */
1747		else if (!ssl_pending && write_tty)
1748#else
1749		else if (!ssl_pending && FD_ISSET(fdout,&writefds))
1750#endif
1751			{
1752#ifdef CHARSET_EBCDIC
1753			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1754#endif
1755			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
1756
1757			if (i <= 0)
1758				{
1759				BIO_printf(bio_c_out,"DONE\n");
1760				ret = 0;
1761				goto shut;
1762				/* goto end; */
1763				}
1764
1765			sbuf_len-=i;;
1766			sbuf_off+=i;
1767			if (sbuf_len <= 0)
1768				{
1769				read_ssl=1;
1770				write_tty=0;
1771				}
1772			}
1773		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1774			{
1775#ifdef RENEG
1776{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1777#endif
1778#if 1
1779			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1780#else
1781/* Demo for pending and peek :-) */
1782			k=SSL_read(con,sbuf,16);
1783{ char zbuf[10240];
1784printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1785}
1786#endif
1787
1788			switch (SSL_get_error(con,k))
1789				{
1790			case SSL_ERROR_NONE:
1791				if (k <= 0)
1792					goto end;
1793				sbuf_off=0;
1794				sbuf_len=k;
1795
1796				read_ssl=0;
1797				write_tty=1;
1798				break;
1799			case SSL_ERROR_WANT_WRITE:
1800				BIO_printf(bio_c_out,"read W BLOCK\n");
1801				write_ssl=1;
1802				read_tty=0;
1803				break;
1804			case SSL_ERROR_WANT_READ:
1805				BIO_printf(bio_c_out,"read R BLOCK\n");
1806				write_tty=0;
1807				read_ssl=1;
1808				if ((read_tty == 0) && (write_ssl == 0))
1809					write_ssl=1;
1810				break;
1811			case SSL_ERROR_WANT_X509_LOOKUP:
1812				BIO_printf(bio_c_out,"read X BLOCK\n");
1813				break;
1814			case SSL_ERROR_SYSCALL:
1815				ret=get_last_socket_error();
1816				BIO_printf(bio_err,"read:errno=%d\n",ret);
1817				goto shut;
1818			case SSL_ERROR_ZERO_RETURN:
1819				BIO_printf(bio_c_out,"closed\n");
1820				ret=0;
1821				goto shut;
1822			case SSL_ERROR_SSL:
1823				ERR_print_errors(bio_err);
1824				goto shut;
1825				/* break; */
1826				}
1827			}
1828
1829#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1830#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1831		else if (_kbhit())
1832#else
1833		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1834#endif
1835#elif defined (OPENSSL_SYS_NETWARE)
1836		else if (_kbhit())
1837#elif defined(OPENSSL_SYS_BEOS_R5)
1838		else if (stdin_set)
1839#else
1840		else if (FD_ISSET(fdin,&readfds))
1841#endif
1842			{
1843			if (crlf)
1844				{
1845				int j, lf_num;
1846
1847				i=raw_read_stdin(cbuf,BUFSIZZ/2);
1848				lf_num = 0;
1849				/* both loops are skipped when i <= 0 */
1850				for (j = 0; j < i; j++)
1851					if (cbuf[j] == '\n')
1852						lf_num++;
1853				for (j = i-1; j >= 0; j--)
1854					{
1855					cbuf[j+lf_num] = cbuf[j];
1856					if (cbuf[j] == '\n')
1857						{
1858						lf_num--;
1859						i++;
1860						cbuf[j+lf_num] = '\r';
1861						}
1862					}
1863				assert(lf_num == 0);
1864				}
1865			else
1866				i=raw_read_stdin(cbuf,BUFSIZZ);
1867
1868			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1869				{
1870				BIO_printf(bio_err,"DONE\n");
1871				ret=0;
1872				goto shut;
1873				}
1874
1875			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1876				{
1877				BIO_printf(bio_err,"RENEGOTIATING\n");
1878				SSL_renegotiate(con);
1879				cbuf_len=0;
1880				}
1881#ifndef OPENSSL_NO_HEARTBEATS
1882			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
1883 				{
1884				BIO_printf(bio_err,"HEARTBEATING\n");
1885				SSL_heartbeat(con);
1886				cbuf_len=0;
1887				}
1888#endif
1889			else
1890				{
1891				cbuf_len=i;
1892				cbuf_off=0;
1893#ifdef CHARSET_EBCDIC
1894				ebcdic2ascii(cbuf, cbuf, i);
1895#endif
1896				}
1897
1898			write_ssl=1;
1899			read_tty=0;
1900			}
1901		}
1902
1903	ret=0;
1904shut:
1905	if (in_init)
1906		print_stuff(bio_c_out,con,full_log);
1907	SSL_shutdown(con);
1908	SHUTDOWN(SSL_get_fd(con));
1909end:
1910	if (con != NULL)
1911		{
1912		if (prexit != 0)
1913			print_stuff(bio_c_out,con,1);
1914		SSL_free(con);
1915		}
1916#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1917	if (next_proto.data)
1918		OPENSSL_free(next_proto.data);
1919#endif
1920	if (ctx != NULL) SSL_CTX_free(ctx);
1921	if (cert)
1922		X509_free(cert);
1923	if (key)
1924		EVP_PKEY_free(key);
1925	if (pass)
1926		OPENSSL_free(pass);
1927	if (vpm)
1928		X509_VERIFY_PARAM_free(vpm);
1929	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1930	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1931	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1932	if (bio_c_out != NULL)
1933		{
1934		BIO_free(bio_c_out);
1935		bio_c_out=NULL;
1936		}
1937	apps_shutdown();
1938	OPENSSL_EXIT(ret);
1939	}
1940
1941
1942static void print_stuff(BIO *bio, SSL *s, int full)
1943	{
1944	X509 *peer=NULL;
1945	char *p;
1946	static const char *space="                ";
1947	char buf[BUFSIZ];
1948	STACK_OF(X509) *sk;
1949	STACK_OF(X509_NAME) *sk2;
1950	const SSL_CIPHER *c;
1951	X509_NAME *xn;
1952	int j,i;
1953#ifndef OPENSSL_NO_COMP
1954	const COMP_METHOD *comp, *expansion;
1955#endif
1956	unsigned char *exportedkeymat;
1957
1958	if (full)
1959		{
1960		int got_a_chain = 0;
1961
1962		sk=SSL_get_peer_cert_chain(s);
1963		if (sk != NULL)
1964			{
1965			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1966
1967			BIO_printf(bio,"---\nCertificate chain\n");
1968			for (i=0; i<sk_X509_num(sk); i++)
1969				{
1970				X509_NAME_oneline(X509_get_subject_name(
1971					sk_X509_value(sk,i)),buf,sizeof buf);
1972				BIO_printf(bio,"%2d s:%s\n",i,buf);
1973				X509_NAME_oneline(X509_get_issuer_name(
1974					sk_X509_value(sk,i)),buf,sizeof buf);
1975				BIO_printf(bio,"   i:%s\n",buf);
1976				if (c_showcerts)
1977					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1978				}
1979			}
1980
1981		BIO_printf(bio,"---\n");
1982		peer=SSL_get_peer_certificate(s);
1983		if (peer != NULL)
1984			{
1985			BIO_printf(bio,"Server certificate\n");
1986			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1987				PEM_write_bio_X509(bio,peer);
1988			X509_NAME_oneline(X509_get_subject_name(peer),
1989				buf,sizeof buf);
1990			BIO_printf(bio,"subject=%s\n",buf);
1991			X509_NAME_oneline(X509_get_issuer_name(peer),
1992				buf,sizeof buf);
1993			BIO_printf(bio,"issuer=%s\n",buf);
1994			}
1995		else
1996			BIO_printf(bio,"no peer certificate available\n");
1997
1998		sk2=SSL_get_client_CA_list(s);
1999		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
2000			{
2001			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
2002			for (i=0; i<sk_X509_NAME_num(sk2); i++)
2003				{
2004				xn=sk_X509_NAME_value(sk2,i);
2005				X509_NAME_oneline(xn,buf,sizeof(buf));
2006				BIO_write(bio,buf,strlen(buf));
2007				BIO_write(bio,"\n",1);
2008				}
2009			}
2010		else
2011			{
2012			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2013			}
2014		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
2015		if (p != NULL)
2016			{
2017			/* This works only for SSL 2.  In later protocol
2018			 * versions, the client does not know what other
2019			 * ciphers (in addition to the one to be used
2020			 * in the current connection) the server supports. */
2021
2022			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2023			j=i=0;
2024			while (*p)
2025				{
2026				if (*p == ':')
2027					{
2028					BIO_write(bio,space,15-j%25);
2029					i++;
2030					j=0;
2031					BIO_write(bio,((i%3)?" ":"\n"),1);
2032					}
2033				else
2034					{
2035					BIO_write(bio,p,1);
2036					j++;
2037					}
2038				p++;
2039				}
2040			BIO_write(bio,"\n",1);
2041			}
2042
2043		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2044			BIO_number_read(SSL_get_rbio(s)),
2045			BIO_number_written(SSL_get_wbio(s)));
2046		}
2047	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
2048	c=SSL_get_current_cipher(s);
2049	BIO_printf(bio,"%s, Cipher is %s\n",
2050		SSL_CIPHER_get_version(c),
2051		SSL_CIPHER_get_name(c));
2052	if (peer != NULL) {
2053		EVP_PKEY *pktmp;
2054		pktmp = X509_get_pubkey(peer);
2055		BIO_printf(bio,"Server public key is %d bit\n",
2056							 EVP_PKEY_bits(pktmp));
2057		EVP_PKEY_free(pktmp);
2058	}
2059	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2060			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2061#ifndef OPENSSL_NO_COMP
2062	comp=SSL_get_current_compression(s);
2063	expansion=SSL_get_current_expansion(s);
2064	BIO_printf(bio,"Compression: %s\n",
2065		comp ? SSL_COMP_get_name(comp) : "NONE");
2066	BIO_printf(bio,"Expansion: %s\n",
2067		expansion ? SSL_COMP_get_name(expansion) : "NONE");
2068#endif
2069
2070#ifdef SSL_DEBUG
2071	{
2072	/* Print out local port of connection: useful for debugging */
2073	int sock;
2074	struct sockaddr_in ladd;
2075	socklen_t ladd_size = sizeof(ladd);
2076	sock = SSL_get_fd(s);
2077	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2078	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2079	}
2080#endif
2081
2082#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2083	if (next_proto.status != -1) {
2084		const unsigned char *proto;
2085		unsigned int proto_len;
2086		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2087		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2088		BIO_write(bio, proto, proto_len);
2089		BIO_write(bio, "\n", 1);
2090	}
2091#endif
2092
2093#ifndef OPENSSL_NO_SRTP
2094 	{
2095 	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2096
2097	if(srtp_profile)
2098		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2099			   srtp_profile->name);
2100	}
2101#endif
2102
2103	SSL_SESSION_print(bio,SSL_get_session(s));
2104	if (keymatexportlabel != NULL)
2105		{
2106		BIO_printf(bio, "Keying material exporter:\n");
2107		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2108		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2109		exportedkeymat = OPENSSL_malloc(keymatexportlen);
2110		if (exportedkeymat != NULL)
2111			{
2112			if (!SSL_export_keying_material(s, exportedkeymat,
2113						        keymatexportlen,
2114						        keymatexportlabel,
2115						        strlen(keymatexportlabel),
2116						        NULL, 0, 0))
2117				{
2118				BIO_printf(bio, "    Error\n");
2119				}
2120			else
2121				{
2122				BIO_printf(bio, "    Keying material: ");
2123				for (i=0; i<keymatexportlen; i++)
2124					BIO_printf(bio, "%02X",
2125						   exportedkeymat[i]);
2126				BIO_printf(bio, "\n");
2127				}
2128			OPENSSL_free(exportedkeymat);
2129			}
2130		}
2131	BIO_printf(bio,"---\n");
2132	if (peer != NULL)
2133		X509_free(peer);
2134	/* flush, or debugging output gets mixed with http response */
2135	(void)BIO_flush(bio);
2136	}
2137
2138#ifndef OPENSSL_NO_TLSEXT
2139
2140static int ocsp_resp_cb(SSL *s, void *arg)
2141	{
2142	const unsigned char *p;
2143	int len;
2144	OCSP_RESPONSE *rsp;
2145	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2146	BIO_puts(arg, "OCSP response: ");
2147	if (!p)
2148		{
2149		BIO_puts(arg, "no response sent\n");
2150		return 1;
2151		}
2152	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2153	if (!rsp)
2154		{
2155		BIO_puts(arg, "response parse error\n");
2156		BIO_dump_indent(arg, (char *)p, len, 4);
2157		return 0;
2158		}
2159	BIO_puts(arg, "\n======================================\n");
2160	OCSP_RESPONSE_print(arg, rsp, 0);
2161	BIO_puts(arg, "======================================\n");
2162	OCSP_RESPONSE_free(rsp);
2163	return 1;
2164	}
2165
2166#endif
2167