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