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