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