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