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