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