Home | History | Annotate | Download | only in apps
      1 /* apps/s_client.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 /* ====================================================================
    112  * Copyright 2005 Nokia. All rights reserved.
    113  *
    114  * The portions of the attached software ("Contribution") is developed by
    115  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
    116  * license.
    117  *
    118  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
    119  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
    120  * support (see RFC 4279) to OpenSSL.
    121  *
    122  * No patent licenses or other rights except those expressly stated in
    123  * the OpenSSL open source license shall be deemed granted or received
    124  * expressly, by implication, estoppel, or otherwise.
    125  *
    126  * No assurances are provided by Nokia that the Contribution does not
    127  * infringe the patent or other intellectual property rights of any third
    128  * party or that the license provides you with all the necessary rights
    129  * to make use of the Contribution.
    130  *
    131  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
    132  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
    133  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
    134  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
    135  * OTHERWISE.
    136  */
    137 
    138 #include <assert.h>
    139 #include <ctype.h>
    140 #include <stdio.h>
    141 #include <stdlib.h>
    142 #include <string.h>
    143 #include <openssl/e_os2.h>
    144 #ifdef OPENSSL_NO_STDIO
    145 #define APPS_WIN16
    146 #endif
    147 
    148 /* With IPv6, it looks like Digital has mixed up the proper order of
    149    recursive header file inclusion, resulting in the compiler complaining
    150    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
    151    is needed to have fileno() declared correctly...  So let's define u_int */
    152 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
    153 #define __U_INT
    154 typedef unsigned int u_int;
    155 #endif
    156 
    157 #define USE_SOCKETS
    158 #include "apps.h"
    159 #include <openssl/x509.h>
    160 #include <openssl/ssl.h>
    161 #include <openssl/err.h>
    162 #include <openssl/pem.h>
    163 #include <openssl/rand.h>
    164 #include <openssl/ocsp.h>
    165 #include <openssl/bn.h>
    166 #ifndef OPENSSL_NO_SRP
    167 #include <openssl/srp.h>
    168 #endif
    169 #include "s_apps.h"
    170 #include "timeouts.h"
    171 
    172 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
    173 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
    174 #undef FIONBIO
    175 #endif
    176 
    177 #if defined(OPENSSL_SYS_BEOS_R5)
    178 #include <fcntl.h>
    179 #endif
    180 
    181 #undef PROG
    182 #define PROG	s_client_main
    183 
    184 /*#define SSL_HOST_NAME	"www.netscape.com" */
    185 /*#define SSL_HOST_NAME	"193.118.187.102" */
    186 #define SSL_HOST_NAME	"localhost"
    187 
    188 /*#define TEST_CERT "client.pem" */ /* no default cert. */
    189 
    190 #undef BUFSIZZ
    191 #define BUFSIZZ 1024*8
    192 
    193 extern int verify_depth;
    194 extern int verify_error;
    195 extern int verify_return_error;
    196 
    197 #ifdef FIONBIO
    198 static int c_nbio=0;
    199 #endif
    200 static int c_Pause=0;
    201 static int c_debug=0;
    202 #ifndef OPENSSL_NO_TLSEXT
    203 static int c_tlsextdebug=0;
    204 static int c_status_req=0;
    205 #endif
    206 static int c_msg=0;
    207 static int c_showcerts=0;
    208 
    209 static char *keymatexportlabel=NULL;
    210 static int keymatexportlen=20;
    211 
    212 static void sc_usage(void);
    213 static void print_stuff(BIO *berr,SSL *con,int full);
    214 #ifndef OPENSSL_NO_TLSEXT
    215 static int ocsp_resp_cb(SSL *s, void *arg);
    216 #endif
    217 static BIO *bio_c_out=NULL;
    218 static int c_quiet=0;
    219 static int c_ign_eof=0;
    220 
    221 #ifndef OPENSSL_NO_PSK
    222 /* Default PSK identity and key */
    223 static char *psk_identity="Client_identity";
    224 /*char *psk_key=NULL;  by default PSK is not used */
    225 
    226 static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
    227 	unsigned int max_identity_len, unsigned char *psk,
    228 	unsigned int max_psk_len)
    229 	{
    230 	unsigned int psk_len = 0;
    231 	int ret;
    232         BIGNUM *bn=NULL;
    233 
    234 	if (c_debug)
    235 		BIO_printf(bio_c_out, "psk_client_cb\n");
    236 	if (!hint)
    237                 {
    238                 /* no ServerKeyExchange message*/
    239 		if (c_debug)
    240 			BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
    241                 }
    242         else if (c_debug)
    243 		BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
    244 
    245 	/* lookup PSK identity and PSK key based on the given identity hint here */
    246 	ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
    247 	if (ret < 0 || (unsigned int)ret > max_identity_len)
    248 		goto out_err;
    249 	if (c_debug)
    250 		BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
    251         ret=BN_hex2bn(&bn, psk_key);
    252         if (!ret)
    253                 {
    254                 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
    255                 if (bn)
    256                         BN_free(bn);
    257                 return 0;
    258                 }
    259 
    260         if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
    261                 {
    262                 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
    263                         max_psk_len, BN_num_bytes(bn));
    264                 BN_free(bn);
    265                 return 0;
    266                 }
    267 
    268         psk_len=BN_bn2bin(bn, psk);
    269         BN_free(bn);
    270         if (psk_len == 0)
    271                 goto out_err;
    272 
    273 	if (c_debug)
    274 		BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
    275 
    276         return psk_len;
    277  out_err:
    278 	if (c_debug)
    279 		BIO_printf(bio_err, "Error in PSK client callback\n");
    280         return 0;
    281 	}
    282 #endif
    283 
    284 static void sc_usage(void)
    285 	{
    286 	BIO_printf(bio_err,"usage: s_client args\n");
    287 	BIO_printf(bio_err,"\n");
    288 	BIO_printf(bio_err," -host host     - use -connect instead\n");
    289 	BIO_printf(bio_err," -port port     - use -connect instead\n");
    290 	BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
    291 
    292 	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
    293 	BIO_printf(bio_err," -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," -cutthrough       - enable 1-RTT full-handshake for strong ciphers\n");
    365 	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
    366 #ifndef OPENSSL_NO_SRTP
    367 	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
    368 #endif
    369  	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
    370  	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
    371 	}
    372 
    373 #ifndef OPENSSL_NO_TLSEXT
    374 
    375 /* This is a context that we pass to callbacks */
    376 typedef struct tlsextctx_st {
    377    BIO * biodebug;
    378    int ack;
    379 } tlsextctx;
    380 
    381 
    382 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
    383 	{
    384 	tlsextctx * p = (tlsextctx *) arg;
    385 	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
    386 	if (SSL_get_servername_type(s) != -1)
    387  	        p->ack = !SSL_session_reused(s) && hn != NULL;
    388 	else
    389 		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
    390 
    391 	return SSL_TLSEXT_ERR_OK;
    392 	}
    393 
    394 #ifndef OPENSSL_NO_SRP
    395 
    396 /* This is a context that we pass to all callbacks */
    397 typedef struct srp_arg_st
    398 	{
    399 	char *srppassin;
    400 	char *srplogin;
    401 	int msg;   /* copy from c_msg */
    402 	int debug; /* copy from c_debug */
    403 	int amp;   /* allow more groups */
    404 	int strength /* minimal size for N */ ;
    405 	} SRP_ARG;
    406 
    407 #define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
    408 
    409 static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
    410 	{
    411 	BN_CTX *bn_ctx = BN_CTX_new();
    412 	BIGNUM *p = BN_new();
    413 	BIGNUM *r = BN_new();
    414 	int ret =
    415 		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
    416 		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
    417 		p != NULL && BN_rshift1(p, N) &&
    418 
    419 		/* p = (N-1)/2 */
    420 		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
    421 		r != NULL &&
    422 
    423 		/* verify g^((N-1)/2) == -1 (mod N) */
    424 		BN_mod_exp(r, g, p, N, bn_ctx) &&
    425 		BN_add_word(r, 1) &&
    426 		BN_cmp(r, N) == 0;
    427 
    428 	if(r)
    429 		BN_free(r);
    430 	if(p)
    431 		BN_free(p);
    432 	if(bn_ctx)
    433 		BN_CTX_free(bn_ctx);
    434 	return ret;
    435 	}
    436 
    437 /* This callback is used here for two purposes:
    438    - extended debugging
    439    - making some primality tests for unknown groups
    440    The callback is only called for a non default group.
    441 
    442    An application does not need the call back at all if
    443    only the stanard groups are used.  In real life situations,
    444    client and server already share well known groups,
    445    thus there is no need to verify them.
    446    Furthermore, in case that a server actually proposes a group that
    447    is not one of those defined in RFC 5054, it is more appropriate
    448    to add the group to a static list and then compare since
    449    primality tests are rather cpu consuming.
    450 */
    451 
    452 static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
    453 	{
    454 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
    455 	BIGNUM *N = NULL, *g = NULL;
    456 	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
    457 		return 0;
    458 	if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
    459 		{
    460     		BIO_printf(bio_err, "SRP parameters:\n");
    461 		BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
    462 		BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
    463 		BIO_printf(bio_err,"\n");
    464 		}
    465 
    466 	if (SRP_check_known_gN_param(g,N))
    467 		return 1;
    468 
    469 	if (srp_arg->amp == 1)
    470 		{
    471 		if (srp_arg->debug)
    472 			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
    473 
    474 /* The srp_moregroups is a real debugging feature.
    475    Implementors should rather add the value to the known ones.
    476    The minimal size has already been tested.
    477 */
    478 		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
    479 			return 1;
    480 		}
    481 	BIO_printf(bio_err, "SRP param N and g rejected.\n");
    482 	return 0;
    483 	}
    484 
    485 #define PWD_STRLEN 1024
    486 
    487 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
    488 	{
    489 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
    490 	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
    491 	PW_CB_DATA cb_tmp;
    492 	int l;
    493 
    494 	cb_tmp.password = (char *)srp_arg->srppassin;
    495 	cb_tmp.prompt_info = "SRP user";
    496 	if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
    497 		{
    498 		BIO_printf (bio_err, "Can't read Password\n");
    499 		OPENSSL_free(pass);
    500 		return NULL;
    501 		}
    502 	*(pass+l)= '\0';
    503 
    504 	return pass;
    505 	}
    506 
    507 #endif
    508 #ifndef OPENSSL_NO_SRTP
    509 	char *srtp_profiles = NULL;
    510 #endif
    511 
    512 # ifndef OPENSSL_NO_NEXTPROTONEG
    513 /* This the context that we pass to next_proto_cb */
    514 typedef struct tlsextnextprotoctx_st {
    515 	unsigned char *data;
    516 	unsigned short len;
    517 	int status;
    518 } tlsextnextprotoctx;
    519 
    520 static tlsextnextprotoctx next_proto;
    521 
    522 static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
    523 	{
    524 	tlsextnextprotoctx *ctx = arg;
    525 
    526 	if (!c_quiet)
    527 		{
    528 		/* We can assume that |in| is syntactically valid. */
    529 		unsigned i;
    530 		BIO_printf(bio_c_out, "Protocols advertised by server: ");
    531 		for (i = 0; i < inlen; )
    532 			{
    533 			if (i)
    534 				BIO_write(bio_c_out, ", ", 2);
    535 			BIO_write(bio_c_out, &in[i + 1], in[i]);
    536 			i += in[i] + 1;
    537 			}
    538 		BIO_write(bio_c_out, "\n", 1);
    539 		}
    540 
    541 	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
    542 	return SSL_TLSEXT_ERR_OK;
    543 	}
    544 # endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
    545 #endif
    546 
    547 enum
    548 {
    549 	PROTO_OFF	= 0,
    550 	PROTO_SMTP,
    551 	PROTO_POP3,
    552 	PROTO_IMAP,
    553 	PROTO_FTP,
    554 	PROTO_XMPP
    555 };
    556 
    557 int MAIN(int, char **);
    558 
    559 int MAIN(int argc, char **argv)
    560 	{
    561 	unsigned int off=0, clr=0;
    562 	SSL *con=NULL;
    563 #ifndef OPENSSL_NO_KRB5
    564 	KSSL_CTX *kctx;
    565 #endif
    566 	int s,k,width,state=0;
    567 	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
    568 	int cbuf_len,cbuf_off;
    569 	int sbuf_len,sbuf_off;
    570 	fd_set readfds,writefds;
    571 	short port=PORT;
    572 	int full_log=1;
    573 	char *host=SSL_HOST_NAME;
    574 	char *cert_file=NULL,*key_file=NULL;
    575 	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
    576 	char *passarg = NULL, *pass = NULL;
    577 	X509 *cert = NULL;
    578 	EVP_PKEY *key = NULL;
    579 	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
    580 	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
    581 	int cutthrough=0;
    582 	int crlf=0;
    583 	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
    584 	SSL_CTX *ctx=NULL;
    585 	int ret=1,in_init=1,i,nbio_test=0;
    586 	int starttls_proto = PROTO_OFF;
    587 	int prexit = 0;
    588 	X509_VERIFY_PARAM *vpm = NULL;
    589 	int badarg = 0;
    590 	const SSL_METHOD *meth=NULL;
    591 	int socket_type=SOCK_STREAM;
    592 	BIO *sbio;
    593 	char *inrand=NULL;
    594 	int mbuf_len=0;
    595 	struct timeval timeout, *timeoutp;
    596 #ifndef OPENSSL_NO_ENGINE
    597 	char *engine_id=NULL;
    598 	char *ssl_client_engine_id=NULL;
    599 	ENGINE *ssl_client_engine=NULL;
    600 #endif
    601 	ENGINE *e=NULL;
    602 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
    603 	struct timeval tv;
    604 #if defined(OPENSSL_SYS_BEOS_R5)
    605 	int stdin_set = 0;
    606 #endif
    607 #endif
    608 #ifndef OPENSSL_NO_TLSEXT
    609 	char *servername = NULL;
    610         tlsextctx tlsextcbp =
    611         {NULL,0};
    612 # ifndef OPENSSL_NO_NEXTPROTONEG
    613 	const char *next_proto_neg_in = NULL;
    614 # endif
    615 #endif
    616 	char *sess_in = NULL;
    617 	char *sess_out = NULL;
    618 	struct sockaddr peer;
    619 	int peerlen = sizeof(peer);
    620 	int enable_timeouts = 0 ;
    621 	long socket_mtu = 0;
    622 #ifndef OPENSSL_NO_JPAKE
    623 	char *jpake_secret = NULL;
    624 #endif
    625 #ifndef OPENSSL_NO_SRP
    626 	char * srppass = NULL;
    627 	int srp_lateuser = 0;
    628 	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
    629 #endif
    630 
    631 	meth=SSLv23_client_method();
    632 
    633 	apps_startup();
    634 	c_Pause=0;
    635 	c_quiet=0;
    636 	c_ign_eof=0;
    637 	c_debug=0;
    638 	c_msg=0;
    639 	c_showcerts=0;
    640 
    641 	if (bio_err == NULL)
    642 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
    643 
    644 	if (!load_config(bio_err, NULL))
    645 		goto end;
    646 
    647 	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
    648 		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
    649 		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
    650 		{
    651 		BIO_printf(bio_err,"out of memory\n");
    652 		goto end;
    653 		}
    654 
    655 	verify_depth=0;
    656 	verify_error=X509_V_OK;
    657 #ifdef FIONBIO
    658 	c_nbio=0;
    659 #endif
    660 
    661 	argc--;
    662 	argv++;
    663 	while (argc >= 1)
    664 		{
    665 		if	(strcmp(*argv,"-host") == 0)
    666 			{
    667 			if (--argc < 1) goto bad;
    668 			host= *(++argv);
    669 			}
    670 		else if	(strcmp(*argv,"-port") == 0)
    671 			{
    672 			if (--argc < 1) goto bad;
    673 			port=atoi(*(++argv));
    674 			if (port == 0) goto bad;
    675 			}
    676 		else if (strcmp(*argv,"-connect") == 0)
    677 			{
    678 			if (--argc < 1) goto bad;
    679 			if (!extract_host_port(*(++argv),&host,NULL,&port))
    680 				goto bad;
    681 			}
    682 		else if	(strcmp(*argv,"-verify") == 0)
    683 			{
    684 			verify=SSL_VERIFY_PEER;
    685 			if (--argc < 1) goto bad;
    686 			verify_depth=atoi(*(++argv));
    687 			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
    688 			}
    689 		else if	(strcmp(*argv,"-cert") == 0)
    690 			{
    691 			if (--argc < 1) goto bad;
    692 			cert_file= *(++argv);
    693 			}
    694 		else if	(strcmp(*argv,"-sess_out") == 0)
    695 			{
    696 			if (--argc < 1) goto bad;
    697 			sess_out = *(++argv);
    698 			}
    699 		else if	(strcmp(*argv,"-sess_in") == 0)
    700 			{
    701 			if (--argc < 1) goto bad;
    702 			sess_in = *(++argv);
    703 			}
    704 		else if	(strcmp(*argv,"-certform") == 0)
    705 			{
    706 			if (--argc < 1) goto bad;
    707 			cert_format = str2fmt(*(++argv));
    708 			}
    709 		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
    710 			{
    711 			if (badarg)
    712 				goto bad;
    713 			continue;
    714 			}
    715 		else if (strcmp(*argv,"-verify_return_error") == 0)
    716 			verify_return_error = 1;
    717 		else if	(strcmp(*argv,"-prexit") == 0)
    718 			prexit=1;
    719 		else if	(strcmp(*argv,"-crlf") == 0)
    720 			crlf=1;
    721 		else if	(strcmp(*argv,"-quiet") == 0)
    722 			{
    723 			c_quiet=1;
    724 			c_ign_eof=1;
    725 			}
    726 		else if	(strcmp(*argv,"-ign_eof") == 0)
    727 			c_ign_eof=1;
    728 		else if	(strcmp(*argv,"-no_ign_eof") == 0)
    729 			c_ign_eof=0;
    730 		else if	(strcmp(*argv,"-pause") == 0)
    731 			c_Pause=1;
    732 		else if	(strcmp(*argv,"-debug") == 0)
    733 			c_debug=1;
    734 #ifndef OPENSSL_NO_TLSEXT
    735 		else if	(strcmp(*argv,"-tlsextdebug") == 0)
    736 			c_tlsextdebug=1;
    737 		else if	(strcmp(*argv,"-status") == 0)
    738 			c_status_req=1;
    739 #endif
    740 #ifdef WATT32
    741 		else if (strcmp(*argv,"-wdebug") == 0)
    742 			dbug_init();
    743 #endif
    744 		else if	(strcmp(*argv,"-msg") == 0)
    745 			c_msg=1;
    746 		else if	(strcmp(*argv,"-showcerts") == 0)
    747 			c_showcerts=1;
    748 		else if	(strcmp(*argv,"-nbio_test") == 0)
    749 			nbio_test=1;
    750 		else if	(strcmp(*argv,"-state") == 0)
    751 			state=1;
    752 #ifndef OPENSSL_NO_PSK
    753                 else if (strcmp(*argv,"-psk_identity") == 0)
    754 			{
    755 			if (--argc < 1) goto bad;
    756 			psk_identity=*(++argv);
    757 			}
    758                 else if (strcmp(*argv,"-psk") == 0)
    759 			{
    760                         size_t j;
    761 
    762 			if (--argc < 1) goto bad;
    763 			psk_key=*(++argv);
    764 			for (j = 0; j < strlen(psk_key); j++)
    765                                 {
    766                                 if (isxdigit((unsigned char)psk_key[j]))
    767                                         continue;
    768                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
    769                                 goto bad;
    770                                 }
    771 			}
    772 #endif
    773 #ifndef OPENSSL_NO_SRP
    774 		else if (strcmp(*argv,"-srpuser") == 0)
    775 			{
    776 			if (--argc < 1) goto bad;
    777 			srp_arg.srplogin= *(++argv);
    778 			meth=TLSv1_client_method();
    779 			}
    780 		else if (strcmp(*argv,"-srppass") == 0)
    781 			{
    782 			if (--argc < 1) goto bad;
    783 			srppass= *(++argv);
    784 			meth=TLSv1_client_method();
    785 			}
    786 		else if (strcmp(*argv,"-srp_strength") == 0)
    787 			{
    788 			if (--argc < 1) goto bad;
    789 			srp_arg.strength=atoi(*(++argv));
    790 			BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
    791 			meth=TLSv1_client_method();
    792 			}
    793 		else if (strcmp(*argv,"-srp_lateuser") == 0)
    794 			{
    795 			srp_lateuser= 1;
    796 			meth=TLSv1_client_method();
    797 			}
    798 		else if	(strcmp(*argv,"-srp_moregroups") == 0)
    799 			{
    800 			srp_arg.amp=1;
    801 			meth=TLSv1_client_method();
    802 			}
    803 #endif
    804 #ifndef OPENSSL_NO_SSL2
    805 		else if	(strcmp(*argv,"-ssl2") == 0)
    806 			meth=SSLv2_client_method();
    807 #endif
    808 #ifndef OPENSSL_NO_SSL3
    809 		else if	(strcmp(*argv,"-ssl3") == 0)
    810 			meth=SSLv3_client_method();
    811 #endif
    812 #ifndef OPENSSL_NO_TLS1
    813 		else if	(strcmp(*argv,"-tls1_2") == 0)
    814 			meth=TLSv1_2_client_method();
    815 		else if	(strcmp(*argv,"-tls1_1") == 0)
    816 			meth=TLSv1_1_client_method();
    817 		else if	(strcmp(*argv,"-tls1") == 0)
    818 			meth=TLSv1_client_method();
    819 #endif
    820 #ifndef OPENSSL_NO_DTLS1
    821 		else if	(strcmp(*argv,"-dtls1") == 0)
    822 			{
    823 			meth=DTLSv1_client_method();
    824 			socket_type=SOCK_DGRAM;
    825 			}
    826 		else if (strcmp(*argv,"-timeout") == 0)
    827 			enable_timeouts=1;
    828 		else if (strcmp(*argv,"-mtu") == 0)
    829 			{
    830 			if (--argc < 1) goto bad;
    831 			socket_mtu = atol(*(++argv));
    832 			}
    833 #endif
    834 		else if (strcmp(*argv,"-bugs") == 0)
    835 			bugs=1;
    836 		else if	(strcmp(*argv,"-keyform") == 0)
    837 			{
    838 			if (--argc < 1) goto bad;
    839 			key_format = str2fmt(*(++argv));
    840 			}
    841 		else if	(strcmp(*argv,"-pass") == 0)
    842 			{
    843 			if (--argc < 1) goto bad;
    844 			passarg = *(++argv);
    845 			}
    846 		else if	(strcmp(*argv,"-key") == 0)
    847 			{
    848 			if (--argc < 1) goto bad;
    849 			key_file= *(++argv);
    850 			}
    851 		else if	(strcmp(*argv,"-reconnect") == 0)
    852 			{
    853 			reconnect=5;
    854 			}
    855 		else if	(strcmp(*argv,"-CApath") == 0)
    856 			{
    857 			if (--argc < 1) goto bad;
    858 			CApath= *(++argv);
    859 			}
    860 		else if	(strcmp(*argv,"-CAfile") == 0)
    861 			{
    862 			if (--argc < 1) goto bad;
    863 			CAfile= *(++argv);
    864 			}
    865 		else if (strcmp(*argv,"-no_tls1_2") == 0)
    866 			off|=SSL_OP_NO_TLSv1_2;
    867 		else if (strcmp(*argv,"-no_tls1_1") == 0)
    868 			off|=SSL_OP_NO_TLSv1_1;
    869 		else if (strcmp(*argv,"-no_tls1") == 0)
    870 			off|=SSL_OP_NO_TLSv1;
    871 		else if (strcmp(*argv,"-no_ssl3") == 0)
    872 			off|=SSL_OP_NO_SSLv3;
    873 		else if (strcmp(*argv,"-no_ssl2") == 0)
    874 			off|=SSL_OP_NO_SSLv2;
    875 		else if	(strcmp(*argv,"-no_comp") == 0)
    876 			{ off|=SSL_OP_NO_COMPRESSION; }
    877 #ifndef OPENSSL_NO_TLSEXT
    878 		else if	(strcmp(*argv,"-no_ticket") == 0)
    879 			{ off|=SSL_OP_NO_TICKET; }
    880 # ifndef OPENSSL_NO_NEXTPROTONEG
    881 		else if (strcmp(*argv,"-nextprotoneg") == 0)
    882 			{
    883 			if (--argc < 1) goto bad;
    884 			next_proto_neg_in = *(++argv);
    885 			}
    886 # endif
    887 #endif
    888 		else if (strcmp(*argv,"-cutthrough") == 0)
    889 			cutthrough=1;
    890 		else if (strcmp(*argv,"-serverpref") == 0)
    891 			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
    892 		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
    893 			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
    894 		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
    895 			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
    896 		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
    897 			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
    898 		else if	(strcmp(*argv,"-cipher") == 0)
    899 			{
    900 			if (--argc < 1) goto bad;
    901 			cipher= *(++argv);
    902 			}
    903 #ifdef FIONBIO
    904 		else if (strcmp(*argv,"-nbio") == 0)
    905 			{ c_nbio=1; }
    906 #endif
    907 		else if	(strcmp(*argv,"-starttls") == 0)
    908 			{
    909 			if (--argc < 1) goto bad;
    910 			++argv;
    911 			if (strcmp(*argv,"smtp") == 0)
    912 				starttls_proto = PROTO_SMTP;
    913 			else if (strcmp(*argv,"pop3") == 0)
    914 				starttls_proto = PROTO_POP3;
    915 			else if (strcmp(*argv,"imap") == 0)
    916 				starttls_proto = PROTO_IMAP;
    917 			else if (strcmp(*argv,"ftp") == 0)
    918 				starttls_proto = PROTO_FTP;
    919 			else if (strcmp(*argv, "xmpp") == 0)
    920 				starttls_proto = PROTO_XMPP;
    921 			else
    922 				goto bad;
    923 			}
    924 #ifndef OPENSSL_NO_ENGINE
    925 		else if	(strcmp(*argv,"-engine") == 0)
    926 			{
    927 			if (--argc < 1) goto bad;
    928 			engine_id = *(++argv);
    929 			}
    930 		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
    931 			{
    932 			if (--argc < 1) goto bad;
    933 			ssl_client_engine_id = *(++argv);
    934 			}
    935 #endif
    936 		else if (strcmp(*argv,"-rand") == 0)
    937 			{
    938 			if (--argc < 1) goto bad;
    939 			inrand= *(++argv);
    940 			}
    941 #ifndef OPENSSL_NO_TLSEXT
    942 		else if (strcmp(*argv,"-servername") == 0)
    943 			{
    944 			if (--argc < 1) goto bad;
    945 			servername= *(++argv);
    946 			/* meth=TLSv1_client_method(); */
    947 			}
    948 #endif
    949 #ifndef OPENSSL_NO_JPAKE
    950 		else if (strcmp(*argv,"-jpake") == 0)
    951 			{
    952 			if (--argc < 1) goto bad;
    953 			jpake_secret = *++argv;
    954 			}
    955 #endif
    956 #ifndef OPENSSL_NO_SRTP
    957 		else if (strcmp(*argv,"-use_srtp") == 0)
    958 			{
    959 			if (--argc < 1) goto bad;
    960 			srtp_profiles = *(++argv);
    961 			}
    962 #endif
    963 		else if (strcmp(*argv,"-keymatexport") == 0)
    964 			{
    965 			if (--argc < 1) goto bad;
    966 			keymatexportlabel= *(++argv);
    967 			}
    968 		else if (strcmp(*argv,"-keymatexportlen") == 0)
    969 			{
    970 			if (--argc < 1) goto bad;
    971 			keymatexportlen=atoi(*(++argv));
    972 			if (keymatexportlen == 0) goto bad;
    973 			}
    974                 else
    975 			{
    976 			BIO_printf(bio_err,"unknown option %s\n",*argv);
    977 			badop=1;
    978 			break;
    979 			}
    980 		argc--;
    981 		argv++;
    982 		}
    983 	if (badop)
    984 		{
    985 bad:
    986 		sc_usage();
    987 		goto end;
    988 		}
    989 
    990 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
    991 	if (jpake_secret)
    992 		{
    993 		if (psk_key)
    994 			{
    995 			BIO_printf(bio_err,
    996 				   "Can't use JPAKE and PSK together\n");
    997 			goto end;
    998 			}
    999 		psk_identity = "JPAKE";
   1000 		if (cipher)
   1001 			{
   1002 			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
   1003 			goto end;
   1004 			}
   1005 		cipher = "PSK";
   1006 		}
   1007 #endif
   1008 
   1009 	OpenSSL_add_ssl_algorithms();
   1010 	SSL_load_error_strings();
   1011 
   1012 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   1013 	next_proto.status = -1;
   1014 	if (next_proto_neg_in)
   1015 		{
   1016 		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
   1017 		if (next_proto.data == NULL)
   1018 			{
   1019 			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
   1020 			goto end;
   1021 			}
   1022 		}
   1023 	else
   1024 		next_proto.data = NULL;
   1025 #endif
   1026 
   1027 #ifndef OPENSSL_NO_ENGINE
   1028         e = setup_engine(bio_err, engine_id, 1);
   1029 	if (ssl_client_engine_id)
   1030 		{
   1031 		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
   1032 		if (!ssl_client_engine)
   1033 			{
   1034 			BIO_printf(bio_err,
   1035 					"Error getting client auth engine\n");
   1036 			goto end;
   1037 			}
   1038 		}
   1039 
   1040 #endif
   1041 	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
   1042 		{
   1043 		BIO_printf(bio_err, "Error getting password\n");
   1044 		goto end;
   1045 		}
   1046 
   1047 	if (key_file == NULL)
   1048 		key_file = cert_file;
   1049 
   1050 
   1051 	if (key_file)
   1052 
   1053 		{
   1054 
   1055 		key = load_key(bio_err, key_file, key_format, 0, pass, e,
   1056 			       "client certificate private key file");
   1057 		if (!key)
   1058 			{
   1059 			ERR_print_errors(bio_err);
   1060 			goto end;
   1061 			}
   1062 
   1063 		}
   1064 
   1065 	if (cert_file)
   1066 
   1067 		{
   1068 		cert = load_cert(bio_err,cert_file,cert_format,
   1069 				NULL, e, "client certificate file");
   1070 
   1071 		if (!cert)
   1072 			{
   1073 			ERR_print_errors(bio_err);
   1074 			goto end;
   1075 			}
   1076 		}
   1077 
   1078 	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
   1079 		&& !RAND_status())
   1080 		{
   1081 		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
   1082 		}
   1083 	if (inrand != NULL)
   1084 		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
   1085 			app_RAND_load_files(inrand));
   1086 
   1087 	if (bio_c_out == NULL)
   1088 		{
   1089 		if (c_quiet && !c_debug && !c_msg)
   1090 			{
   1091 			bio_c_out=BIO_new(BIO_s_null());
   1092 			}
   1093 		else
   1094 			{
   1095 			if (bio_c_out == NULL)
   1096 				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
   1097 			}
   1098 		}
   1099 
   1100 #ifndef OPENSSL_NO_SRP
   1101 	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
   1102 		{
   1103 		BIO_printf(bio_err, "Error getting password\n");
   1104 		goto end;
   1105 		}
   1106 #endif
   1107 
   1108 	ctx=SSL_CTX_new(meth);
   1109 	if (ctx == NULL)
   1110 		{
   1111 		ERR_print_errors(bio_err);
   1112 		goto end;
   1113 		}
   1114 
   1115 	if (vpm)
   1116 		SSL_CTX_set1_param(ctx, vpm);
   1117 
   1118 #ifndef OPENSSL_NO_ENGINE
   1119 	if (ssl_client_engine)
   1120 		{
   1121 		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
   1122 			{
   1123 			BIO_puts(bio_err, "Error setting client auth engine\n");
   1124 			ERR_print_errors(bio_err);
   1125 			ENGINE_free(ssl_client_engine);
   1126 			goto end;
   1127 			}
   1128 		ENGINE_free(ssl_client_engine);
   1129 		}
   1130 #endif
   1131 
   1132 #ifndef OPENSSL_NO_PSK
   1133 #ifdef OPENSSL_NO_JPAKE
   1134 	if (psk_key != NULL)
   1135 #else
   1136 	if (psk_key != NULL || jpake_secret)
   1137 #endif
   1138 		{
   1139 		if (c_debug)
   1140 			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
   1141 		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
   1142 		}
   1143 #endif
   1144 #ifndef OPENSSL_NO_SRTP
   1145 	if (srtp_profiles != NULL)
   1146 		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
   1147 #endif
   1148 	if (bugs)
   1149 		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
   1150 	else
   1151 		SSL_CTX_set_options(ctx,off);
   1152 
   1153 	if (clr)
   1154 		SSL_CTX_clear_options(ctx, clr);
   1155 	/* DTLS: partial reads end up discarding unread UDP bytes :-(
   1156 	 * Setting read ahead solves this problem.
   1157 	 */
   1158 	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
   1159 
   1160 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   1161 	if (next_proto.data)
   1162 		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
   1163 #endif
   1164 
   1165 	/* Enable handshake cutthrough for client connections using
   1166 	 * strong ciphers. */
   1167 	if (cutthrough)
   1168 		{
   1169 		int ssl_mode = SSL_CTX_get_mode(ctx);
   1170 		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
   1171 		SSL_CTX_set_mode(ctx, ssl_mode);
   1172 		}
   1173 
   1174 	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
   1175 	if (cipher != NULL)
   1176 		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
   1177 		BIO_printf(bio_err,"error setting cipher list\n");
   1178 		ERR_print_errors(bio_err);
   1179 		goto end;
   1180 	}
   1181 #if 0
   1182 	else
   1183 		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
   1184 #endif
   1185 
   1186 	SSL_CTX_set_verify(ctx,verify,verify_callback);
   1187 	if (!set_cert_key_stuff(ctx,cert,key))
   1188 		goto end;
   1189 
   1190 	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
   1191 		(!SSL_CTX_set_default_verify_paths(ctx)))
   1192 		{
   1193 		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
   1194 		ERR_print_errors(bio_err);
   1195 		/* goto end; */
   1196 		}
   1197 
   1198 #ifndef OPENSSL_NO_TLSEXT
   1199 	if (servername != NULL)
   1200 		{
   1201 		tlsextcbp.biodebug = bio_err;
   1202 		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
   1203 		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
   1204 		}
   1205 #ifndef OPENSSL_NO_SRP
   1206         if (srp_arg.srplogin)
   1207 		{
   1208 		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
   1209 			{
   1210 			BIO_printf(bio_err,"Unable to set SRP username\n");
   1211 			goto end;
   1212 			}
   1213 		srp_arg.msg = c_msg;
   1214 		srp_arg.debug = c_debug ;
   1215 		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
   1216 		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
   1217 		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
   1218 		if (c_msg || c_debug || srp_arg.amp == 0)
   1219 			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
   1220 		}
   1221 
   1222 #endif
   1223 #endif
   1224 
   1225 	con=SSL_new(ctx);
   1226 	if (sess_in)
   1227 		{
   1228 		SSL_SESSION *sess;
   1229 		BIO *stmp = BIO_new_file(sess_in, "r");
   1230 		if (!stmp)
   1231 			{
   1232 			BIO_printf(bio_err, "Can't open session file %s\n",
   1233 						sess_in);
   1234 			ERR_print_errors(bio_err);
   1235 			goto end;
   1236 			}
   1237 		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
   1238 		BIO_free(stmp);
   1239 		if (!sess)
   1240 			{
   1241 			BIO_printf(bio_err, "Can't open session file %s\n",
   1242 						sess_in);
   1243 			ERR_print_errors(bio_err);
   1244 			goto end;
   1245 			}
   1246 		SSL_set_session(con, sess);
   1247 		SSL_SESSION_free(sess);
   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 
   1516 		if ((SSL_version(con) == DTLS1_VERSION) &&
   1517 			DTLSv1_get_timeout(con, &timeout))
   1518 			timeoutp = &timeout;
   1519 		else
   1520 			timeoutp = NULL;
   1521 
   1522 		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
   1523 			{
   1524 			in_init=1;
   1525 			tty_on=0;
   1526 			}
   1527 		else
   1528 			{
   1529 			tty_on=1;
   1530 			if (in_init)
   1531 				{
   1532 				in_init=0;
   1533 #if 0 /* This test doesn't really work as intended (needs to be fixed) */
   1534 #ifndef OPENSSL_NO_TLSEXT
   1535 				if (servername != NULL && !SSL_session_reused(con))
   1536 					{
   1537 					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
   1538 					}
   1539 #endif
   1540 #endif
   1541 				if (sess_out)
   1542 					{
   1543 					BIO *stmp = BIO_new_file(sess_out, "w");
   1544 					if (stmp)
   1545 						{
   1546 						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
   1547 						BIO_free(stmp);
   1548 						}
   1549 					else
   1550 						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
   1551 					}
   1552 				print_stuff(bio_c_out,con,full_log);
   1553 				if (full_log > 0) full_log--;
   1554 
   1555 				if (starttls_proto)
   1556 					{
   1557 					BIO_printf(bio_err,"%s",mbuf);
   1558 					/* We don't need to know any more */
   1559 					starttls_proto = PROTO_OFF;
   1560 					}
   1561 
   1562 				if (reconnect)
   1563 					{
   1564 					reconnect--;
   1565 					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
   1566 					SSL_shutdown(con);
   1567 					SSL_set_connect_state(con);
   1568 					SHUTDOWN(SSL_get_fd(con));
   1569 					goto re_start;
   1570 					}
   1571 				}
   1572 			}
   1573 
   1574 		ssl_pending = read_ssl && SSL_pending(con);
   1575 
   1576 		if (!ssl_pending)
   1577 			{
   1578 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
   1579 			if (tty_on)
   1580 				{
   1581 				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
   1582 				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
   1583 				}
   1584 			if (read_ssl)
   1585 				openssl_fdset(SSL_get_fd(con),&readfds);
   1586 			if (write_ssl)
   1587 				openssl_fdset(SSL_get_fd(con),&writefds);
   1588 #else
   1589 			if(!tty_on || !write_tty) {
   1590 				if (read_ssl)
   1591 					openssl_fdset(SSL_get_fd(con),&readfds);
   1592 				if (write_ssl)
   1593 					openssl_fdset(SSL_get_fd(con),&writefds);
   1594 			}
   1595 #endif
   1596 /*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
   1597 				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
   1598 
   1599 			/* Note: under VMS with SOCKETSHR the second parameter
   1600 			 * is currently of type (int *) whereas under other
   1601 			 * systems it is (void *) if you don't have a cast it
   1602 			 * will choke the compiler: if you do have a cast then
   1603 			 * you can either go for (int *) or (void *).
   1604 			 */
   1605 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
   1606                         /* Under Windows/DOS we make the assumption that we can
   1607 			 * always write to the tty: therefore if we need to
   1608 			 * write to the tty we just fall through. Otherwise
   1609 			 * we timeout the select every second and see if there
   1610 			 * are any keypresses. Note: this is a hack, in a proper
   1611 			 * Windows application we wouldn't do this.
   1612 			 */
   1613 			i=0;
   1614 			if(!write_tty) {
   1615 				if(read_tty) {
   1616 					tv.tv_sec = 1;
   1617 					tv.tv_usec = 0;
   1618 					i=select(width,(void *)&readfds,(void *)&writefds,
   1619 						 NULL,&tv);
   1620 #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
   1621 					if(!i && (!_kbhit() || !read_tty) ) continue;
   1622 #else
   1623 					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
   1624 #endif
   1625 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
   1626 					 NULL,timeoutp);
   1627 			}
   1628 #elif defined(OPENSSL_SYS_NETWARE)
   1629 			if(!write_tty) {
   1630 				if(read_tty) {
   1631 					tv.tv_sec = 1;
   1632 					tv.tv_usec = 0;
   1633 					i=select(width,(void *)&readfds,(void *)&writefds,
   1634 						NULL,&tv);
   1635 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
   1636 					NULL,timeoutp);
   1637 			}
   1638 #elif defined(OPENSSL_SYS_BEOS_R5)
   1639 			/* Under BeOS-R5 the situation is similar to DOS */
   1640 			i=0;
   1641 			stdin_set = 0;
   1642 			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
   1643 			if(!write_tty) {
   1644 				if(read_tty) {
   1645 					tv.tv_sec = 1;
   1646 					tv.tv_usec = 0;
   1647 					i=select(width,(void *)&readfds,(void *)&writefds,
   1648 						 NULL,&tv);
   1649 					if (read(fileno(stdin), sbuf, 0) >= 0)
   1650 						stdin_set = 1;
   1651 					if (!i && (stdin_set != 1 || !read_tty))
   1652 						continue;
   1653 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
   1654 					 NULL,timeoutp);
   1655 			}
   1656 			(void)fcntl(fileno(stdin), F_SETFL, 0);
   1657 #else
   1658 			i=select(width,(void *)&readfds,(void *)&writefds,
   1659 				 NULL,timeoutp);
   1660 #endif
   1661 			if ( i < 0)
   1662 				{
   1663 				BIO_printf(bio_err,"bad select %d\n",
   1664 				get_last_socket_error());
   1665 				goto shut;
   1666 				/* goto end; */
   1667 				}
   1668 			}
   1669 
   1670 		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
   1671 			{
   1672 			BIO_printf(bio_err,"TIMEOUT occured\n");
   1673 			}
   1674 
   1675 		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
   1676 			{
   1677 			k=SSL_write(con,&(cbuf[cbuf_off]),
   1678 				(unsigned int)cbuf_len);
   1679 			switch (SSL_get_error(con,k))
   1680 				{
   1681 			case SSL_ERROR_NONE:
   1682 				cbuf_off+=k;
   1683 				cbuf_len-=k;
   1684 				if (k <= 0) goto end;
   1685 				/* we have done a  write(con,NULL,0); */
   1686 				if (cbuf_len <= 0)
   1687 					{
   1688 					read_tty=1;
   1689 					write_ssl=0;
   1690 					}
   1691 				else /* if (cbuf_len > 0) */
   1692 					{
   1693 					read_tty=0;
   1694 					write_ssl=1;
   1695 					}
   1696 				break;
   1697 			case SSL_ERROR_WANT_WRITE:
   1698 				BIO_printf(bio_c_out,"write W BLOCK\n");
   1699 				write_ssl=1;
   1700 				read_tty=0;
   1701 				break;
   1702 			case SSL_ERROR_WANT_READ:
   1703 				BIO_printf(bio_c_out,"write R BLOCK\n");
   1704 				write_tty=0;
   1705 				read_ssl=1;
   1706 				write_ssl=0;
   1707 				break;
   1708 			case SSL_ERROR_WANT_X509_LOOKUP:
   1709 				BIO_printf(bio_c_out,"write X BLOCK\n");
   1710 				break;
   1711 			case SSL_ERROR_ZERO_RETURN:
   1712 				if (cbuf_len != 0)
   1713 					{
   1714 					BIO_printf(bio_c_out,"shutdown\n");
   1715 					ret = 0;
   1716 					goto shut;
   1717 					}
   1718 				else
   1719 					{
   1720 					read_tty=1;
   1721 					write_ssl=0;
   1722 					break;
   1723 					}
   1724 
   1725 			case SSL_ERROR_SYSCALL:
   1726 				if ((k != 0) || (cbuf_len != 0))
   1727 					{
   1728 					BIO_printf(bio_err,"write:errno=%d\n",
   1729 						get_last_socket_error());
   1730 					goto shut;
   1731 					}
   1732 				else
   1733 					{
   1734 					read_tty=1;
   1735 					write_ssl=0;
   1736 					}
   1737 				break;
   1738 			case SSL_ERROR_SSL:
   1739 				ERR_print_errors(bio_err);
   1740 				goto shut;
   1741 				}
   1742 			}
   1743 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
   1744 		/* Assume Windows/DOS/BeOS can always write */
   1745 		else if (!ssl_pending && write_tty)
   1746 #else
   1747 		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
   1748 #endif
   1749 			{
   1750 #ifdef CHARSET_EBCDIC
   1751 			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
   1752 #endif
   1753 			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
   1754 
   1755 			if (i <= 0)
   1756 				{
   1757 				BIO_printf(bio_c_out,"DONE\n");
   1758 				ret = 0;
   1759 				goto shut;
   1760 				/* goto end; */
   1761 				}
   1762 
   1763 			sbuf_len-=i;;
   1764 			sbuf_off+=i;
   1765 			if (sbuf_len <= 0)
   1766 				{
   1767 				read_ssl=1;
   1768 				write_tty=0;
   1769 				}
   1770 			}
   1771 		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
   1772 			{
   1773 #ifdef RENEG
   1774 { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
   1775 #endif
   1776 #if 1
   1777 			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
   1778 #else
   1779 /* Demo for pending and peek :-) */
   1780 			k=SSL_read(con,sbuf,16);
   1781 { char zbuf[10240];
   1782 printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
   1783 }
   1784 #endif
   1785 
   1786 			switch (SSL_get_error(con,k))
   1787 				{
   1788 			case SSL_ERROR_NONE:
   1789 				if (k <= 0)
   1790 					goto end;
   1791 				sbuf_off=0;
   1792 				sbuf_len=k;
   1793 
   1794 				read_ssl=0;
   1795 				write_tty=1;
   1796 				break;
   1797 			case SSL_ERROR_WANT_WRITE:
   1798 				BIO_printf(bio_c_out,"read W BLOCK\n");
   1799 				write_ssl=1;
   1800 				read_tty=0;
   1801 				break;
   1802 			case SSL_ERROR_WANT_READ:
   1803 				BIO_printf(bio_c_out,"read R BLOCK\n");
   1804 				write_tty=0;
   1805 				read_ssl=1;
   1806 				if ((read_tty == 0) && (write_ssl == 0))
   1807 					write_ssl=1;
   1808 				break;
   1809 			case SSL_ERROR_WANT_X509_LOOKUP:
   1810 				BIO_printf(bio_c_out,"read X BLOCK\n");
   1811 				break;
   1812 			case SSL_ERROR_SYSCALL:
   1813 				ret=get_last_socket_error();
   1814 				BIO_printf(bio_err,"read:errno=%d\n",ret);
   1815 				goto shut;
   1816 			case SSL_ERROR_ZERO_RETURN:
   1817 				BIO_printf(bio_c_out,"closed\n");
   1818 				ret=0;
   1819 				goto shut;
   1820 			case SSL_ERROR_SSL:
   1821 				ERR_print_errors(bio_err);
   1822 				goto shut;
   1823 				/* break; */
   1824 				}
   1825 			}
   1826 
   1827 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
   1828 #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
   1829 		else if (_kbhit())
   1830 #else
   1831 		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
   1832 #endif
   1833 #elif defined (OPENSSL_SYS_NETWARE)
   1834 		else if (_kbhit())
   1835 #elif defined(OPENSSL_SYS_BEOS_R5)
   1836 		else if (stdin_set)
   1837 #else
   1838 		else if (FD_ISSET(fileno(stdin),&readfds))
   1839 #endif
   1840 			{
   1841 			if (crlf)
   1842 				{
   1843 				int j, lf_num;
   1844 
   1845 				i=raw_read_stdin(cbuf,BUFSIZZ/2);
   1846 				lf_num = 0;
   1847 				/* both loops are skipped when i <= 0 */
   1848 				for (j = 0; j < i; j++)
   1849 					if (cbuf[j] == '\n')
   1850 						lf_num++;
   1851 				for (j = i-1; j >= 0; j--)
   1852 					{
   1853 					cbuf[j+lf_num] = cbuf[j];
   1854 					if (cbuf[j] == '\n')
   1855 						{
   1856 						lf_num--;
   1857 						i++;
   1858 						cbuf[j+lf_num] = '\r';
   1859 						}
   1860 					}
   1861 				assert(lf_num == 0);
   1862 				}
   1863 			else
   1864 				i=raw_read_stdin(cbuf,BUFSIZZ);
   1865 
   1866 			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
   1867 				{
   1868 				BIO_printf(bio_err,"DONE\n");
   1869 				ret=0;
   1870 				goto shut;
   1871 				}
   1872 
   1873 			if ((!c_ign_eof) && (cbuf[0] == 'R'))
   1874 				{
   1875 				BIO_printf(bio_err,"RENEGOTIATING\n");
   1876 				SSL_renegotiate(con);
   1877 				cbuf_len=0;
   1878 				}
   1879 #ifndef OPENSSL_NO_HEARTBEATS
   1880 			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
   1881  				{
   1882 				BIO_printf(bio_err,"HEARTBEATING\n");
   1883 				SSL_heartbeat(con);
   1884 				cbuf_len=0;
   1885 				}
   1886 #endif
   1887 			else
   1888 				{
   1889 				cbuf_len=i;
   1890 				cbuf_off=0;
   1891 #ifdef CHARSET_EBCDIC
   1892 				ebcdic2ascii(cbuf, cbuf, i);
   1893 #endif
   1894 				}
   1895 
   1896 			write_ssl=1;
   1897 			read_tty=0;
   1898 			}
   1899 		}
   1900 
   1901 	ret=0;
   1902 shut:
   1903 	if (in_init)
   1904 		print_stuff(bio_c_out,con,full_log);
   1905 	SSL_shutdown(con);
   1906 	SHUTDOWN(SSL_get_fd(con));
   1907 end:
   1908 	if (con != NULL)
   1909 		{
   1910 		if (prexit != 0)
   1911 			print_stuff(bio_c_out,con,1);
   1912 		SSL_free(con);
   1913 		}
   1914 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   1915 	if (next_proto.data)
   1916 		OPENSSL_free(next_proto.data);
   1917 #endif
   1918 	if (ctx != NULL) SSL_CTX_free(ctx);
   1919 	if (cert)
   1920 		X509_free(cert);
   1921 	if (key)
   1922 		EVP_PKEY_free(key);
   1923 	if (pass)
   1924 		OPENSSL_free(pass);
   1925 	if (vpm)
   1926 		X509_VERIFY_PARAM_free(vpm);
   1927 	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
   1928 	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
   1929 	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
   1930 	if (bio_c_out != NULL)
   1931 		{
   1932 		BIO_free(bio_c_out);
   1933 		bio_c_out=NULL;
   1934 		}
   1935 	apps_shutdown();
   1936 	OPENSSL_EXIT(ret);
   1937 	}
   1938 
   1939 
   1940 static void print_stuff(BIO *bio, SSL *s, int full)
   1941 	{
   1942 	X509 *peer=NULL;
   1943 	char *p;
   1944 	static const char *space="                ";
   1945 	char buf[BUFSIZ];
   1946 	STACK_OF(X509) *sk;
   1947 	STACK_OF(X509_NAME) *sk2;
   1948 	const SSL_CIPHER *c;
   1949 	X509_NAME *xn;
   1950 	int j,i;
   1951 #ifndef OPENSSL_NO_COMP
   1952 	const COMP_METHOD *comp, *expansion;
   1953 #endif
   1954 	unsigned char *exportedkeymat;
   1955 
   1956 	if (full)
   1957 		{
   1958 		int got_a_chain = 0;
   1959 
   1960 		sk=SSL_get_peer_cert_chain(s);
   1961 		if (sk != NULL)
   1962 			{
   1963 			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
   1964 
   1965 			BIO_printf(bio,"---\nCertificate chain\n");
   1966 			for (i=0; i<sk_X509_num(sk); i++)
   1967 				{
   1968 				X509_NAME_oneline(X509_get_subject_name(
   1969 					sk_X509_value(sk,i)),buf,sizeof buf);
   1970 				BIO_printf(bio,"%2d s:%s\n",i,buf);
   1971 				X509_NAME_oneline(X509_get_issuer_name(
   1972 					sk_X509_value(sk,i)),buf,sizeof buf);
   1973 				BIO_printf(bio,"   i:%s\n",buf);
   1974 				if (c_showcerts)
   1975 					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
   1976 				}
   1977 			}
   1978 
   1979 		BIO_printf(bio,"---\n");
   1980 		peer=SSL_get_peer_certificate(s);
   1981 		if (peer != NULL)
   1982 			{
   1983 			BIO_printf(bio,"Server certificate\n");
   1984 			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
   1985 				PEM_write_bio_X509(bio,peer);
   1986 			X509_NAME_oneline(X509_get_subject_name(peer),
   1987 				buf,sizeof buf);
   1988 			BIO_printf(bio,"subject=%s\n",buf);
   1989 			X509_NAME_oneline(X509_get_issuer_name(peer),
   1990 				buf,sizeof buf);
   1991 			BIO_printf(bio,"issuer=%s\n",buf);
   1992 			}
   1993 		else
   1994 			BIO_printf(bio,"no peer certificate available\n");
   1995 
   1996 		sk2=SSL_get_client_CA_list(s);
   1997 		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
   1998 			{
   1999 			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
   2000 			for (i=0; i<sk_X509_NAME_num(sk2); i++)
   2001 				{
   2002 				xn=sk_X509_NAME_value(sk2,i);
   2003 				X509_NAME_oneline(xn,buf,sizeof(buf));
   2004 				BIO_write(bio,buf,strlen(buf));
   2005 				BIO_write(bio,"\n",1);
   2006 				}
   2007 			}
   2008 		else
   2009 			{
   2010 			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
   2011 			}
   2012 		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
   2013 		if (p != NULL)
   2014 			{
   2015 			/* This works only for SSL 2.  In later protocol
   2016 			 * versions, the client does not know what other
   2017 			 * ciphers (in addition to the one to be used
   2018 			 * in the current connection) the server supports. */
   2019 
   2020 			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
   2021 			j=i=0;
   2022 			while (*p)
   2023 				{
   2024 				if (*p == ':')
   2025 					{
   2026 					BIO_write(bio,space,15-j%25);
   2027 					i++;
   2028 					j=0;
   2029 					BIO_write(bio,((i%3)?" ":"\n"),1);
   2030 					}
   2031 				else
   2032 					{
   2033 					BIO_write(bio,p,1);
   2034 					j++;
   2035 					}
   2036 				p++;
   2037 				}
   2038 			BIO_write(bio,"\n",1);
   2039 			}
   2040 
   2041 		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
   2042 			BIO_number_read(SSL_get_rbio(s)),
   2043 			BIO_number_written(SSL_get_wbio(s)));
   2044 		}
   2045 	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
   2046 	c=SSL_get_current_cipher(s);
   2047 	BIO_printf(bio,"%s, Cipher is %s\n",
   2048 		SSL_CIPHER_get_version(c),
   2049 		SSL_CIPHER_get_name(c));
   2050 	if (peer != NULL) {
   2051 		EVP_PKEY *pktmp;
   2052 		pktmp = X509_get_pubkey(peer);
   2053 		BIO_printf(bio,"Server public key is %d bit\n",
   2054 							 EVP_PKEY_bits(pktmp));
   2055 		EVP_PKEY_free(pktmp);
   2056 	}
   2057 	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
   2058 			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
   2059 #ifndef OPENSSL_NO_COMP
   2060 	comp=SSL_get_current_compression(s);
   2061 	expansion=SSL_get_current_expansion(s);
   2062 	BIO_printf(bio,"Compression: %s\n",
   2063 		comp ? SSL_COMP_get_name(comp) : "NONE");
   2064 	BIO_printf(bio,"Expansion: %s\n",
   2065 		expansion ? SSL_COMP_get_name(expansion) : "NONE");
   2066 #endif
   2067 
   2068 #ifdef SSL_DEBUG
   2069 	{
   2070 	/* Print out local port of connection: useful for debugging */
   2071 	int sock;
   2072 	struct sockaddr_in ladd;
   2073 	socklen_t ladd_size = sizeof(ladd);
   2074 	sock = SSL_get_fd(s);
   2075 	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
   2076 	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
   2077 	}
   2078 #endif
   2079 
   2080 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   2081 	if (next_proto.status != -1) {
   2082 		const unsigned char *proto;
   2083 		unsigned int proto_len;
   2084 		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
   2085 		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
   2086 		BIO_write(bio, proto, proto_len);
   2087 		BIO_write(bio, "\n", 1);
   2088 	}
   2089 #endif
   2090 
   2091 #ifndef OPENSSL_NO_SRTP
   2092  	{
   2093  	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
   2094 
   2095 	if(srtp_profile)
   2096 		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
   2097 			   srtp_profile->name);
   2098 	}
   2099 #endif
   2100 
   2101 	SSL_SESSION_print(bio,SSL_get_session(s));
   2102 	if (keymatexportlabel != NULL)
   2103 		{
   2104 		BIO_printf(bio, "Keying material exporter:\n");
   2105 		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
   2106 		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
   2107 		exportedkeymat = OPENSSL_malloc(keymatexportlen);
   2108 		if (exportedkeymat != NULL)
   2109 			{
   2110 			if (!SSL_export_keying_material(s, exportedkeymat,
   2111 						        keymatexportlen,
   2112 						        keymatexportlabel,
   2113 						        strlen(keymatexportlabel),
   2114 						        NULL, 0, 0))
   2115 				{
   2116 				BIO_printf(bio, "    Error\n");
   2117 				}
   2118 			else
   2119 				{
   2120 				BIO_printf(bio, "    Keying material: ");
   2121 				for (i=0; i<keymatexportlen; i++)
   2122 					BIO_printf(bio, "%02X",
   2123 						   exportedkeymat[i]);
   2124 				BIO_printf(bio, "\n");
   2125 				}
   2126 			OPENSSL_free(exportedkeymat);
   2127 			}
   2128 		}
   2129 	BIO_printf(bio,"---\n");
   2130 	if (peer != NULL)
   2131 		X509_free(peer);
   2132 	/* flush, or debugging output gets mixed with http response */
   2133 	(void)BIO_flush(bio);
   2134 	}
   2135 
   2136 #ifndef OPENSSL_NO_TLSEXT
   2137 
   2138 static int ocsp_resp_cb(SSL *s, void *arg)
   2139 	{
   2140 	const unsigned char *p;
   2141 	int len;
   2142 	OCSP_RESPONSE *rsp;
   2143 	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
   2144 	BIO_puts(arg, "OCSP response: ");
   2145 	if (!p)
   2146 		{
   2147 		BIO_puts(arg, "no response sent\n");
   2148 		return 1;
   2149 		}
   2150 	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
   2151 	if (!rsp)
   2152 		{
   2153 		BIO_puts(arg, "response parse error\n");
   2154 		BIO_dump_indent(arg, (char *)p, len, 4);
   2155 		return 0;
   2156 		}
   2157 	BIO_puts(arg, "\n======================================\n");
   2158 	OCSP_RESPONSE_print(arg, rsp, 0);
   2159 	BIO_puts(arg, "======================================\n");
   2160 	OCSP_RESPONSE_free(rsp);
   2161 	return 1;
   2162 	}
   2163 
   2164 #endif
   2165