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