xref: /freebsd/crypto/openssl/apps/s_client.c (revision 09286989d354c3609717f91084fd6dfe93027775)
174664626SKris Kennaway /* apps/s_client.c */
274664626SKris Kennaway /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
374664626SKris Kennaway  * All rights reserved.
474664626SKris Kennaway  *
574664626SKris Kennaway  * This package is an SSL implementation written
674664626SKris Kennaway  * by Eric Young (eay@cryptsoft.com).
774664626SKris Kennaway  * The implementation was written so as to conform with Netscapes SSL.
874664626SKris Kennaway  *
974664626SKris Kennaway  * This library is free for commercial and non-commercial use as long as
1074664626SKris Kennaway  * the following conditions are aheared to.  The following conditions
1174664626SKris Kennaway  * apply to all code found in this distribution, be it the RC4, RSA,
1274664626SKris Kennaway  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1374664626SKris Kennaway  * included with this distribution is covered by the same copyright terms
1474664626SKris Kennaway  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1574664626SKris Kennaway  *
1674664626SKris Kennaway  * Copyright remains Eric Young's, and as such any Copyright notices in
1774664626SKris Kennaway  * the code are not to be removed.
1874664626SKris Kennaway  * If this package is used in a product, Eric Young should be given attribution
1974664626SKris Kennaway  * as the author of the parts of the library used.
2074664626SKris Kennaway  * This can be in the form of a textual message at program startup or
2174664626SKris Kennaway  * in documentation (online or textual) provided with the package.
2274664626SKris Kennaway  *
2374664626SKris Kennaway  * Redistribution and use in source and binary forms, with or without
2474664626SKris Kennaway  * modification, are permitted provided that the following conditions
2574664626SKris Kennaway  * are met:
2674664626SKris Kennaway  * 1. Redistributions of source code must retain the copyright
2774664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer.
2874664626SKris Kennaway  * 2. Redistributions in binary form must reproduce the above copyright
2974664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer in the
3074664626SKris Kennaway  *    documentation and/or other materials provided with the distribution.
3174664626SKris Kennaway  * 3. All advertising materials mentioning features or use of this software
3274664626SKris Kennaway  *    must display the following acknowledgement:
3374664626SKris Kennaway  *    "This product includes cryptographic software written by
3474664626SKris Kennaway  *     Eric Young (eay@cryptsoft.com)"
3574664626SKris Kennaway  *    The word 'cryptographic' can be left out if the rouines from the library
3674664626SKris Kennaway  *    being used are not cryptographic related :-).
3774664626SKris Kennaway  * 4. If you include any Windows specific code (or a derivative thereof) from
3874664626SKris Kennaway  *    the apps directory (application code) you must include an acknowledgement:
3974664626SKris Kennaway  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4074664626SKris Kennaway  *
4174664626SKris Kennaway  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4274664626SKris Kennaway  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4374664626SKris Kennaway  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4474664626SKris Kennaway  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4574664626SKris Kennaway  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4674664626SKris Kennaway  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4774664626SKris Kennaway  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4874664626SKris Kennaway  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4974664626SKris Kennaway  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5074664626SKris Kennaway  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5174664626SKris Kennaway  * SUCH DAMAGE.
5274664626SKris Kennaway  *
5374664626SKris Kennaway  * The licence and distribution terms for any publically available version or
5474664626SKris Kennaway  * derivative of this code cannot be changed.  i.e. this code cannot simply be
5574664626SKris Kennaway  * copied and put under another distribution licence
5674664626SKris Kennaway  * [including the GNU Public Licence.]
5774664626SKris Kennaway  */
585c87c606SMark Murray /* ====================================================================
591f13597dSJung-uk Kim  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
605c87c606SMark Murray  *
615c87c606SMark Murray  * Redistribution and use in source and binary forms, with or without
625c87c606SMark Murray  * modification, are permitted provided that the following conditions
635c87c606SMark Murray  * are met:
645c87c606SMark Murray  *
655c87c606SMark Murray  * 1. Redistributions of source code must retain the above copyright
665c87c606SMark Murray  *    notice, this list of conditions and the following disclaimer.
675c87c606SMark Murray  *
685c87c606SMark Murray  * 2. Redistributions in binary form must reproduce the above copyright
695c87c606SMark Murray  *    notice, this list of conditions and the following disclaimer in
705c87c606SMark Murray  *    the documentation and/or other materials provided with the
715c87c606SMark Murray  *    distribution.
725c87c606SMark Murray  *
735c87c606SMark Murray  * 3. All advertising materials mentioning features or use of this
745c87c606SMark Murray  *    software must display the following acknowledgment:
755c87c606SMark Murray  *    "This product includes software developed by the OpenSSL Project
765c87c606SMark Murray  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
775c87c606SMark Murray  *
785c87c606SMark Murray  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
795c87c606SMark Murray  *    endorse or promote products derived from this software without
805c87c606SMark Murray  *    prior written permission. For written permission, please contact
815c87c606SMark Murray  *    openssl-core@openssl.org.
825c87c606SMark Murray  *
835c87c606SMark Murray  * 5. Products derived from this software may not be called "OpenSSL"
845c87c606SMark Murray  *    nor may "OpenSSL" appear in their names without prior written
855c87c606SMark Murray  *    permission of the OpenSSL Project.
865c87c606SMark Murray  *
875c87c606SMark Murray  * 6. Redistributions of any form whatsoever must retain the following
885c87c606SMark Murray  *    acknowledgment:
895c87c606SMark Murray  *    "This product includes software developed by the OpenSSL Project
905c87c606SMark Murray  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
915c87c606SMark Murray  *
925c87c606SMark Murray  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
935c87c606SMark Murray  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
945c87c606SMark Murray  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
955c87c606SMark Murray  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
965c87c606SMark Murray  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
975c87c606SMark Murray  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
985c87c606SMark Murray  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
995c87c606SMark Murray  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1005c87c606SMark Murray  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1015c87c606SMark Murray  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1025c87c606SMark Murray  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
1035c87c606SMark Murray  * OF THE POSSIBILITY OF SUCH DAMAGE.
1045c87c606SMark Murray  * ====================================================================
1055c87c606SMark Murray  *
1065c87c606SMark Murray  * This product includes cryptographic software written by Eric Young
1075c87c606SMark Murray  * (eay@cryptsoft.com).  This product includes software written by Tim
1085c87c606SMark Murray  * Hudson (tjh@cryptsoft.com).
1095c87c606SMark Murray  *
1105c87c606SMark Murray  */
1111f13597dSJung-uk Kim /* ====================================================================
1121f13597dSJung-uk Kim  * Copyright 2005 Nokia. All rights reserved.
1131f13597dSJung-uk Kim  *
1141f13597dSJung-uk Kim  * The portions of the attached software ("Contribution") is developed by
1151f13597dSJung-uk Kim  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
1161f13597dSJung-uk Kim  * license.
1171f13597dSJung-uk Kim  *
1181f13597dSJung-uk Kim  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
1191f13597dSJung-uk Kim  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
1201f13597dSJung-uk Kim  * support (see RFC 4279) to OpenSSL.
1211f13597dSJung-uk Kim  *
1221f13597dSJung-uk Kim  * No patent licenses or other rights except those expressly stated in
1231f13597dSJung-uk Kim  * the OpenSSL open source license shall be deemed granted or received
1241f13597dSJung-uk Kim  * expressly, by implication, estoppel, or otherwise.
1251f13597dSJung-uk Kim  *
1261f13597dSJung-uk Kim  * No assurances are provided by Nokia that the Contribution does not
1271f13597dSJung-uk Kim  * infringe the patent or other intellectual property rights of any third
1281f13597dSJung-uk Kim  * party or that the license provides you with all the necessary rights
1291f13597dSJung-uk Kim  * to make use of the Contribution.
1301f13597dSJung-uk Kim  *
1311f13597dSJung-uk Kim  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
1321f13597dSJung-uk Kim  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
1331f13597dSJung-uk Kim  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
1341f13597dSJung-uk Kim  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
1351f13597dSJung-uk Kim  * OTHERWISE.
1361f13597dSJung-uk Kim  */
13774664626SKris Kennaway 
13874664626SKris Kennaway #include <assert.h>
1391f13597dSJung-uk Kim #include <ctype.h>
14074664626SKris Kennaway #include <stdio.h>
14174664626SKris Kennaway #include <stdlib.h>
14274664626SKris Kennaway #include <string.h>
1435c87c606SMark Murray #include <openssl/e_os2.h>
1445c87c606SMark Murray #ifdef OPENSSL_NO_STDIO
14574664626SKris Kennaway #define APPS_WIN16
14674664626SKris Kennaway #endif
14774664626SKris Kennaway 
14874664626SKris Kennaway /* With IPv6, it looks like Digital has mixed up the proper order of
14974664626SKris Kennaway    recursive header file inclusion, resulting in the compiler complaining
15074664626SKris Kennaway    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
15174664626SKris Kennaway    is needed to have fileno() declared correctly...  So let's define u_int */
1525c87c606SMark Murray #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
15374664626SKris Kennaway #define __U_INT
15474664626SKris Kennaway typedef unsigned int u_int;
15574664626SKris Kennaway #endif
15674664626SKris Kennaway 
15774664626SKris Kennaway #define USE_SOCKETS
15874664626SKris Kennaway #include "apps.h"
15974664626SKris Kennaway #include <openssl/x509.h>
16074664626SKris Kennaway #include <openssl/ssl.h>
16174664626SKris Kennaway #include <openssl/err.h>
16274664626SKris Kennaway #include <openssl/pem.h>
1635740a5e3SKris Kennaway #include <openssl/rand.h>
164db522d3aSSimon L. B. Nielsen #include <openssl/ocsp.h>
1651f13597dSJung-uk Kim #include <openssl/bn.h>
1661f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
1671f13597dSJung-uk Kim #include <openssl/srp.h>
1681f13597dSJung-uk Kim #endif
16974664626SKris Kennaway #include "s_apps.h"
1703b4e3dcbSSimon L. B. Nielsen #include "timeouts.h"
17174664626SKris Kennaway 
1725c87c606SMark Murray #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
17374664626SKris Kennaway /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
17474664626SKris Kennaway #undef FIONBIO
17574664626SKris Kennaway #endif
17674664626SKris Kennaway 
1771f13597dSJung-uk Kim #if defined(OPENSSL_SYS_BEOS_R5)
1781f13597dSJung-uk Kim #include <fcntl.h>
1791f13597dSJung-uk Kim #endif
1801f13597dSJung-uk Kim 
18174664626SKris Kennaway #undef PROG
18274664626SKris Kennaway #define PROG	s_client_main
18374664626SKris Kennaway 
18474664626SKris Kennaway /*#define SSL_HOST_NAME	"www.netscape.com" */
18574664626SKris Kennaway /*#define SSL_HOST_NAME	"193.118.187.102" */
18674664626SKris Kennaway #define SSL_HOST_NAME	"localhost"
18774664626SKris Kennaway 
18874664626SKris Kennaway /*#define TEST_CERT "client.pem" */ /* no default cert. */
18974664626SKris Kennaway 
19074664626SKris Kennaway #undef BUFSIZZ
19174664626SKris Kennaway #define BUFSIZZ 1024*8
19274664626SKris Kennaway 
19374664626SKris Kennaway extern int verify_depth;
19474664626SKris Kennaway extern int verify_error;
1951f13597dSJung-uk Kim extern int verify_return_error;
19674664626SKris Kennaway 
19774664626SKris Kennaway #ifdef FIONBIO
19874664626SKris Kennaway static int c_nbio=0;
19974664626SKris Kennaway #endif
20074664626SKris Kennaway static int c_Pause=0;
20174664626SKris Kennaway static int c_debug=0;
202db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
203db522d3aSSimon L. B. Nielsen static int c_tlsextdebug=0;
204db522d3aSSimon L. B. Nielsen static int c_status_req=0;
205db522d3aSSimon L. B. Nielsen #endif
2065c87c606SMark Murray static int c_msg=0;
20774664626SKris Kennaway static int c_showcerts=0;
20874664626SKris Kennaway 
2091f13597dSJung-uk Kim static char *keymatexportlabel=NULL;
2101f13597dSJung-uk Kim static int keymatexportlen=20;
2111f13597dSJung-uk Kim 
21274664626SKris Kennaway static void sc_usage(void);
21374664626SKris Kennaway static void print_stuff(BIO *berr,SSL *con,int full);
214db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
215db522d3aSSimon L. B. Nielsen static int ocsp_resp_cb(SSL *s, void *arg);
216db522d3aSSimon L. B. Nielsen #endif
21774664626SKris Kennaway static BIO *bio_c_out=NULL;
21874664626SKris Kennaway static int c_quiet=0;
219f579bf8eSKris Kennaway static int c_ign_eof=0;
22074664626SKris Kennaway 
2211f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
2221f13597dSJung-uk Kim /* Default PSK identity and key */
2231f13597dSJung-uk Kim static char *psk_identity="Client_identity";
2241f13597dSJung-uk Kim /*char *psk_key=NULL;  by default PSK is not used */
2251f13597dSJung-uk Kim 
2261f13597dSJung-uk Kim static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
2271f13597dSJung-uk Kim 	unsigned int max_identity_len, unsigned char *psk,
2281f13597dSJung-uk Kim 	unsigned int max_psk_len)
2291f13597dSJung-uk Kim 	{
2301f13597dSJung-uk Kim 	unsigned int psk_len = 0;
2311f13597dSJung-uk Kim 	int ret;
2321f13597dSJung-uk Kim         BIGNUM *bn=NULL;
2331f13597dSJung-uk Kim 
2341f13597dSJung-uk Kim 	if (c_debug)
2351f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "psk_client_cb\n");
2361f13597dSJung-uk Kim 	if (!hint)
2371f13597dSJung-uk Kim                 {
2381f13597dSJung-uk Kim                 /* no ServerKeyExchange message*/
2391f13597dSJung-uk Kim 		if (c_debug)
2401f13597dSJung-uk Kim 			BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
2411f13597dSJung-uk Kim                 }
2421f13597dSJung-uk Kim         else if (c_debug)
2431f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
2441f13597dSJung-uk Kim 
2451f13597dSJung-uk Kim 	/* lookup PSK identity and PSK key based on the given identity hint here */
2461f13597dSJung-uk Kim 	ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
2471f13597dSJung-uk Kim 	if (ret < 0 || (unsigned int)ret > max_identity_len)
2481f13597dSJung-uk Kim 		goto out_err;
2491f13597dSJung-uk Kim 	if (c_debug)
2501f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
2511f13597dSJung-uk Kim         ret=BN_hex2bn(&bn, psk_key);
2521f13597dSJung-uk Kim         if (!ret)
2531f13597dSJung-uk Kim                 {
2541f13597dSJung-uk Kim                 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
2551f13597dSJung-uk Kim                 if (bn)
2561f13597dSJung-uk Kim                         BN_free(bn);
2571f13597dSJung-uk Kim                 return 0;
2581f13597dSJung-uk Kim                 }
2591f13597dSJung-uk Kim 
2601f13597dSJung-uk Kim         if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
2611f13597dSJung-uk Kim                 {
2621f13597dSJung-uk Kim                 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
2631f13597dSJung-uk Kim                         max_psk_len, BN_num_bytes(bn));
2641f13597dSJung-uk Kim                 BN_free(bn);
2651f13597dSJung-uk Kim                 return 0;
2661f13597dSJung-uk Kim                 }
2671f13597dSJung-uk Kim 
2681f13597dSJung-uk Kim         psk_len=BN_bn2bin(bn, psk);
2691f13597dSJung-uk Kim         BN_free(bn);
2701f13597dSJung-uk Kim         if (psk_len == 0)
2711f13597dSJung-uk Kim                 goto out_err;
2721f13597dSJung-uk Kim 
2731f13597dSJung-uk Kim 	if (c_debug)
2741f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
2751f13597dSJung-uk Kim 
2761f13597dSJung-uk Kim         return psk_len;
2771f13597dSJung-uk Kim  out_err:
2781f13597dSJung-uk Kim 	if (c_debug)
2791f13597dSJung-uk Kim 		BIO_printf(bio_err, "Error in PSK client callback\n");
2801f13597dSJung-uk Kim         return 0;
2811f13597dSJung-uk Kim 	}
2821f13597dSJung-uk Kim #endif
2831f13597dSJung-uk Kim 
28474664626SKris Kennaway static void sc_usage(void)
28574664626SKris Kennaway 	{
28674664626SKris Kennaway 	BIO_printf(bio_err,"usage: s_client args\n");
28774664626SKris Kennaway 	BIO_printf(bio_err,"\n");
28874664626SKris Kennaway 	BIO_printf(bio_err," -host host     - use -connect instead\n");
28974664626SKris Kennaway 	BIO_printf(bio_err," -port port     - use -connect instead\n");
29074664626SKris Kennaway 	BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
29174664626SKris Kennaway 
2921f13597dSJung-uk Kim 	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
29374664626SKris Kennaway 	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
2943b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
2953b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
29674664626SKris Kennaway 	BIO_printf(bio_err,"                 not specified but cert file is.\n");
2973b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
2983b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
29974664626SKris Kennaway 	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
30074664626SKris Kennaway 	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
30174664626SKris Kennaway 	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
30274664626SKris Kennaway 	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
30374664626SKris Kennaway 	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
30474664626SKris Kennaway 	BIO_printf(bio_err," -debug        - extra output\n");
3053b4e3dcbSSimon L. B. Nielsen #ifdef WATT32
3063b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
3073b4e3dcbSSimon L. B. Nielsen #endif
3085c87c606SMark Murray 	BIO_printf(bio_err," -msg          - Show protocol messages\n");
30974664626SKris Kennaway 	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
31074664626SKris Kennaway 	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
31174664626SKris Kennaway #ifdef FIONBIO
31274664626SKris Kennaway 	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
31374664626SKris Kennaway #endif
31474664626SKris Kennaway 	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
31574664626SKris Kennaway 	BIO_printf(bio_err," -quiet        - no s_client output\n");
316f579bf8eSKris Kennaway 	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
317db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
3181f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
3191f13597dSJung-uk Kim 	BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
3201f13597dSJung-uk Kim 	BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
3211f13597dSJung-uk Kim # ifndef OPENSSL_NO_JPAKE
3221f13597dSJung-uk Kim 	BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
3231f13597dSJung-uk Kim # endif
3241f13597dSJung-uk Kim #endif
3251f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
3261f13597dSJung-uk Kim 	BIO_printf(bio_err," -srpuser user     - SRP authentification for 'user'\n");
3271f13597dSJung-uk Kim 	BIO_printf(bio_err," -srppass arg      - password for 'user'\n");
3281f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_lateuser     - SRP username into second ClientHello message\n");
3291f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_moregroups   - Tolerate other than the known g N values.\n");
3301f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
3311f13597dSJung-uk Kim #endif
33274664626SKris Kennaway 	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
33374664626SKris Kennaway 	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
3341f13597dSJung-uk Kim 	BIO_printf(bio_err," -tls1_2       - just use TLSv1.2\n");
3351f13597dSJung-uk Kim 	BIO_printf(bio_err," -tls1_1       - just use TLSv1.1\n");
33674664626SKris Kennaway 	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
3373b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
3386a599222SSimon L. B. Nielsen 	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
3391f13597dSJung-uk Kim 	BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
34074664626SKris Kennaway 	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
3415c87c606SMark Murray 	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
342f579bf8eSKris Kennaway 	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
34374664626SKris Kennaway 	BIO_printf(bio_err,"                 command to see what is available\n");
3445c87c606SMark Murray 	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
3455c87c606SMark Murray 	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
3465c87c606SMark Murray 	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
347db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
348db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err,"                 are supported.\n");
349fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
3505c87c606SMark Murray 	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
351fceca8a3SJacques Vidrine #endif
3525740a5e3SKris Kennaway 	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
353db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
354db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
355db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
356db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
357db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
358db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -status           - request certificate status from server\n");
359db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
360*09286989SJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
3611f13597dSJung-uk Kim 	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
3621f13597dSJung-uk Kim # endif
363db522d3aSSimon L. B. Nielsen #endif
3646a599222SSimon L. B. Nielsen 	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
365*09286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
3661f13597dSJung-uk Kim 	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
367*09286989SJung-uk Kim #endif
3681f13597dSJung-uk Kim  	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
3691f13597dSJung-uk Kim  	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
37074664626SKris Kennaway 	}
37174664626SKris Kennaway 
372db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
373db522d3aSSimon L. B. Nielsen 
374db522d3aSSimon L. B. Nielsen /* This is a context that we pass to callbacks */
375db522d3aSSimon L. B. Nielsen typedef struct tlsextctx_st {
376db522d3aSSimon L. B. Nielsen    BIO * biodebug;
377db522d3aSSimon L. B. Nielsen    int ack;
378db522d3aSSimon L. B. Nielsen } tlsextctx;
379db522d3aSSimon L. B. Nielsen 
380db522d3aSSimon L. B. Nielsen 
381db522d3aSSimon L. B. Nielsen static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
382db522d3aSSimon L. B. Nielsen 	{
383db522d3aSSimon L. B. Nielsen 	tlsextctx * p = (tlsextctx *) arg;
384db522d3aSSimon L. B. Nielsen 	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
385db522d3aSSimon L. B. Nielsen 	if (SSL_get_servername_type(s) != -1)
386db522d3aSSimon L. B. Nielsen  	        p->ack = !SSL_session_reused(s) && hn != NULL;
387db522d3aSSimon L. B. Nielsen 	else
388db522d3aSSimon L. B. Nielsen 		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
389db522d3aSSimon L. B. Nielsen 
390db522d3aSSimon L. B. Nielsen 	return SSL_TLSEXT_ERR_OK;
391db522d3aSSimon L. B. Nielsen 	}
3921f13597dSJung-uk Kim 
3931f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
3941f13597dSJung-uk Kim 
3951f13597dSJung-uk Kim /* This is a context that we pass to all callbacks */
3961f13597dSJung-uk Kim typedef struct srp_arg_st
3971f13597dSJung-uk Kim 	{
3981f13597dSJung-uk Kim 	char *srppassin;
3991f13597dSJung-uk Kim 	char *srplogin;
4001f13597dSJung-uk Kim 	int msg;   /* copy from c_msg */
4011f13597dSJung-uk Kim 	int debug; /* copy from c_debug */
4021f13597dSJung-uk Kim 	int amp;   /* allow more groups */
4031f13597dSJung-uk Kim 	int strength /* minimal size for N */ ;
4041f13597dSJung-uk Kim 	} SRP_ARG;
4051f13597dSJung-uk Kim 
4061f13597dSJung-uk Kim #define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
4071f13597dSJung-uk Kim 
4081f13597dSJung-uk Kim static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
4091f13597dSJung-uk Kim 	{
4101f13597dSJung-uk Kim 	BN_CTX *bn_ctx = BN_CTX_new();
4111f13597dSJung-uk Kim 	BIGNUM *p = BN_new();
4121f13597dSJung-uk Kim 	BIGNUM *r = BN_new();
4131f13597dSJung-uk Kim 	int ret =
4141f13597dSJung-uk Kim 		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
4151f13597dSJung-uk Kim 		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
4161f13597dSJung-uk Kim 		p != NULL && BN_rshift1(p, N) &&
4171f13597dSJung-uk Kim 
4181f13597dSJung-uk Kim 		/* p = (N-1)/2 */
4191f13597dSJung-uk Kim 		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
4201f13597dSJung-uk Kim 		r != NULL &&
4211f13597dSJung-uk Kim 
4221f13597dSJung-uk Kim 		/* verify g^((N-1)/2) == -1 (mod N) */
4231f13597dSJung-uk Kim 		BN_mod_exp(r, g, p, N, bn_ctx) &&
4241f13597dSJung-uk Kim 		BN_add_word(r, 1) &&
4251f13597dSJung-uk Kim 		BN_cmp(r, N) == 0;
4261f13597dSJung-uk Kim 
4271f13597dSJung-uk Kim 	if(r)
4281f13597dSJung-uk Kim 		BN_free(r);
4291f13597dSJung-uk Kim 	if(p)
4301f13597dSJung-uk Kim 		BN_free(p);
4311f13597dSJung-uk Kim 	if(bn_ctx)
4321f13597dSJung-uk Kim 		BN_CTX_free(bn_ctx);
4331f13597dSJung-uk Kim 	return ret;
4341f13597dSJung-uk Kim 	}
4351f13597dSJung-uk Kim 
4361f13597dSJung-uk Kim /* This callback is used here for two purposes:
4371f13597dSJung-uk Kim    - extended debugging
4381f13597dSJung-uk Kim    - making some primality tests for unknown groups
4391f13597dSJung-uk Kim    The callback is only called for a non default group.
4401f13597dSJung-uk Kim 
4411f13597dSJung-uk Kim    An application does not need the call back at all if
4421f13597dSJung-uk Kim    only the stanard groups are used.  In real life situations,
4431f13597dSJung-uk Kim    client and server already share well known groups,
4441f13597dSJung-uk Kim    thus there is no need to verify them.
4451f13597dSJung-uk Kim    Furthermore, in case that a server actually proposes a group that
4461f13597dSJung-uk Kim    is not one of those defined in RFC 5054, it is more appropriate
4471f13597dSJung-uk Kim    to add the group to a static list and then compare since
4481f13597dSJung-uk Kim    primality tests are rather cpu consuming.
4491f13597dSJung-uk Kim */
4501f13597dSJung-uk Kim 
4511f13597dSJung-uk Kim static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
4521f13597dSJung-uk Kim 	{
4531f13597dSJung-uk Kim 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
4541f13597dSJung-uk Kim 	BIGNUM *N = NULL, *g = NULL;
4551f13597dSJung-uk Kim 	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
4561f13597dSJung-uk Kim 		return 0;
4571f13597dSJung-uk Kim 	if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
4581f13597dSJung-uk Kim 		{
4591f13597dSJung-uk Kim     		BIO_printf(bio_err, "SRP parameters:\n");
4601f13597dSJung-uk Kim 		BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
4611f13597dSJung-uk Kim 		BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
4621f13597dSJung-uk Kim 		BIO_printf(bio_err,"\n");
4631f13597dSJung-uk Kim 		}
4641f13597dSJung-uk Kim 
4651f13597dSJung-uk Kim 	if (SRP_check_known_gN_param(g,N))
4661f13597dSJung-uk Kim 		return 1;
4671f13597dSJung-uk Kim 
4681f13597dSJung-uk Kim 	if (srp_arg->amp == 1)
4691f13597dSJung-uk Kim 		{
4701f13597dSJung-uk Kim 		if (srp_arg->debug)
4711f13597dSJung-uk Kim 			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
4721f13597dSJung-uk Kim 
4731f13597dSJung-uk Kim /* The srp_moregroups is a real debugging feature.
4741f13597dSJung-uk Kim    Implementors should rather add the value to the known ones.
4751f13597dSJung-uk Kim    The minimal size has already been tested.
4761f13597dSJung-uk Kim */
4771f13597dSJung-uk Kim 		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
4781f13597dSJung-uk Kim 			return 1;
4791f13597dSJung-uk Kim 		}
4801f13597dSJung-uk Kim 	BIO_printf(bio_err, "SRP param N and g rejected.\n");
4811f13597dSJung-uk Kim 	return 0;
4821f13597dSJung-uk Kim 	}
4831f13597dSJung-uk Kim 
4841f13597dSJung-uk Kim #define PWD_STRLEN 1024
4851f13597dSJung-uk Kim 
4861f13597dSJung-uk Kim static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
4871f13597dSJung-uk Kim 	{
4881f13597dSJung-uk Kim 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
4891f13597dSJung-uk Kim 	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
4901f13597dSJung-uk Kim 	PW_CB_DATA cb_tmp;
4911f13597dSJung-uk Kim 	int l;
4921f13597dSJung-uk Kim 
4931f13597dSJung-uk Kim 	cb_tmp.password = (char *)srp_arg->srppassin;
4941f13597dSJung-uk Kim 	cb_tmp.prompt_info = "SRP user";
4951f13597dSJung-uk Kim 	if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
4961f13597dSJung-uk Kim 		{
4971f13597dSJung-uk Kim 		BIO_printf (bio_err, "Can't read Password\n");
4981f13597dSJung-uk Kim 		OPENSSL_free(pass);
4991f13597dSJung-uk Kim 		return NULL;
5001f13597dSJung-uk Kim 		}
5011f13597dSJung-uk Kim 	*(pass+l)= '\0';
5021f13597dSJung-uk Kim 
5031f13597dSJung-uk Kim 	return pass;
5041f13597dSJung-uk Kim 	}
5051f13597dSJung-uk Kim 
506db522d3aSSimon L. B. Nielsen #endif
507*09286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
5081f13597dSJung-uk Kim 	char *srtp_profiles = NULL;
509*09286989SJung-uk Kim #endif
5101f13597dSJung-uk Kim 
5111f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
5121f13597dSJung-uk Kim /* This the context that we pass to next_proto_cb */
5131f13597dSJung-uk Kim typedef struct tlsextnextprotoctx_st {
5141f13597dSJung-uk Kim 	unsigned char *data;
5151f13597dSJung-uk Kim 	unsigned short len;
5161f13597dSJung-uk Kim 	int status;
5171f13597dSJung-uk Kim } tlsextnextprotoctx;
5181f13597dSJung-uk Kim 
5191f13597dSJung-uk Kim static tlsextnextprotoctx next_proto;
5201f13597dSJung-uk Kim 
5211f13597dSJung-uk Kim static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
5221f13597dSJung-uk Kim 	{
5231f13597dSJung-uk Kim 	tlsextnextprotoctx *ctx = arg;
5241f13597dSJung-uk Kim 
5251f13597dSJung-uk Kim 	if (!c_quiet)
5261f13597dSJung-uk Kim 		{
5271f13597dSJung-uk Kim 		/* We can assume that |in| is syntactically valid. */
5281f13597dSJung-uk Kim 		unsigned i;
5291f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "Protocols advertised by server: ");
5301f13597dSJung-uk Kim 		for (i = 0; i < inlen; )
5311f13597dSJung-uk Kim 			{
5321f13597dSJung-uk Kim 			if (i)
5331f13597dSJung-uk Kim 				BIO_write(bio_c_out, ", ", 2);
5341f13597dSJung-uk Kim 			BIO_write(bio_c_out, &in[i + 1], in[i]);
5351f13597dSJung-uk Kim 			i += in[i] + 1;
5361f13597dSJung-uk Kim 			}
5371f13597dSJung-uk Kim 		BIO_write(bio_c_out, "\n", 1);
5381f13597dSJung-uk Kim 		}
5391f13597dSJung-uk Kim 
5401f13597dSJung-uk Kim 	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
5411f13597dSJung-uk Kim 	return SSL_TLSEXT_ERR_OK;
5421f13597dSJung-uk Kim 	}
543*09286989SJung-uk Kim # endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
5441f13597dSJung-uk Kim #endif
5451f13597dSJung-uk Kim 
5465471f83eSSimon L. B. Nielsen enum
5475471f83eSSimon L. B. Nielsen {
5485471f83eSSimon L. B. Nielsen 	PROTO_OFF	= 0,
5495471f83eSSimon L. B. Nielsen 	PROTO_SMTP,
5505471f83eSSimon L. B. Nielsen 	PROTO_POP3,
5515471f83eSSimon L. B. Nielsen 	PROTO_IMAP,
552db522d3aSSimon L. B. Nielsen 	PROTO_FTP,
553db522d3aSSimon L. B. Nielsen 	PROTO_XMPP
5545471f83eSSimon L. B. Nielsen };
5555471f83eSSimon L. B. Nielsen 
556f579bf8eSKris Kennaway int MAIN(int, char **);
557f579bf8eSKris Kennaway 
55874664626SKris Kennaway int MAIN(int argc, char **argv)
55974664626SKris Kennaway 	{
5601f13597dSJung-uk Kim 	unsigned int off=0, clr=0;
5611f13597dSJung-uk Kim 	SSL *con=NULL;
5621f13597dSJung-uk Kim #ifndef OPENSSL_NO_KRB5
5631f13597dSJung-uk Kim 	KSSL_CTX *kctx;
5641f13597dSJung-uk Kim #endif
56574664626SKris Kennaway 	int s,k,width,state=0;
5665c87c606SMark Murray 	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
56774664626SKris Kennaway 	int cbuf_len,cbuf_off;
56874664626SKris Kennaway 	int sbuf_len,sbuf_off;
56974664626SKris Kennaway 	fd_set readfds,writefds;
57074664626SKris Kennaway 	short port=PORT;
57174664626SKris Kennaway 	int full_log=1;
57274664626SKris Kennaway 	char *host=SSL_HOST_NAME;
57374664626SKris Kennaway 	char *cert_file=NULL,*key_file=NULL;
5743b4e3dcbSSimon L. B. Nielsen 	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
5753b4e3dcbSSimon L. B. Nielsen 	char *passarg = NULL, *pass = NULL;
5763b4e3dcbSSimon L. B. Nielsen 	X509 *cert = NULL;
5773b4e3dcbSSimon L. B. Nielsen 	EVP_PKEY *key = NULL;
57874664626SKris Kennaway 	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
57974664626SKris Kennaway 	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
58074664626SKris Kennaway 	int crlf=0;
58174664626SKris Kennaway 	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
58274664626SKris Kennaway 	SSL_CTX *ctx=NULL;
58374664626SKris Kennaway 	int ret=1,in_init=1,i,nbio_test=0;
5845471f83eSSimon L. B. Nielsen 	int starttls_proto = PROTO_OFF;
5851f13597dSJung-uk Kim 	int prexit = 0;
5861f13597dSJung-uk Kim 	X509_VERIFY_PARAM *vpm = NULL;
5871f13597dSJung-uk Kim 	int badarg = 0;
5881f13597dSJung-uk Kim 	const SSL_METHOD *meth=NULL;
5891f13597dSJung-uk Kim 	int socket_type=SOCK_STREAM;
59074664626SKris Kennaway 	BIO *sbio;
5915740a5e3SKris Kennaway 	char *inrand=NULL;
5925471f83eSSimon L. B. Nielsen 	int mbuf_len=0;
5936a599222SSimon L. B. Nielsen 	struct timeval timeout, *timeoutp;
594fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
5955c87c606SMark Murray 	char *engine_id=NULL;
596db522d3aSSimon L. B. Nielsen 	char *ssl_client_engine_id=NULL;
597db522d3aSSimon L. B. Nielsen 	ENGINE *ssl_client_engine=NULL;
598fceca8a3SJacques Vidrine #endif
599db522d3aSSimon L. B. Nielsen 	ENGINE *e=NULL;
6001f13597dSJung-uk Kim #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
601f579bf8eSKris Kennaway 	struct timeval tv;
6021f13597dSJung-uk Kim #if defined(OPENSSL_SYS_BEOS_R5)
6031f13597dSJung-uk Kim 	int stdin_set = 0;
604f579bf8eSKris Kennaway #endif
6051f13597dSJung-uk Kim #endif
606db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
607db522d3aSSimon L. B. Nielsen 	char *servername = NULL;
608db522d3aSSimon L. B. Nielsen         tlsextctx tlsextcbp =
609db522d3aSSimon L. B. Nielsen         {NULL,0};
6101f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
6111f13597dSJung-uk Kim 	const char *next_proto_neg_in = NULL;
6121f13597dSJung-uk Kim # endif
613db522d3aSSimon L. B. Nielsen #endif
614db522d3aSSimon L. B. Nielsen 	char *sess_in = NULL;
615db522d3aSSimon L. B. Nielsen 	char *sess_out = NULL;
6163b4e3dcbSSimon L. B. Nielsen 	struct sockaddr peer;
6173b4e3dcbSSimon L. B. Nielsen 	int peerlen = sizeof(peer);
6183b4e3dcbSSimon L. B. Nielsen 	int enable_timeouts = 0 ;
6196a599222SSimon L. B. Nielsen 	long socket_mtu = 0;
620db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
621db522d3aSSimon L. B. Nielsen 	char *jpake_secret = NULL;
622db522d3aSSimon L. B. Nielsen #endif
6231f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
6241f13597dSJung-uk Kim 	char * srppass = NULL;
6251f13597dSJung-uk Kim 	int srp_lateuser = 0;
6261f13597dSJung-uk Kim 	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
6271f13597dSJung-uk Kim #endif
6283b4e3dcbSSimon L. B. Nielsen 
62974664626SKris Kennaway 	meth=SSLv23_client_method();
63074664626SKris Kennaway 
63174664626SKris Kennaway 	apps_startup();
63274664626SKris Kennaway 	c_Pause=0;
63374664626SKris Kennaway 	c_quiet=0;
634f579bf8eSKris Kennaway 	c_ign_eof=0;
63574664626SKris Kennaway 	c_debug=0;
6365c87c606SMark Murray 	c_msg=0;
63774664626SKris Kennaway 	c_showcerts=0;
63874664626SKris Kennaway 
63974664626SKris Kennaway 	if (bio_err == NULL)
64074664626SKris Kennaway 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
64174664626SKris Kennaway 
6425c87c606SMark Murray 	if (!load_config(bio_err, NULL))
6435c87c606SMark Murray 		goto end;
6445c87c606SMark Murray 
645ddd58736SKris Kennaway 	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
6465c87c606SMark Murray 		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
6475c87c606SMark Murray 		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
64874664626SKris Kennaway 		{
64974664626SKris Kennaway 		BIO_printf(bio_err,"out of memory\n");
65074664626SKris Kennaway 		goto end;
65174664626SKris Kennaway 		}
65274664626SKris Kennaway 
65374664626SKris Kennaway 	verify_depth=0;
65474664626SKris Kennaway 	verify_error=X509_V_OK;
65574664626SKris Kennaway #ifdef FIONBIO
65674664626SKris Kennaway 	c_nbio=0;
65774664626SKris Kennaway #endif
65874664626SKris Kennaway 
65974664626SKris Kennaway 	argc--;
66074664626SKris Kennaway 	argv++;
66174664626SKris Kennaway 	while (argc >= 1)
66274664626SKris Kennaway 		{
66374664626SKris Kennaway 		if	(strcmp(*argv,"-host") == 0)
66474664626SKris Kennaway 			{
66574664626SKris Kennaway 			if (--argc < 1) goto bad;
66674664626SKris Kennaway 			host= *(++argv);
66774664626SKris Kennaway 			}
66874664626SKris Kennaway 		else if	(strcmp(*argv,"-port") == 0)
66974664626SKris Kennaway 			{
67074664626SKris Kennaway 			if (--argc < 1) goto bad;
67174664626SKris Kennaway 			port=atoi(*(++argv));
67274664626SKris Kennaway 			if (port == 0) goto bad;
67374664626SKris Kennaway 			}
67474664626SKris Kennaway 		else if (strcmp(*argv,"-connect") == 0)
67574664626SKris Kennaway 			{
67674664626SKris Kennaway 			if (--argc < 1) goto bad;
67774664626SKris Kennaway 			if (!extract_host_port(*(++argv),&host,NULL,&port))
67874664626SKris Kennaway 				goto bad;
67974664626SKris Kennaway 			}
68074664626SKris Kennaway 		else if	(strcmp(*argv,"-verify") == 0)
68174664626SKris Kennaway 			{
68274664626SKris Kennaway 			verify=SSL_VERIFY_PEER;
68374664626SKris Kennaway 			if (--argc < 1) goto bad;
68474664626SKris Kennaway 			verify_depth=atoi(*(++argv));
68574664626SKris Kennaway 			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
68674664626SKris Kennaway 			}
68774664626SKris Kennaway 		else if	(strcmp(*argv,"-cert") == 0)
68874664626SKris Kennaway 			{
68974664626SKris Kennaway 			if (--argc < 1) goto bad;
69074664626SKris Kennaway 			cert_file= *(++argv);
69174664626SKris Kennaway 			}
692db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-sess_out") == 0)
693db522d3aSSimon L. B. Nielsen 			{
694db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
695db522d3aSSimon L. B. Nielsen 			sess_out = *(++argv);
696db522d3aSSimon L. B. Nielsen 			}
697db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-sess_in") == 0)
698db522d3aSSimon L. B. Nielsen 			{
699db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
700db522d3aSSimon L. B. Nielsen 			sess_in = *(++argv);
701db522d3aSSimon L. B. Nielsen 			}
7023b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-certform") == 0)
7033b4e3dcbSSimon L. B. Nielsen 			{
7043b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
7053b4e3dcbSSimon L. B. Nielsen 			cert_format = str2fmt(*(++argv));
7063b4e3dcbSSimon L. B. Nielsen 			}
7071f13597dSJung-uk Kim 		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
7081f13597dSJung-uk Kim 			{
7091f13597dSJung-uk Kim 			if (badarg)
7101f13597dSJung-uk Kim 				goto bad;
7111f13597dSJung-uk Kim 			continue;
7121f13597dSJung-uk Kim 			}
7131f13597dSJung-uk Kim 		else if (strcmp(*argv,"-verify_return_error") == 0)
7141f13597dSJung-uk Kim 			verify_return_error = 1;
715f579bf8eSKris Kennaway 		else if	(strcmp(*argv,"-prexit") == 0)
716f579bf8eSKris Kennaway 			prexit=1;
71774664626SKris Kennaway 		else if	(strcmp(*argv,"-crlf") == 0)
71874664626SKris Kennaway 			crlf=1;
71974664626SKris Kennaway 		else if	(strcmp(*argv,"-quiet") == 0)
720f579bf8eSKris Kennaway 			{
72174664626SKris Kennaway 			c_quiet=1;
722f579bf8eSKris Kennaway 			c_ign_eof=1;
723f579bf8eSKris Kennaway 			}
724f579bf8eSKris Kennaway 		else if	(strcmp(*argv,"-ign_eof") == 0)
725f579bf8eSKris Kennaway 			c_ign_eof=1;
726db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_ign_eof") == 0)
727db522d3aSSimon L. B. Nielsen 			c_ign_eof=0;
72874664626SKris Kennaway 		else if	(strcmp(*argv,"-pause") == 0)
72974664626SKris Kennaway 			c_Pause=1;
73074664626SKris Kennaway 		else if	(strcmp(*argv,"-debug") == 0)
73174664626SKris Kennaway 			c_debug=1;
732db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
733db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-tlsextdebug") == 0)
734db522d3aSSimon L. B. Nielsen 			c_tlsextdebug=1;
735db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-status") == 0)
736db522d3aSSimon L. B. Nielsen 			c_status_req=1;
737db522d3aSSimon L. B. Nielsen #endif
7383b4e3dcbSSimon L. B. Nielsen #ifdef WATT32
7393b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-wdebug") == 0)
7403b4e3dcbSSimon L. B. Nielsen 			dbug_init();
7413b4e3dcbSSimon L. B. Nielsen #endif
7425c87c606SMark Murray 		else if	(strcmp(*argv,"-msg") == 0)
7435c87c606SMark Murray 			c_msg=1;
74474664626SKris Kennaway 		else if	(strcmp(*argv,"-showcerts") == 0)
74574664626SKris Kennaway 			c_showcerts=1;
74674664626SKris Kennaway 		else if	(strcmp(*argv,"-nbio_test") == 0)
74774664626SKris Kennaway 			nbio_test=1;
74874664626SKris Kennaway 		else if	(strcmp(*argv,"-state") == 0)
74974664626SKris Kennaway 			state=1;
7501f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
7511f13597dSJung-uk Kim                 else if (strcmp(*argv,"-psk_identity") == 0)
7521f13597dSJung-uk Kim 			{
7531f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7541f13597dSJung-uk Kim 			psk_identity=*(++argv);
7551f13597dSJung-uk Kim 			}
7561f13597dSJung-uk Kim                 else if (strcmp(*argv,"-psk") == 0)
7571f13597dSJung-uk Kim 			{
7581f13597dSJung-uk Kim                         size_t j;
7591f13597dSJung-uk Kim 
7601f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7611f13597dSJung-uk Kim 			psk_key=*(++argv);
7621f13597dSJung-uk Kim 			for (j = 0; j < strlen(psk_key); j++)
7631f13597dSJung-uk Kim                                 {
7641f13597dSJung-uk Kim                                 if (isxdigit((unsigned char)psk_key[j]))
7651f13597dSJung-uk Kim                                         continue;
7661f13597dSJung-uk Kim                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
7671f13597dSJung-uk Kim                                 goto bad;
7681f13597dSJung-uk Kim                                 }
7691f13597dSJung-uk Kim 			}
7701f13597dSJung-uk Kim #endif
7711f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
7721f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srpuser") == 0)
7731f13597dSJung-uk Kim 			{
7741f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7751f13597dSJung-uk Kim 			srp_arg.srplogin= *(++argv);
7761f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7771f13597dSJung-uk Kim 			}
7781f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srppass") == 0)
7791f13597dSJung-uk Kim 			{
7801f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7811f13597dSJung-uk Kim 			srppass= *(++argv);
7821f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7831f13597dSJung-uk Kim 			}
7841f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srp_strength") == 0)
7851f13597dSJung-uk Kim 			{
7861f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7871f13597dSJung-uk Kim 			srp_arg.strength=atoi(*(++argv));
7881f13597dSJung-uk Kim 			BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
7891f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7901f13597dSJung-uk Kim 			}
7911f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srp_lateuser") == 0)
7921f13597dSJung-uk Kim 			{
7931f13597dSJung-uk Kim 			srp_lateuser= 1;
7941f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7951f13597dSJung-uk Kim 			}
7961f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-srp_moregroups") == 0)
7971f13597dSJung-uk Kim 			{
7981f13597dSJung-uk Kim 			srp_arg.amp=1;
7991f13597dSJung-uk Kim 			meth=TLSv1_client_method();
8001f13597dSJung-uk Kim 			}
8011f13597dSJung-uk Kim #endif
8025c87c606SMark Murray #ifndef OPENSSL_NO_SSL2
80374664626SKris Kennaway 		else if	(strcmp(*argv,"-ssl2") == 0)
80474664626SKris Kennaway 			meth=SSLv2_client_method();
80574664626SKris Kennaway #endif
8065c87c606SMark Murray #ifndef OPENSSL_NO_SSL3
80774664626SKris Kennaway 		else if	(strcmp(*argv,"-ssl3") == 0)
80874664626SKris Kennaway 			meth=SSLv3_client_method();
80974664626SKris Kennaway #endif
8105c87c606SMark Murray #ifndef OPENSSL_NO_TLS1
8111f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-tls1_2") == 0)
8121f13597dSJung-uk Kim 			meth=TLSv1_2_client_method();
8131f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-tls1_1") == 0)
8141f13597dSJung-uk Kim 			meth=TLSv1_1_client_method();
81574664626SKris Kennaway 		else if	(strcmp(*argv,"-tls1") == 0)
81674664626SKris Kennaway 			meth=TLSv1_client_method();
81774664626SKris Kennaway #endif
8183b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_DTLS1
8193b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-dtls1") == 0)
8203b4e3dcbSSimon L. B. Nielsen 			{
8213b4e3dcbSSimon L. B. Nielsen 			meth=DTLSv1_client_method();
8221f13597dSJung-uk Kim 			socket_type=SOCK_DGRAM;
8233b4e3dcbSSimon L. B. Nielsen 			}
8243b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-timeout") == 0)
8253b4e3dcbSSimon L. B. Nielsen 			enable_timeouts=1;
8263b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-mtu") == 0)
8273b4e3dcbSSimon L. B. Nielsen 			{
8283b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8296a599222SSimon L. B. Nielsen 			socket_mtu = atol(*(++argv));
8303b4e3dcbSSimon L. B. Nielsen 			}
8313b4e3dcbSSimon L. B. Nielsen #endif
83274664626SKris Kennaway 		else if (strcmp(*argv,"-bugs") == 0)
83374664626SKris Kennaway 			bugs=1;
8343b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-keyform") == 0)
8353b4e3dcbSSimon L. B. Nielsen 			{
8363b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8373b4e3dcbSSimon L. B. Nielsen 			key_format = str2fmt(*(++argv));
8383b4e3dcbSSimon L. B. Nielsen 			}
8393b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-pass") == 0)
8403b4e3dcbSSimon L. B. Nielsen 			{
8413b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8423b4e3dcbSSimon L. B. Nielsen 			passarg = *(++argv);
8433b4e3dcbSSimon L. B. Nielsen 			}
84474664626SKris Kennaway 		else if	(strcmp(*argv,"-key") == 0)
84574664626SKris Kennaway 			{
84674664626SKris Kennaway 			if (--argc < 1) goto bad;
84774664626SKris Kennaway 			key_file= *(++argv);
84874664626SKris Kennaway 			}
84974664626SKris Kennaway 		else if	(strcmp(*argv,"-reconnect") == 0)
85074664626SKris Kennaway 			{
85174664626SKris Kennaway 			reconnect=5;
85274664626SKris Kennaway 			}
85374664626SKris Kennaway 		else if	(strcmp(*argv,"-CApath") == 0)
85474664626SKris Kennaway 			{
85574664626SKris Kennaway 			if (--argc < 1) goto bad;
85674664626SKris Kennaway 			CApath= *(++argv);
85774664626SKris Kennaway 			}
85874664626SKris Kennaway 		else if	(strcmp(*argv,"-CAfile") == 0)
85974664626SKris Kennaway 			{
86074664626SKris Kennaway 			if (--argc < 1) goto bad;
86174664626SKris Kennaway 			CAfile= *(++argv);
86274664626SKris Kennaway 			}
8631f13597dSJung-uk Kim 		else if (strcmp(*argv,"-no_tls1_2") == 0)
8641f13597dSJung-uk Kim 			off|=SSL_OP_NO_TLSv1_2;
8651f13597dSJung-uk Kim 		else if (strcmp(*argv,"-no_tls1_1") == 0)
8661f13597dSJung-uk Kim 			off|=SSL_OP_NO_TLSv1_1;
86774664626SKris Kennaway 		else if (strcmp(*argv,"-no_tls1") == 0)
86874664626SKris Kennaway 			off|=SSL_OP_NO_TLSv1;
86974664626SKris Kennaway 		else if (strcmp(*argv,"-no_ssl3") == 0)
87074664626SKris Kennaway 			off|=SSL_OP_NO_SSLv3;
87174664626SKris Kennaway 		else if (strcmp(*argv,"-no_ssl2") == 0)
87274664626SKris Kennaway 			off|=SSL_OP_NO_SSLv2;
8731f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-no_comp") == 0)
8741f13597dSJung-uk Kim 			{ off|=SSL_OP_NO_COMPRESSION; }
875db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
876db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_ticket") == 0)
877db522d3aSSimon L. B. Nielsen 			{ off|=SSL_OP_NO_TICKET; }
8781f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
8791f13597dSJung-uk Kim 		else if (strcmp(*argv,"-nextprotoneg") == 0)
8801f13597dSJung-uk Kim 			{
8811f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
8821f13597dSJung-uk Kim 			next_proto_neg_in = *(++argv);
8831f13597dSJung-uk Kim 			}
8841f13597dSJung-uk Kim # endif
885db522d3aSSimon L. B. Nielsen #endif
8865c87c606SMark Murray 		else if (strcmp(*argv,"-serverpref") == 0)
8875c87c606SMark Murray 			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
8886a599222SSimon L. B. Nielsen 		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
8896a599222SSimon L. B. Nielsen 			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
8906a599222SSimon L. B. Nielsen 		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
8916a599222SSimon L. B. Nielsen 			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
8926a599222SSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
8936a599222SSimon L. B. Nielsen 			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
89474664626SKris Kennaway 		else if	(strcmp(*argv,"-cipher") == 0)
89574664626SKris Kennaway 			{
89674664626SKris Kennaway 			if (--argc < 1) goto bad;
89774664626SKris Kennaway 			cipher= *(++argv);
89874664626SKris Kennaway 			}
89974664626SKris Kennaway #ifdef FIONBIO
90074664626SKris Kennaway 		else if (strcmp(*argv,"-nbio") == 0)
90174664626SKris Kennaway 			{ c_nbio=1; }
90274664626SKris Kennaway #endif
9035c87c606SMark Murray 		else if	(strcmp(*argv,"-starttls") == 0)
9045c87c606SMark Murray 			{
9055c87c606SMark Murray 			if (--argc < 1) goto bad;
9065c87c606SMark Murray 			++argv;
9075c87c606SMark Murray 			if (strcmp(*argv,"smtp") == 0)
9085471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_SMTP;
90950ef0093SJacques Vidrine 			else if (strcmp(*argv,"pop3") == 0)
9105471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_POP3;
9115471f83eSSimon L. B. Nielsen 			else if (strcmp(*argv,"imap") == 0)
9125471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_IMAP;
9135471f83eSSimon L. B. Nielsen 			else if (strcmp(*argv,"ftp") == 0)
9145471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_FTP;
915db522d3aSSimon L. B. Nielsen 			else if (strcmp(*argv, "xmpp") == 0)
916db522d3aSSimon L. B. Nielsen 				starttls_proto = PROTO_XMPP;
9175c87c606SMark Murray 			else
9185c87c606SMark Murray 				goto bad;
9195c87c606SMark Murray 			}
920fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
9215c87c606SMark Murray 		else if	(strcmp(*argv,"-engine") == 0)
9225c87c606SMark Murray 			{
9235c87c606SMark Murray 			if (--argc < 1) goto bad;
9245c87c606SMark Murray 			engine_id = *(++argv);
9255c87c606SMark Murray 			}
926db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
927db522d3aSSimon L. B. Nielsen 			{
928db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
929db522d3aSSimon L. B. Nielsen 			ssl_client_engine_id = *(++argv);
930db522d3aSSimon L. B. Nielsen 			}
931fceca8a3SJacques Vidrine #endif
9325740a5e3SKris Kennaway 		else if (strcmp(*argv,"-rand") == 0)
9335740a5e3SKris Kennaway 			{
9345740a5e3SKris Kennaway 			if (--argc < 1) goto bad;
9355740a5e3SKris Kennaway 			inrand= *(++argv);
9365740a5e3SKris Kennaway 			}
937db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
938db522d3aSSimon L. B. Nielsen 		else if (strcmp(*argv,"-servername") == 0)
939db522d3aSSimon L. B. Nielsen 			{
940db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
941db522d3aSSimon L. B. Nielsen 			servername= *(++argv);
942db522d3aSSimon L. B. Nielsen 			/* meth=TLSv1_client_method(); */
943db522d3aSSimon L. B. Nielsen 			}
944db522d3aSSimon L. B. Nielsen #endif
945db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
946db522d3aSSimon L. B. Nielsen 		else if (strcmp(*argv,"-jpake") == 0)
947db522d3aSSimon L. B. Nielsen 			{
948db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
949db522d3aSSimon L. B. Nielsen 			jpake_secret = *++argv;
950db522d3aSSimon L. B. Nielsen 			}
951db522d3aSSimon L. B. Nielsen #endif
952*09286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
9531f13597dSJung-uk Kim 		else if (strcmp(*argv,"-use_srtp") == 0)
9541f13597dSJung-uk Kim 			{
9551f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9561f13597dSJung-uk Kim 			srtp_profiles = *(++argv);
9571f13597dSJung-uk Kim 			}
958*09286989SJung-uk Kim #endif
9591f13597dSJung-uk Kim 		else if (strcmp(*argv,"-keymatexport") == 0)
9601f13597dSJung-uk Kim 			{
9611f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9621f13597dSJung-uk Kim 			keymatexportlabel= *(++argv);
9631f13597dSJung-uk Kim 			}
9641f13597dSJung-uk Kim 		else if (strcmp(*argv,"-keymatexportlen") == 0)
9651f13597dSJung-uk Kim 			{
9661f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9671f13597dSJung-uk Kim 			keymatexportlen=atoi(*(++argv));
9681f13597dSJung-uk Kim 			if (keymatexportlen == 0) goto bad;
9691f13597dSJung-uk Kim 			}
97074664626SKris Kennaway                 else
97174664626SKris Kennaway 			{
97274664626SKris Kennaway 			BIO_printf(bio_err,"unknown option %s\n",*argv);
97374664626SKris Kennaway 			badop=1;
97474664626SKris Kennaway 			break;
97574664626SKris Kennaway 			}
97674664626SKris Kennaway 		argc--;
97774664626SKris Kennaway 		argv++;
97874664626SKris Kennaway 		}
97974664626SKris Kennaway 	if (badop)
98074664626SKris Kennaway 		{
98174664626SKris Kennaway bad:
98274664626SKris Kennaway 		sc_usage();
98374664626SKris Kennaway 		goto end;
98474664626SKris Kennaway 		}
98574664626SKris Kennaway 
9861f13597dSJung-uk Kim #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
9871f13597dSJung-uk Kim 	if (jpake_secret)
9881f13597dSJung-uk Kim 		{
9891f13597dSJung-uk Kim 		if (psk_key)
9901f13597dSJung-uk Kim 			{
9911f13597dSJung-uk Kim 			BIO_printf(bio_err,
9921f13597dSJung-uk Kim 				   "Can't use JPAKE and PSK together\n");
9931f13597dSJung-uk Kim 			goto end;
9941f13597dSJung-uk Kim 			}
9951f13597dSJung-uk Kim 		psk_identity = "JPAKE";
9961f13597dSJung-uk Kim 		if (cipher)
9971f13597dSJung-uk Kim 			{
9981f13597dSJung-uk Kim 			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
9991f13597dSJung-uk Kim 			goto end;
10001f13597dSJung-uk Kim 			}
10011f13597dSJung-uk Kim 		cipher = "PSK";
10021f13597dSJung-uk Kim 		}
10031f13597dSJung-uk Kim #endif
10041f13597dSJung-uk Kim 
10055c87c606SMark Murray 	OpenSSL_add_ssl_algorithms();
10065c87c606SMark Murray 	SSL_load_error_strings();
10075c87c606SMark Murray 
10081f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
10091f13597dSJung-uk Kim 	next_proto.status = -1;
10101f13597dSJung-uk Kim 	if (next_proto_neg_in)
10111f13597dSJung-uk Kim 		{
10121f13597dSJung-uk Kim 		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
10131f13597dSJung-uk Kim 		if (next_proto.data == NULL)
10141f13597dSJung-uk Kim 			{
10151f13597dSJung-uk Kim 			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
10161f13597dSJung-uk Kim 			goto end;
10171f13597dSJung-uk Kim 			}
10181f13597dSJung-uk Kim 		}
10191f13597dSJung-uk Kim 	else
10201f13597dSJung-uk Kim 		next_proto.data = NULL;
10211f13597dSJung-uk Kim #endif
10221f13597dSJung-uk Kim 
1023fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
10245c87c606SMark Murray         e = setup_engine(bio_err, engine_id, 1);
1025db522d3aSSimon L. B. Nielsen 	if (ssl_client_engine_id)
1026db522d3aSSimon L. B. Nielsen 		{
1027db522d3aSSimon L. B. Nielsen 		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1028db522d3aSSimon L. B. Nielsen 		if (!ssl_client_engine)
1029db522d3aSSimon L. B. Nielsen 			{
1030db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err,
1031db522d3aSSimon L. B. Nielsen 					"Error getting client auth engine\n");
1032db522d3aSSimon L. B. Nielsen 			goto end;
1033db522d3aSSimon L. B. Nielsen 			}
1034db522d3aSSimon L. B. Nielsen 		}
10351f13597dSJung-uk Kim 
1036fceca8a3SJacques Vidrine #endif
10373b4e3dcbSSimon L. B. Nielsen 	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
10383b4e3dcbSSimon L. B. Nielsen 		{
10393b4e3dcbSSimon L. B. Nielsen 		BIO_printf(bio_err, "Error getting password\n");
10403b4e3dcbSSimon L. B. Nielsen 		goto end;
10413b4e3dcbSSimon L. B. Nielsen 		}
10423b4e3dcbSSimon L. B. Nielsen 
10433b4e3dcbSSimon L. B. Nielsen 	if (key_file == NULL)
10443b4e3dcbSSimon L. B. Nielsen 		key_file = cert_file;
10453b4e3dcbSSimon L. B. Nielsen 
10463b4e3dcbSSimon L. B. Nielsen 
10473b4e3dcbSSimon L. B. Nielsen 	if (key_file)
10483b4e3dcbSSimon L. B. Nielsen 
10493b4e3dcbSSimon L. B. Nielsen 		{
10503b4e3dcbSSimon L. B. Nielsen 
10513b4e3dcbSSimon L. B. Nielsen 		key = load_key(bio_err, key_file, key_format, 0, pass, e,
10523b4e3dcbSSimon L. B. Nielsen 			       "client certificate private key file");
10533b4e3dcbSSimon L. B. Nielsen 		if (!key)
10543b4e3dcbSSimon L. B. Nielsen 			{
10553b4e3dcbSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
10563b4e3dcbSSimon L. B. Nielsen 			goto end;
10573b4e3dcbSSimon L. B. Nielsen 			}
10583b4e3dcbSSimon L. B. Nielsen 
10593b4e3dcbSSimon L. B. Nielsen 		}
10603b4e3dcbSSimon L. B. Nielsen 
10613b4e3dcbSSimon L. B. Nielsen 	if (cert_file)
10623b4e3dcbSSimon L. B. Nielsen 
10633b4e3dcbSSimon L. B. Nielsen 		{
10643b4e3dcbSSimon L. B. Nielsen 		cert = load_cert(bio_err,cert_file,cert_format,
10653b4e3dcbSSimon L. B. Nielsen 				NULL, e, "client certificate file");
10663b4e3dcbSSimon L. B. Nielsen 
10673b4e3dcbSSimon L. B. Nielsen 		if (!cert)
10683b4e3dcbSSimon L. B. Nielsen 			{
10693b4e3dcbSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
10703b4e3dcbSSimon L. B. Nielsen 			goto end;
10713b4e3dcbSSimon L. B. Nielsen 			}
10723b4e3dcbSSimon L. B. Nielsen 		}
10735c87c606SMark Murray 
10745740a5e3SKris Kennaway 	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
10755740a5e3SKris Kennaway 		&& !RAND_status())
10765740a5e3SKris Kennaway 		{
10775740a5e3SKris Kennaway 		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
10785740a5e3SKris Kennaway 		}
10795740a5e3SKris Kennaway 	if (inrand != NULL)
10805740a5e3SKris Kennaway 		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
10815740a5e3SKris Kennaway 			app_RAND_load_files(inrand));
1082f579bf8eSKris Kennaway 
108374664626SKris Kennaway 	if (bio_c_out == NULL)
108474664626SKris Kennaway 		{
10855c87c606SMark Murray 		if (c_quiet && !c_debug && !c_msg)
108674664626SKris Kennaway 			{
108774664626SKris Kennaway 			bio_c_out=BIO_new(BIO_s_null());
108874664626SKris Kennaway 			}
108974664626SKris Kennaway 		else
109074664626SKris Kennaway 			{
109174664626SKris Kennaway 			if (bio_c_out == NULL)
109274664626SKris Kennaway 				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
109374664626SKris Kennaway 			}
109474664626SKris Kennaway 		}
109574664626SKris Kennaway 
10961f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
10971f13597dSJung-uk Kim 	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
10981f13597dSJung-uk Kim 		{
10991f13597dSJung-uk Kim 		BIO_printf(bio_err, "Error getting password\n");
11001f13597dSJung-uk Kim 		goto end;
11011f13597dSJung-uk Kim 		}
11021f13597dSJung-uk Kim #endif
11031f13597dSJung-uk Kim 
110474664626SKris Kennaway 	ctx=SSL_CTX_new(meth);
110574664626SKris Kennaway 	if (ctx == NULL)
110674664626SKris Kennaway 		{
110774664626SKris Kennaway 		ERR_print_errors(bio_err);
110874664626SKris Kennaway 		goto end;
110974664626SKris Kennaway 		}
111074664626SKris Kennaway 
11111f13597dSJung-uk Kim 	if (vpm)
11121f13597dSJung-uk Kim 		SSL_CTX_set1_param(ctx, vpm);
11131f13597dSJung-uk Kim 
1114db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_ENGINE
1115db522d3aSSimon L. B. Nielsen 	if (ssl_client_engine)
1116db522d3aSSimon L. B. Nielsen 		{
1117db522d3aSSimon L. B. Nielsen 		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1118db522d3aSSimon L. B. Nielsen 			{
1119db522d3aSSimon L. B. Nielsen 			BIO_puts(bio_err, "Error setting client auth engine\n");
1120db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1121db522d3aSSimon L. B. Nielsen 			ENGINE_free(ssl_client_engine);
1122db522d3aSSimon L. B. Nielsen 			goto end;
1123db522d3aSSimon L. B. Nielsen 			}
1124db522d3aSSimon L. B. Nielsen 		ENGINE_free(ssl_client_engine);
1125db522d3aSSimon L. B. Nielsen 		}
1126db522d3aSSimon L. B. Nielsen #endif
1127db522d3aSSimon L. B. Nielsen 
11281f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
11291f13597dSJung-uk Kim #ifdef OPENSSL_NO_JPAKE
11301f13597dSJung-uk Kim 	if (psk_key != NULL)
11311f13597dSJung-uk Kim #else
11321f13597dSJung-uk Kim 	if (psk_key != NULL || jpake_secret)
11331f13597dSJung-uk Kim #endif
11341f13597dSJung-uk Kim 		{
11351f13597dSJung-uk Kim 		if (c_debug)
11361f13597dSJung-uk Kim 			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
11371f13597dSJung-uk Kim 		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
11381f13597dSJung-uk Kim 		}
1139*09286989SJung-uk Kim #endif
1140*09286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
11411f13597dSJung-uk Kim 	if (srtp_profiles != NULL)
11421f13597dSJung-uk Kim 		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
11431f13597dSJung-uk Kim #endif
114474664626SKris Kennaway 	if (bugs)
114574664626SKris Kennaway 		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
114674664626SKris Kennaway 	else
114774664626SKris Kennaway 		SSL_CTX_set_options(ctx,off);
11486a599222SSimon L. B. Nielsen 
11496a599222SSimon L. B. Nielsen 	if (clr)
11506a599222SSimon L. B. Nielsen 		SSL_CTX_clear_options(ctx, clr);
11513b4e3dcbSSimon L. B. Nielsen 	/* DTLS: partial reads end up discarding unread UDP bytes :-(
11523b4e3dcbSSimon L. B. Nielsen 	 * Setting read ahead solves this problem.
11533b4e3dcbSSimon L. B. Nielsen 	 */
11541f13597dSJung-uk Kim 	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
11551f13597dSJung-uk Kim 
11561f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
11571f13597dSJung-uk Kim 	if (next_proto.data)
11581f13597dSJung-uk Kim 		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
11591f13597dSJung-uk Kim #endif
116074664626SKris Kennaway 
116174664626SKris Kennaway 	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
116274664626SKris Kennaway 	if (cipher != NULL)
1163f579bf8eSKris Kennaway 		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1164f579bf8eSKris Kennaway 		BIO_printf(bio_err,"error setting cipher list\n");
1165f579bf8eSKris Kennaway 		ERR_print_errors(bio_err);
1166f579bf8eSKris Kennaway 		goto end;
1167f579bf8eSKris Kennaway 	}
116874664626SKris Kennaway #if 0
116974664626SKris Kennaway 	else
117074664626SKris Kennaway 		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
117174664626SKris Kennaway #endif
117274664626SKris Kennaway 
117374664626SKris Kennaway 	SSL_CTX_set_verify(ctx,verify,verify_callback);
11743b4e3dcbSSimon L. B. Nielsen 	if (!set_cert_key_stuff(ctx,cert,key))
117574664626SKris Kennaway 		goto end;
117674664626SKris Kennaway 
117774664626SKris Kennaway 	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
117874664626SKris Kennaway 		(!SSL_CTX_set_default_verify_paths(ctx)))
117974664626SKris Kennaway 		{
1180f579bf8eSKris Kennaway 		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
118174664626SKris Kennaway 		ERR_print_errors(bio_err);
118274664626SKris Kennaway 		/* goto end; */
118374664626SKris Kennaway 		}
118474664626SKris Kennaway 
1185db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1186db522d3aSSimon L. B. Nielsen 	if (servername != NULL)
1187db522d3aSSimon L. B. Nielsen 		{
1188db522d3aSSimon L. B. Nielsen 		tlsextcbp.biodebug = bio_err;
1189db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1190db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1191db522d3aSSimon L. B. Nielsen 		}
11921f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
11931f13597dSJung-uk Kim         if (srp_arg.srplogin)
11941f13597dSJung-uk Kim 		{
11951f13597dSJung-uk Kim 		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
11961f13597dSJung-uk Kim 			{
11971f13597dSJung-uk Kim 			BIO_printf(bio_err,"Unable to set SRP username\n");
11981f13597dSJung-uk Kim 			goto end;
11991f13597dSJung-uk Kim 			}
12001f13597dSJung-uk Kim 		srp_arg.msg = c_msg;
12011f13597dSJung-uk Kim 		srp_arg.debug = c_debug ;
12021f13597dSJung-uk Kim 		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
12031f13597dSJung-uk Kim 		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
12041f13597dSJung-uk Kim 		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
12051f13597dSJung-uk Kim 		if (c_msg || c_debug || srp_arg.amp == 0)
12061f13597dSJung-uk Kim 			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
12071f13597dSJung-uk Kim 		}
12081f13597dSJung-uk Kim 
12091f13597dSJung-uk Kim #endif
1210db522d3aSSimon L. B. Nielsen #endif
121174664626SKris Kennaway 
1212f579bf8eSKris Kennaway 	con=SSL_new(ctx);
1213db522d3aSSimon L. B. Nielsen 	if (sess_in)
1214db522d3aSSimon L. B. Nielsen 		{
1215db522d3aSSimon L. B. Nielsen 		SSL_SESSION *sess;
1216db522d3aSSimon L. B. Nielsen 		BIO *stmp = BIO_new_file(sess_in, "r");
1217db522d3aSSimon L. B. Nielsen 		if (!stmp)
1218db522d3aSSimon L. B. Nielsen 			{
1219db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err, "Can't open session file %s\n",
1220db522d3aSSimon L. B. Nielsen 						sess_in);
1221db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1222db522d3aSSimon L. B. Nielsen 			goto end;
1223db522d3aSSimon L. B. Nielsen 			}
1224db522d3aSSimon L. B. Nielsen 		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1225db522d3aSSimon L. B. Nielsen 		BIO_free(stmp);
1226db522d3aSSimon L. B. Nielsen 		if (!sess)
1227db522d3aSSimon L. B. Nielsen 			{
1228db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err, "Can't open session file %s\n",
1229db522d3aSSimon L. B. Nielsen 						sess_in);
1230db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1231db522d3aSSimon L. B. Nielsen 			goto end;
1232db522d3aSSimon L. B. Nielsen 			}
1233db522d3aSSimon L. B. Nielsen 		SSL_set_session(con, sess);
1234db522d3aSSimon L. B. Nielsen 		SSL_SESSION_free(sess);
1235db522d3aSSimon L. B. Nielsen 		}
1236db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1237db522d3aSSimon L. B. Nielsen 	if (servername != NULL)
1238db522d3aSSimon L. B. Nielsen 		{
1239db522d3aSSimon L. B. Nielsen 		if (!SSL_set_tlsext_host_name(con,servername))
1240db522d3aSSimon L. B. Nielsen 			{
1241db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1242db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1243db522d3aSSimon L. B. Nielsen 			goto end;
1244db522d3aSSimon L. B. Nielsen 			}
1245db522d3aSSimon L. B. Nielsen 		}
1246db522d3aSSimon L. B. Nielsen #endif
12475c87c606SMark Murray #ifndef OPENSSL_NO_KRB5
12481f13597dSJung-uk Kim 	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
12495c87c606SMark Murray                 {
12501f13597dSJung-uk Kim 		SSL_set0_kssl_ctx(con, kctx);
12511f13597dSJung-uk Kim                 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
12525c87c606SMark Murray 		}
12535c87c606SMark Murray #endif	/* OPENSSL_NO_KRB5  */
125474664626SKris Kennaway /*	SSL_set_cipher_list(con,"RC4-MD5"); */
12551f13597dSJung-uk Kim #if 0
12561f13597dSJung-uk Kim #ifdef TLSEXT_TYPE_opaque_prf_input
12571f13597dSJung-uk Kim 	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
12581f13597dSJung-uk Kim #endif
12591f13597dSJung-uk Kim #endif
126074664626SKris Kennaway 
126174664626SKris Kennaway re_start:
126274664626SKris Kennaway 
12631f13597dSJung-uk Kim 	if (init_client(&s,host,port,socket_type) == 0)
126474664626SKris Kennaway 		{
126574664626SKris Kennaway 		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
126674664626SKris Kennaway 		SHUTDOWN(s);
126774664626SKris Kennaway 		goto end;
126874664626SKris Kennaway 		}
126974664626SKris Kennaway 	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
127074664626SKris Kennaway 
127174664626SKris Kennaway #ifdef FIONBIO
127274664626SKris Kennaway 	if (c_nbio)
127374664626SKris Kennaway 		{
127474664626SKris Kennaway 		unsigned long l=1;
127574664626SKris Kennaway 		BIO_printf(bio_c_out,"turning on non blocking io\n");
127674664626SKris Kennaway 		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
127774664626SKris Kennaway 			{
127874664626SKris Kennaway 			ERR_print_errors(bio_err);
127974664626SKris Kennaway 			goto end;
128074664626SKris Kennaway 			}
128174664626SKris Kennaway 		}
128274664626SKris Kennaway #endif
12831f13597dSJung-uk Kim 	if (c_Pause & 0x01) SSL_set_debug(con, 1);
12843b4e3dcbSSimon L. B. Nielsen 
12853b4e3dcbSSimon L. B. Nielsen 	if ( SSL_version(con) == DTLS1_VERSION)
12863b4e3dcbSSimon L. B. Nielsen 		{
12873b4e3dcbSSimon L. B. Nielsen 
12883b4e3dcbSSimon L. B. Nielsen 		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
12893b4e3dcbSSimon L. B. Nielsen 		if (getsockname(s, &peer, (void *)&peerlen) < 0)
12903b4e3dcbSSimon L. B. Nielsen 			{
12913b4e3dcbSSimon L. B. Nielsen 			BIO_printf(bio_err, "getsockname:errno=%d\n",
12923b4e3dcbSSimon L. B. Nielsen 				get_last_socket_error());
12933b4e3dcbSSimon L. B. Nielsen 			SHUTDOWN(s);
12943b4e3dcbSSimon L. B. Nielsen 			goto end;
12953b4e3dcbSSimon L. B. Nielsen 			}
12963b4e3dcbSSimon L. B. Nielsen 
1297db522d3aSSimon L. B. Nielsen 		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
12983b4e3dcbSSimon L. B. Nielsen 
12993b4e3dcbSSimon L. B. Nielsen 		if (enable_timeouts)
13003b4e3dcbSSimon L. B. Nielsen 			{
13013b4e3dcbSSimon L. B. Nielsen 			timeout.tv_sec = 0;
13023b4e3dcbSSimon L. B. Nielsen 			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
13033b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
13043b4e3dcbSSimon L. B. Nielsen 
13053b4e3dcbSSimon L. B. Nielsen 			timeout.tv_sec = 0;
13063b4e3dcbSSimon L. B. Nielsen 			timeout.tv_usec = DGRAM_SND_TIMEOUT;
13073b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
13083b4e3dcbSSimon L. B. Nielsen 			}
13093b4e3dcbSSimon L. B. Nielsen 
13106a599222SSimon L. B. Nielsen 		if (socket_mtu > 28)
13113b4e3dcbSSimon L. B. Nielsen 			{
13123b4e3dcbSSimon L. B. Nielsen 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
13136a599222SSimon L. B. Nielsen 			SSL_set_mtu(con, socket_mtu - 28);
13143b4e3dcbSSimon L. B. Nielsen 			}
13153b4e3dcbSSimon L. B. Nielsen 		else
13163b4e3dcbSSimon L. B. Nielsen 			/* want to do MTU discovery */
13173b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
13183b4e3dcbSSimon L. B. Nielsen 		}
13193b4e3dcbSSimon L. B. Nielsen 	else
132074664626SKris Kennaway 		sbio=BIO_new_socket(s,BIO_NOCLOSE);
132174664626SKris Kennaway 
132274664626SKris Kennaway 	if (nbio_test)
132374664626SKris Kennaway 		{
132474664626SKris Kennaway 		BIO *test;
132574664626SKris Kennaway 
132674664626SKris Kennaway 		test=BIO_new(BIO_f_nbio_test());
132774664626SKris Kennaway 		sbio=BIO_push(test,sbio);
132874664626SKris Kennaway 		}
132974664626SKris Kennaway 
133074664626SKris Kennaway 	if (c_debug)
133174664626SKris Kennaway 		{
13321f13597dSJung-uk Kim 		SSL_set_debug(con, 1);
13333b4e3dcbSSimon L. B. Nielsen 		BIO_set_callback(sbio,bio_dump_callback);
13345471f83eSSimon L. B. Nielsen 		BIO_set_callback_arg(sbio,(char *)bio_c_out);
133574664626SKris Kennaway 		}
13365c87c606SMark Murray 	if (c_msg)
13375c87c606SMark Murray 		{
13385c87c606SMark Murray 		SSL_set_msg_callback(con, msg_cb);
13395c87c606SMark Murray 		SSL_set_msg_callback_arg(con, bio_c_out);
13405c87c606SMark Murray 		}
1341db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1342db522d3aSSimon L. B. Nielsen 	if (c_tlsextdebug)
1343db522d3aSSimon L. B. Nielsen 		{
1344db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1345db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_debug_arg(con, bio_c_out);
1346db522d3aSSimon L. B. Nielsen 		}
1347db522d3aSSimon L. B. Nielsen 	if (c_status_req)
1348db522d3aSSimon L. B. Nielsen 		{
1349db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1350db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1351db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1352db522d3aSSimon L. B. Nielsen #if 0
1353db522d3aSSimon L. B. Nielsen {
1354db522d3aSSimon L. B. Nielsen STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1355db522d3aSSimon L. B. Nielsen OCSP_RESPID *id = OCSP_RESPID_new();
1356db522d3aSSimon L. B. Nielsen id->value.byKey = ASN1_OCTET_STRING_new();
1357db522d3aSSimon L. B. Nielsen id->type = V_OCSP_RESPID_KEY;
1358db522d3aSSimon L. B. Nielsen ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1359db522d3aSSimon L. B. Nielsen sk_OCSP_RESPID_push(ids, id);
1360db522d3aSSimon L. B. Nielsen SSL_set_tlsext_status_ids(con, ids);
1361db522d3aSSimon L. B. Nielsen }
1362db522d3aSSimon L. B. Nielsen #endif
1363db522d3aSSimon L. B. Nielsen 		}
1364db522d3aSSimon L. B. Nielsen #endif
1365db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
1366db522d3aSSimon L. B. Nielsen 	if (jpake_secret)
1367db522d3aSSimon L. B. Nielsen 		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1368db522d3aSSimon L. B. Nielsen #endif
136974664626SKris Kennaway 
137074664626SKris Kennaway 	SSL_set_bio(con,sbio,sbio);
137174664626SKris Kennaway 	SSL_set_connect_state(con);
137274664626SKris Kennaway 
137374664626SKris Kennaway 	/* ok, lets connect */
137474664626SKris Kennaway 	width=SSL_get_fd(con)+1;
137574664626SKris Kennaway 
137674664626SKris Kennaway 	read_tty=1;
137774664626SKris Kennaway 	write_tty=0;
137874664626SKris Kennaway 	tty_on=0;
137974664626SKris Kennaway 	read_ssl=1;
138074664626SKris Kennaway 	write_ssl=1;
138174664626SKris Kennaway 
138274664626SKris Kennaway 	cbuf_len=0;
138374664626SKris Kennaway 	cbuf_off=0;
138474664626SKris Kennaway 	sbuf_len=0;
138574664626SKris Kennaway 	sbuf_off=0;
138674664626SKris Kennaway 
13875c87c606SMark Murray 	/* This is an ugly hack that does a lot of assumptions */
13885471f83eSSimon L. B. Nielsen 	/* We do have to handle multi-line responses which may come
13895471f83eSSimon L. B. Nielsen  	   in a single packet or not. We therefore have to use
13905471f83eSSimon L. B. Nielsen 	   BIO_gets() which does need a buffering BIO. So during
13915471f83eSSimon L. B. Nielsen 	   the initial chitchat we do push a buffering BIO into the
13925471f83eSSimon L. B. Nielsen 	   chain that is removed again later on to not disturb the
13935471f83eSSimon L. B. Nielsen 	   rest of the s_client operation. */
13945471f83eSSimon L. B. Nielsen 	if (starttls_proto == PROTO_SMTP)
13955c87c606SMark Murray 		{
13965471f83eSSimon L. B. Nielsen 		int foundit=0;
13975471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
13985471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
13995471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end from SMTP */
14005471f83eSSimon L. B. Nielsen 		do
14015471f83eSSimon L. B. Nielsen 			{
14025471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14035471f83eSSimon L. B. Nielsen 			}
14045471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
14055471f83eSSimon L. B. Nielsen 		/* STARTTLS command requires EHLO... */
14065471f83eSSimon L. B. Nielsen 		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1407db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14085471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end EHLO SMTP response */
14095471f83eSSimon L. B. Nielsen 		do
14105471f83eSSimon L. B. Nielsen 			{
14115471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14125471f83eSSimon L. B. Nielsen 			if (strstr(mbuf,"STARTTLS"))
14135471f83eSSimon L. B. Nielsen 				foundit=1;
14145471f83eSSimon L. B. Nielsen 			}
14155471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
1416db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14175471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14185471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14195471f83eSSimon L. B. Nielsen 		if (!foundit)
14205471f83eSSimon L. B. Nielsen 			BIO_printf(bio_err,
14215471f83eSSimon L. B. Nielsen 				   "didn't found starttls in server response,"
14225471f83eSSimon L. B. Nielsen 				   " try anyway...\n");
14235c87c606SMark Murray 		BIO_printf(sbio,"STARTTLS\r\n");
14245c87c606SMark Murray 		BIO_read(sbio,sbuf,BUFSIZZ);
14255c87c606SMark Murray 		}
14265471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_POP3)
142750ef0093SJacques Vidrine 		{
142850ef0093SJacques Vidrine 		BIO_read(sbio,mbuf,BUFSIZZ);
142950ef0093SJacques Vidrine 		BIO_printf(sbio,"STLS\r\n");
143050ef0093SJacques Vidrine 		BIO_read(sbio,sbuf,BUFSIZZ);
143150ef0093SJacques Vidrine 		}
14325471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_IMAP)
14335471f83eSSimon L. B. Nielsen 		{
14345471f83eSSimon L. B. Nielsen 		int foundit=0;
14355471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
14365471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
14375471f83eSSimon L. B. Nielsen 		BIO_gets(fbio,mbuf,BUFSIZZ);
14385471f83eSSimon L. B. Nielsen 		/* STARTTLS command requires CAPABILITY... */
14395471f83eSSimon L. B. Nielsen 		BIO_printf(fbio,". CAPABILITY\r\n");
1440db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14415471f83eSSimon L. B. Nielsen 		/* wait for multi-line CAPABILITY response */
14425471f83eSSimon L. B. Nielsen 		do
14435471f83eSSimon L. B. Nielsen 			{
14445471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14455471f83eSSimon L. B. Nielsen 			if (strstr(mbuf,"STARTTLS"))
14465471f83eSSimon L. B. Nielsen 				foundit=1;
14475471f83eSSimon L. B. Nielsen 			}
14485471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[0]!='.');
1449db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14505471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14515471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14525471f83eSSimon L. B. Nielsen 		if (!foundit)
14535471f83eSSimon L. B. Nielsen 			BIO_printf(bio_err,
14545471f83eSSimon L. B. Nielsen 				   "didn't found STARTTLS in server response,"
14555471f83eSSimon L. B. Nielsen 				   " try anyway...\n");
14565471f83eSSimon L. B. Nielsen 		BIO_printf(sbio,". STARTTLS\r\n");
14575471f83eSSimon L. B. Nielsen 		BIO_read(sbio,sbuf,BUFSIZZ);
14585471f83eSSimon L. B. Nielsen 		}
14595471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_FTP)
14605471f83eSSimon L. B. Nielsen 		{
14615471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
14625471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
14635471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end from FTP */
14645471f83eSSimon L. B. Nielsen 		do
14655471f83eSSimon L. B. Nielsen 			{
14665471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14675471f83eSSimon L. B. Nielsen 			}
14685471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
1469db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14705471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14715471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14725471f83eSSimon L. B. Nielsen 		BIO_printf(sbio,"AUTH TLS\r\n");
14735471f83eSSimon L. B. Nielsen 		BIO_read(sbio,sbuf,BUFSIZZ);
14745471f83eSSimon L. B. Nielsen 		}
1475db522d3aSSimon L. B. Nielsen 	if (starttls_proto == PROTO_XMPP)
1476db522d3aSSimon L. B. Nielsen 		{
1477db522d3aSSimon L. B. Nielsen 		int seen = 0;
1478db522d3aSSimon L. B. Nielsen 		BIO_printf(sbio,"<stream:stream "
1479db522d3aSSimon L. B. Nielsen 		    "xmlns:stream='http://etherx.jabber.org/streams' "
1480db522d3aSSimon L. B. Nielsen 		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1481db522d3aSSimon L. B. Nielsen 		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1482db522d3aSSimon L. B. Nielsen 		mbuf[seen] = 0;
1483db522d3aSSimon L. B. Nielsen 		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1484db522d3aSSimon L. B. Nielsen 			{
1485db522d3aSSimon L. B. Nielsen 			if (strstr(mbuf, "/stream:features>"))
1486db522d3aSSimon L. B. Nielsen 				goto shut;
1487db522d3aSSimon L. B. Nielsen 			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1488db522d3aSSimon L. B. Nielsen 			mbuf[seen] = 0;
1489db522d3aSSimon L. B. Nielsen 			}
1490db522d3aSSimon L. B. Nielsen 		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1491db522d3aSSimon L. B. Nielsen 		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1492db522d3aSSimon L. B. Nielsen 		sbuf[seen] = 0;
1493db522d3aSSimon L. B. Nielsen 		if (!strstr(sbuf, "<proceed"))
1494db522d3aSSimon L. B. Nielsen 			goto shut;
1495db522d3aSSimon L. B. Nielsen 		mbuf[0] = 0;
1496db522d3aSSimon L. B. Nielsen 		}
14975c87c606SMark Murray 
149874664626SKris Kennaway 	for (;;)
149974664626SKris Kennaway 		{
150074664626SKris Kennaway 		FD_ZERO(&readfds);
150174664626SKris Kennaway 		FD_ZERO(&writefds);
150274664626SKris Kennaway 
15036a599222SSimon L. B. Nielsen 		if ((SSL_version(con) == DTLS1_VERSION) &&
15046a599222SSimon L. B. Nielsen 			DTLSv1_get_timeout(con, &timeout))
15056a599222SSimon L. B. Nielsen 			timeoutp = &timeout;
15066a599222SSimon L. B. Nielsen 		else
15076a599222SSimon L. B. Nielsen 			timeoutp = NULL;
15086a599222SSimon L. B. Nielsen 
150974664626SKris Kennaway 		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
151074664626SKris Kennaway 			{
151174664626SKris Kennaway 			in_init=1;
151274664626SKris Kennaway 			tty_on=0;
151374664626SKris Kennaway 			}
151474664626SKris Kennaway 		else
151574664626SKris Kennaway 			{
151674664626SKris Kennaway 			tty_on=1;
151774664626SKris Kennaway 			if (in_init)
151874664626SKris Kennaway 				{
151974664626SKris Kennaway 				in_init=0;
15201f13597dSJung-uk Kim #if 0 /* This test doesn't really work as intended (needs to be fixed) */
15211f13597dSJung-uk Kim #ifndef OPENSSL_NO_TLSEXT
15221f13597dSJung-uk Kim 				if (servername != NULL && !SSL_session_reused(con))
15231f13597dSJung-uk Kim 					{
15241f13597dSJung-uk Kim 					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
15251f13597dSJung-uk Kim 					}
15261f13597dSJung-uk Kim #endif
15271f13597dSJung-uk Kim #endif
1528db522d3aSSimon L. B. Nielsen 				if (sess_out)
1529db522d3aSSimon L. B. Nielsen 					{
1530db522d3aSSimon L. B. Nielsen 					BIO *stmp = BIO_new_file(sess_out, "w");
1531db522d3aSSimon L. B. Nielsen 					if (stmp)
1532db522d3aSSimon L. B. Nielsen 						{
1533db522d3aSSimon L. B. Nielsen 						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1534db522d3aSSimon L. B. Nielsen 						BIO_free(stmp);
1535db522d3aSSimon L. B. Nielsen 						}
1536db522d3aSSimon L. B. Nielsen 					else
1537db522d3aSSimon L. B. Nielsen 						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1538db522d3aSSimon L. B. Nielsen 					}
153974664626SKris Kennaway 				print_stuff(bio_c_out,con,full_log);
154074664626SKris Kennaway 				if (full_log > 0) full_log--;
154174664626SKris Kennaway 
154250ef0093SJacques Vidrine 				if (starttls_proto)
15435c87c606SMark Murray 					{
15445c87c606SMark Murray 					BIO_printf(bio_err,"%s",mbuf);
15455c87c606SMark Murray 					/* We don't need to know any more */
15465471f83eSSimon L. B. Nielsen 					starttls_proto = PROTO_OFF;
15475c87c606SMark Murray 					}
15485c87c606SMark Murray 
154974664626SKris Kennaway 				if (reconnect)
155074664626SKris Kennaway 					{
155174664626SKris Kennaway 					reconnect--;
155274664626SKris Kennaway 					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
155374664626SKris Kennaway 					SSL_shutdown(con);
155474664626SKris Kennaway 					SSL_set_connect_state(con);
155574664626SKris Kennaway 					SHUTDOWN(SSL_get_fd(con));
155674664626SKris Kennaway 					goto re_start;
155774664626SKris Kennaway 					}
155874664626SKris Kennaway 				}
155974664626SKris Kennaway 			}
156074664626SKris Kennaway 
156174664626SKris Kennaway 		ssl_pending = read_ssl && SSL_pending(con);
156274664626SKris Kennaway 
156374664626SKris Kennaway 		if (!ssl_pending)
156474664626SKris Kennaway 			{
15651f13597dSJung-uk Kim #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
156674664626SKris Kennaway 			if (tty_on)
156774664626SKris Kennaway 				{
15681f13597dSJung-uk Kim 				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
15691f13597dSJung-uk Kim 				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
157074664626SKris Kennaway 				}
157174664626SKris Kennaway 			if (read_ssl)
15721f13597dSJung-uk Kim 				openssl_fdset(SSL_get_fd(con),&readfds);
157374664626SKris Kennaway 			if (write_ssl)
15741f13597dSJung-uk Kim 				openssl_fdset(SSL_get_fd(con),&writefds);
1575f579bf8eSKris Kennaway #else
1576f579bf8eSKris Kennaway 			if(!tty_on || !write_tty) {
1577f579bf8eSKris Kennaway 				if (read_ssl)
15781f13597dSJung-uk Kim 					openssl_fdset(SSL_get_fd(con),&readfds);
1579f579bf8eSKris Kennaway 				if (write_ssl)
15801f13597dSJung-uk Kim 					openssl_fdset(SSL_get_fd(con),&writefds);
1581f579bf8eSKris Kennaway 			}
1582f579bf8eSKris Kennaway #endif
158374664626SKris Kennaway /*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
158474664626SKris Kennaway 				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
158574664626SKris Kennaway 
158674664626SKris Kennaway 			/* Note: under VMS with SOCKETSHR the second parameter
158774664626SKris Kennaway 			 * is currently of type (int *) whereas under other
158874664626SKris Kennaway 			 * systems it is (void *) if you don't have a cast it
158974664626SKris Kennaway 			 * will choke the compiler: if you do have a cast then
159074664626SKris Kennaway 			 * you can either go for (int *) or (void *).
159174664626SKris Kennaway 			 */
159250ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
159350ef0093SJacques Vidrine                         /* Under Windows/DOS we make the assumption that we can
1594f579bf8eSKris Kennaway 			 * always write to the tty: therefore if we need to
1595f579bf8eSKris Kennaway 			 * write to the tty we just fall through. Otherwise
1596f579bf8eSKris Kennaway 			 * we timeout the select every second and see if there
1597f579bf8eSKris Kennaway 			 * are any keypresses. Note: this is a hack, in a proper
1598f579bf8eSKris Kennaway 			 * Windows application we wouldn't do this.
1599f579bf8eSKris Kennaway 			 */
1600f579bf8eSKris Kennaway 			i=0;
1601f579bf8eSKris Kennaway 			if(!write_tty) {
1602f579bf8eSKris Kennaway 				if(read_tty) {
1603f579bf8eSKris Kennaway 					tv.tv_sec = 1;
1604f579bf8eSKris Kennaway 					tv.tv_usec = 0;
1605f579bf8eSKris Kennaway 					i=select(width,(void *)&readfds,(void *)&writefds,
1606f579bf8eSKris Kennaway 						 NULL,&tv);
160750ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
16085c87c606SMark Murray 					if(!i && (!_kbhit() || !read_tty) ) continue;
16095c87c606SMark Murray #else
1610ddd58736SKris Kennaway 					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
16115c87c606SMark Murray #endif
1612f579bf8eSKris Kennaway 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16136a599222SSimon L. B. Nielsen 					 NULL,timeoutp);
1614f579bf8eSKris Kennaway 			}
16153b4e3dcbSSimon L. B. Nielsen #elif defined(OPENSSL_SYS_NETWARE)
16163b4e3dcbSSimon L. B. Nielsen 			if(!write_tty) {
16173b4e3dcbSSimon L. B. Nielsen 				if(read_tty) {
16183b4e3dcbSSimon L. B. Nielsen 					tv.tv_sec = 1;
16193b4e3dcbSSimon L. B. Nielsen 					tv.tv_usec = 0;
16203b4e3dcbSSimon L. B. Nielsen 					i=select(width,(void *)&readfds,(void *)&writefds,
16213b4e3dcbSSimon L. B. Nielsen 						NULL,&tv);
16223b4e3dcbSSimon L. B. Nielsen 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16236a599222SSimon L. B. Nielsen 					NULL,timeoutp);
16243b4e3dcbSSimon L. B. Nielsen 			}
16251f13597dSJung-uk Kim #elif defined(OPENSSL_SYS_BEOS_R5)
16261f13597dSJung-uk Kim 			/* Under BeOS-R5 the situation is similar to DOS */
16271f13597dSJung-uk Kim 			i=0;
16281f13597dSJung-uk Kim 			stdin_set = 0;
16291f13597dSJung-uk Kim 			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
16301f13597dSJung-uk Kim 			if(!write_tty) {
16311f13597dSJung-uk Kim 				if(read_tty) {
16321f13597dSJung-uk Kim 					tv.tv_sec = 1;
16331f13597dSJung-uk Kim 					tv.tv_usec = 0;
16341f13597dSJung-uk Kim 					i=select(width,(void *)&readfds,(void *)&writefds,
16351f13597dSJung-uk Kim 						 NULL,&tv);
16361f13597dSJung-uk Kim 					if (read(fileno(stdin), sbuf, 0) >= 0)
16371f13597dSJung-uk Kim 						stdin_set = 1;
16381f13597dSJung-uk Kim 					if (!i && (stdin_set != 1 || !read_tty))
16391f13597dSJung-uk Kim 						continue;
16401f13597dSJung-uk Kim 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16411f13597dSJung-uk Kim 					 NULL,timeoutp);
16421f13597dSJung-uk Kim 			}
16431f13597dSJung-uk Kim 			(void)fcntl(fileno(stdin), F_SETFL, 0);
1644f579bf8eSKris Kennaway #else
164574664626SKris Kennaway 			i=select(width,(void *)&readfds,(void *)&writefds,
16466a599222SSimon L. B. Nielsen 				 NULL,timeoutp);
1647f579bf8eSKris Kennaway #endif
164874664626SKris Kennaway 			if ( i < 0)
164974664626SKris Kennaway 				{
165074664626SKris Kennaway 				BIO_printf(bio_err,"bad select %d\n",
165174664626SKris Kennaway 				get_last_socket_error());
165274664626SKris Kennaway 				goto shut;
165374664626SKris Kennaway 				/* goto end; */
165474664626SKris Kennaway 				}
165574664626SKris Kennaway 			}
165674664626SKris Kennaway 
16576a599222SSimon L. B. Nielsen 		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
16586a599222SSimon L. B. Nielsen 			{
16596a599222SSimon L. B. Nielsen 			BIO_printf(bio_err,"TIMEOUT occured\n");
16606a599222SSimon L. B. Nielsen 			}
16616a599222SSimon L. B. Nielsen 
166274664626SKris Kennaway 		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
166374664626SKris Kennaway 			{
166474664626SKris Kennaway 			k=SSL_write(con,&(cbuf[cbuf_off]),
166574664626SKris Kennaway 				(unsigned int)cbuf_len);
166674664626SKris Kennaway 			switch (SSL_get_error(con,k))
166774664626SKris Kennaway 				{
166874664626SKris Kennaway 			case SSL_ERROR_NONE:
166974664626SKris Kennaway 				cbuf_off+=k;
167074664626SKris Kennaway 				cbuf_len-=k;
167174664626SKris Kennaway 				if (k <= 0) goto end;
167274664626SKris Kennaway 				/* we have done a  write(con,NULL,0); */
167374664626SKris Kennaway 				if (cbuf_len <= 0)
167474664626SKris Kennaway 					{
167574664626SKris Kennaway 					read_tty=1;
167674664626SKris Kennaway 					write_ssl=0;
167774664626SKris Kennaway 					}
167874664626SKris Kennaway 				else /* if (cbuf_len > 0) */
167974664626SKris Kennaway 					{
168074664626SKris Kennaway 					read_tty=0;
168174664626SKris Kennaway 					write_ssl=1;
168274664626SKris Kennaway 					}
168374664626SKris Kennaway 				break;
168474664626SKris Kennaway 			case SSL_ERROR_WANT_WRITE:
168574664626SKris Kennaway 				BIO_printf(bio_c_out,"write W BLOCK\n");
168674664626SKris Kennaway 				write_ssl=1;
168774664626SKris Kennaway 				read_tty=0;
168874664626SKris Kennaway 				break;
168974664626SKris Kennaway 			case SSL_ERROR_WANT_READ:
169074664626SKris Kennaway 				BIO_printf(bio_c_out,"write R BLOCK\n");
169174664626SKris Kennaway 				write_tty=0;
169274664626SKris Kennaway 				read_ssl=1;
169374664626SKris Kennaway 				write_ssl=0;
169474664626SKris Kennaway 				break;
169574664626SKris Kennaway 			case SSL_ERROR_WANT_X509_LOOKUP:
169674664626SKris Kennaway 				BIO_printf(bio_c_out,"write X BLOCK\n");
169774664626SKris Kennaway 				break;
169874664626SKris Kennaway 			case SSL_ERROR_ZERO_RETURN:
169974664626SKris Kennaway 				if (cbuf_len != 0)
170074664626SKris Kennaway 					{
170174664626SKris Kennaway 					BIO_printf(bio_c_out,"shutdown\n");
17021f13597dSJung-uk Kim 					ret = 0;
170374664626SKris Kennaway 					goto shut;
170474664626SKris Kennaway 					}
170574664626SKris Kennaway 				else
170674664626SKris Kennaway 					{
170774664626SKris Kennaway 					read_tty=1;
170874664626SKris Kennaway 					write_ssl=0;
170974664626SKris Kennaway 					break;
171074664626SKris Kennaway 					}
171174664626SKris Kennaway 
171274664626SKris Kennaway 			case SSL_ERROR_SYSCALL:
171374664626SKris Kennaway 				if ((k != 0) || (cbuf_len != 0))
171474664626SKris Kennaway 					{
171574664626SKris Kennaway 					BIO_printf(bio_err,"write:errno=%d\n",
171674664626SKris Kennaway 						get_last_socket_error());
171774664626SKris Kennaway 					goto shut;
171874664626SKris Kennaway 					}
171974664626SKris Kennaway 				else
172074664626SKris Kennaway 					{
172174664626SKris Kennaway 					read_tty=1;
172274664626SKris Kennaway 					write_ssl=0;
172374664626SKris Kennaway 					}
172474664626SKris Kennaway 				break;
172574664626SKris Kennaway 			case SSL_ERROR_SSL:
172674664626SKris Kennaway 				ERR_print_errors(bio_err);
172774664626SKris Kennaway 				goto shut;
172874664626SKris Kennaway 				}
172974664626SKris Kennaway 			}
17301f13597dSJung-uk Kim #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
17311f13597dSJung-uk Kim 		/* Assume Windows/DOS/BeOS can always write */
1732f579bf8eSKris Kennaway 		else if (!ssl_pending && write_tty)
1733f579bf8eSKris Kennaway #else
173474664626SKris Kennaway 		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1735f579bf8eSKris Kennaway #endif
173674664626SKris Kennaway 			{
173774664626SKris Kennaway #ifdef CHARSET_EBCDIC
173874664626SKris Kennaway 			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
173974664626SKris Kennaway #endif
17401f13597dSJung-uk Kim 			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
174174664626SKris Kennaway 
174274664626SKris Kennaway 			if (i <= 0)
174374664626SKris Kennaway 				{
174474664626SKris Kennaway 				BIO_printf(bio_c_out,"DONE\n");
17451f13597dSJung-uk Kim 				ret = 0;
174674664626SKris Kennaway 				goto shut;
174774664626SKris Kennaway 				/* goto end; */
174874664626SKris Kennaway 				}
174974664626SKris Kennaway 
175074664626SKris Kennaway 			sbuf_len-=i;;
175174664626SKris Kennaway 			sbuf_off+=i;
175274664626SKris Kennaway 			if (sbuf_len <= 0)
175374664626SKris Kennaway 				{
175474664626SKris Kennaway 				read_ssl=1;
175574664626SKris Kennaway 				write_tty=0;
175674664626SKris Kennaway 				}
175774664626SKris Kennaway 			}
175874664626SKris Kennaway 		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
175974664626SKris Kennaway 			{
176074664626SKris Kennaway #ifdef RENEG
176174664626SKris Kennaway { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
176274664626SKris Kennaway #endif
176374664626SKris Kennaway #if 1
176474664626SKris Kennaway 			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
176574664626SKris Kennaway #else
176674664626SKris Kennaway /* Demo for pending and peek :-) */
176774664626SKris Kennaway 			k=SSL_read(con,sbuf,16);
176874664626SKris Kennaway { char zbuf[10240];
176974664626SKris Kennaway printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
177074664626SKris Kennaway }
177174664626SKris Kennaway #endif
177274664626SKris Kennaway 
177374664626SKris Kennaway 			switch (SSL_get_error(con,k))
177474664626SKris Kennaway 				{
177574664626SKris Kennaway 			case SSL_ERROR_NONE:
177674664626SKris Kennaway 				if (k <= 0)
177774664626SKris Kennaway 					goto end;
177874664626SKris Kennaway 				sbuf_off=0;
177974664626SKris Kennaway 				sbuf_len=k;
178074664626SKris Kennaway 
178174664626SKris Kennaway 				read_ssl=0;
178274664626SKris Kennaway 				write_tty=1;
178374664626SKris Kennaway 				break;
178474664626SKris Kennaway 			case SSL_ERROR_WANT_WRITE:
178574664626SKris Kennaway 				BIO_printf(bio_c_out,"read W BLOCK\n");
178674664626SKris Kennaway 				write_ssl=1;
178774664626SKris Kennaway 				read_tty=0;
178874664626SKris Kennaway 				break;
178974664626SKris Kennaway 			case SSL_ERROR_WANT_READ:
179074664626SKris Kennaway 				BIO_printf(bio_c_out,"read R BLOCK\n");
179174664626SKris Kennaway 				write_tty=0;
179274664626SKris Kennaway 				read_ssl=1;
179374664626SKris Kennaway 				if ((read_tty == 0) && (write_ssl == 0))
179474664626SKris Kennaway 					write_ssl=1;
179574664626SKris Kennaway 				break;
179674664626SKris Kennaway 			case SSL_ERROR_WANT_X509_LOOKUP:
179774664626SKris Kennaway 				BIO_printf(bio_c_out,"read X BLOCK\n");
179874664626SKris Kennaway 				break;
179974664626SKris Kennaway 			case SSL_ERROR_SYSCALL:
18001f13597dSJung-uk Kim 				ret=get_last_socket_error();
18011f13597dSJung-uk Kim 				BIO_printf(bio_err,"read:errno=%d\n",ret);
180274664626SKris Kennaway 				goto shut;
180374664626SKris Kennaway 			case SSL_ERROR_ZERO_RETURN:
180474664626SKris Kennaway 				BIO_printf(bio_c_out,"closed\n");
18051f13597dSJung-uk Kim 				ret=0;
180674664626SKris Kennaway 				goto shut;
180774664626SKris Kennaway 			case SSL_ERROR_SSL:
180874664626SKris Kennaway 				ERR_print_errors(bio_err);
180974664626SKris Kennaway 				goto shut;
181074664626SKris Kennaway 				/* break; */
181174664626SKris Kennaway 				}
181274664626SKris Kennaway 			}
181374664626SKris Kennaway 
181450ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
181550ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
18165c87c606SMark Murray 		else if (_kbhit())
18175c87c606SMark Murray #else
1818ddd58736SKris Kennaway 		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
18195c87c606SMark Murray #endif
18203b4e3dcbSSimon L. B. Nielsen #elif defined (OPENSSL_SYS_NETWARE)
18213b4e3dcbSSimon L. B. Nielsen 		else if (_kbhit())
18221f13597dSJung-uk Kim #elif defined(OPENSSL_SYS_BEOS_R5)
18231f13597dSJung-uk Kim 		else if (stdin_set)
1824f579bf8eSKris Kennaway #else
182574664626SKris Kennaway 		else if (FD_ISSET(fileno(stdin),&readfds))
1826f579bf8eSKris Kennaway #endif
182774664626SKris Kennaway 			{
182874664626SKris Kennaway 			if (crlf)
182974664626SKris Kennaway 				{
183074664626SKris Kennaway 				int j, lf_num;
183174664626SKris Kennaway 
18321f13597dSJung-uk Kim 				i=raw_read_stdin(cbuf,BUFSIZZ/2);
183374664626SKris Kennaway 				lf_num = 0;
183474664626SKris Kennaway 				/* both loops are skipped when i <= 0 */
183574664626SKris Kennaway 				for (j = 0; j < i; j++)
183674664626SKris Kennaway 					if (cbuf[j] == '\n')
183774664626SKris Kennaway 						lf_num++;
183874664626SKris Kennaway 				for (j = i-1; j >= 0; j--)
183974664626SKris Kennaway 					{
184074664626SKris Kennaway 					cbuf[j+lf_num] = cbuf[j];
184174664626SKris Kennaway 					if (cbuf[j] == '\n')
184274664626SKris Kennaway 						{
184374664626SKris Kennaway 						lf_num--;
184474664626SKris Kennaway 						i++;
184574664626SKris Kennaway 						cbuf[j+lf_num] = '\r';
184674664626SKris Kennaway 						}
184774664626SKris Kennaway 					}
184874664626SKris Kennaway 				assert(lf_num == 0);
184974664626SKris Kennaway 				}
185074664626SKris Kennaway 			else
18511f13597dSJung-uk Kim 				i=raw_read_stdin(cbuf,BUFSIZZ);
185274664626SKris Kennaway 
1853f579bf8eSKris Kennaway 			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
185474664626SKris Kennaway 				{
185574664626SKris Kennaway 				BIO_printf(bio_err,"DONE\n");
18561f13597dSJung-uk Kim 				ret=0;
185774664626SKris Kennaway 				goto shut;
185874664626SKris Kennaway 				}
185974664626SKris Kennaway 
1860f579bf8eSKris Kennaway 			if ((!c_ign_eof) && (cbuf[0] == 'R'))
186174664626SKris Kennaway 				{
186274664626SKris Kennaway 				BIO_printf(bio_err,"RENEGOTIATING\n");
186374664626SKris Kennaway 				SSL_renegotiate(con);
186474664626SKris Kennaway 				cbuf_len=0;
186574664626SKris Kennaway 				}
18661f13597dSJung-uk Kim #ifndef OPENSSL_NO_HEARTBEATS
18671f13597dSJung-uk Kim 			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
18681f13597dSJung-uk Kim  				{
18691f13597dSJung-uk Kim 				BIO_printf(bio_err,"HEARTBEATING\n");
18701f13597dSJung-uk Kim 				SSL_heartbeat(con);
18711f13597dSJung-uk Kim 				cbuf_len=0;
18721f13597dSJung-uk Kim 				}
18731f13597dSJung-uk Kim #endif
187474664626SKris Kennaway 			else
187574664626SKris Kennaway 				{
187674664626SKris Kennaway 				cbuf_len=i;
187774664626SKris Kennaway 				cbuf_off=0;
187874664626SKris Kennaway #ifdef CHARSET_EBCDIC
187974664626SKris Kennaway 				ebcdic2ascii(cbuf, cbuf, i);
188074664626SKris Kennaway #endif
188174664626SKris Kennaway 				}
188274664626SKris Kennaway 
188374664626SKris Kennaway 			write_ssl=1;
188474664626SKris Kennaway 			read_tty=0;
188574664626SKris Kennaway 			}
188674664626SKris Kennaway 		}
18871f13597dSJung-uk Kim 
18881f13597dSJung-uk Kim 	ret=0;
188974664626SKris Kennaway shut:
18901f13597dSJung-uk Kim 	if (in_init)
18911f13597dSJung-uk Kim 		print_stuff(bio_c_out,con,full_log);
189274664626SKris Kennaway 	SSL_shutdown(con);
189374664626SKris Kennaway 	SHUTDOWN(SSL_get_fd(con));
189474664626SKris Kennaway end:
18951f13597dSJung-uk Kim 	if (con != NULL)
18961f13597dSJung-uk Kim 		{
18971f13597dSJung-uk Kim 		if (prexit != 0)
18981f13597dSJung-uk Kim 			print_stuff(bio_c_out,con,1);
18991f13597dSJung-uk Kim 		SSL_free(con);
19001f13597dSJung-uk Kim 		}
1901*09286989SJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1902*09286989SJung-uk Kim 	if (next_proto.data)
1903*09286989SJung-uk Kim 		OPENSSL_free(next_proto.data);
1904*09286989SJung-uk Kim #endif
190574664626SKris Kennaway 	if (ctx != NULL) SSL_CTX_free(ctx);
19063b4e3dcbSSimon L. B. Nielsen 	if (cert)
19073b4e3dcbSSimon L. B. Nielsen 		X509_free(cert);
19083b4e3dcbSSimon L. B. Nielsen 	if (key)
19093b4e3dcbSSimon L. B. Nielsen 		EVP_PKEY_free(key);
19103b4e3dcbSSimon L. B. Nielsen 	if (pass)
19113b4e3dcbSSimon L. B. Nielsen 		OPENSSL_free(pass);
1912*09286989SJung-uk Kim 	if (vpm)
1913*09286989SJung-uk Kim 		X509_VERIFY_PARAM_free(vpm);
19145c87c606SMark Murray 	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
19155c87c606SMark Murray 	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
19165c87c606SMark Murray 	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
191774664626SKris Kennaway 	if (bio_c_out != NULL)
191874664626SKris Kennaway 		{
191974664626SKris Kennaway 		BIO_free(bio_c_out);
192074664626SKris Kennaway 		bio_c_out=NULL;
192174664626SKris Kennaway 		}
19225c87c606SMark Murray 	apps_shutdown();
19235c87c606SMark Murray 	OPENSSL_EXIT(ret);
192474664626SKris Kennaway 	}
192574664626SKris Kennaway 
192674664626SKris Kennaway 
192774664626SKris Kennaway static void print_stuff(BIO *bio, SSL *s, int full)
192874664626SKris Kennaway 	{
192974664626SKris Kennaway 	X509 *peer=NULL;
193074664626SKris Kennaway 	char *p;
19313b4e3dcbSSimon L. B. Nielsen 	static const char *space="                ";
193274664626SKris Kennaway 	char buf[BUFSIZ];
193374664626SKris Kennaway 	STACK_OF(X509) *sk;
193474664626SKris Kennaway 	STACK_OF(X509_NAME) *sk2;
19351f13597dSJung-uk Kim 	const SSL_CIPHER *c;
193674664626SKris Kennaway 	X509_NAME *xn;
193774664626SKris Kennaway 	int j,i;
19383b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_COMP
19393b4e3dcbSSimon L. B. Nielsen 	const COMP_METHOD *comp, *expansion;
19403b4e3dcbSSimon L. B. Nielsen #endif
19411f13597dSJung-uk Kim 	unsigned char *exportedkeymat;
194274664626SKris Kennaway 
194374664626SKris Kennaway 	if (full)
194474664626SKris Kennaway 		{
194574664626SKris Kennaway 		int got_a_chain = 0;
194674664626SKris Kennaway 
194774664626SKris Kennaway 		sk=SSL_get_peer_cert_chain(s);
194874664626SKris Kennaway 		if (sk != NULL)
194974664626SKris Kennaway 			{
195074664626SKris Kennaway 			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
195174664626SKris Kennaway 
195274664626SKris Kennaway 			BIO_printf(bio,"---\nCertificate chain\n");
195374664626SKris Kennaway 			for (i=0; i<sk_X509_num(sk); i++)
195474664626SKris Kennaway 				{
195574664626SKris Kennaway 				X509_NAME_oneline(X509_get_subject_name(
19565c87c606SMark Murray 					sk_X509_value(sk,i)),buf,sizeof buf);
195774664626SKris Kennaway 				BIO_printf(bio,"%2d s:%s\n",i,buf);
195874664626SKris Kennaway 				X509_NAME_oneline(X509_get_issuer_name(
19595c87c606SMark Murray 					sk_X509_value(sk,i)),buf,sizeof buf);
196074664626SKris Kennaway 				BIO_printf(bio,"   i:%s\n",buf);
196174664626SKris Kennaway 				if (c_showcerts)
196274664626SKris Kennaway 					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
196374664626SKris Kennaway 				}
196474664626SKris Kennaway 			}
196574664626SKris Kennaway 
196674664626SKris Kennaway 		BIO_printf(bio,"---\n");
196774664626SKris Kennaway 		peer=SSL_get_peer_certificate(s);
196874664626SKris Kennaway 		if (peer != NULL)
196974664626SKris Kennaway 			{
197074664626SKris Kennaway 			BIO_printf(bio,"Server certificate\n");
197174664626SKris Kennaway 			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
197274664626SKris Kennaway 				PEM_write_bio_X509(bio,peer);
197374664626SKris Kennaway 			X509_NAME_oneline(X509_get_subject_name(peer),
19745c87c606SMark Murray 				buf,sizeof buf);
197574664626SKris Kennaway 			BIO_printf(bio,"subject=%s\n",buf);
197674664626SKris Kennaway 			X509_NAME_oneline(X509_get_issuer_name(peer),
19775c87c606SMark Murray 				buf,sizeof buf);
197874664626SKris Kennaway 			BIO_printf(bio,"issuer=%s\n",buf);
197974664626SKris Kennaway 			}
198074664626SKris Kennaway 		else
198174664626SKris Kennaway 			BIO_printf(bio,"no peer certificate available\n");
198274664626SKris Kennaway 
198374664626SKris Kennaway 		sk2=SSL_get_client_CA_list(s);
198474664626SKris Kennaway 		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
198574664626SKris Kennaway 			{
198674664626SKris Kennaway 			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
198774664626SKris Kennaway 			for (i=0; i<sk_X509_NAME_num(sk2); i++)
198874664626SKris Kennaway 				{
198974664626SKris Kennaway 				xn=sk_X509_NAME_value(sk2,i);
199074664626SKris Kennaway 				X509_NAME_oneline(xn,buf,sizeof(buf));
199174664626SKris Kennaway 				BIO_write(bio,buf,strlen(buf));
199274664626SKris Kennaway 				BIO_write(bio,"\n",1);
199374664626SKris Kennaway 				}
199474664626SKris Kennaway 			}
199574664626SKris Kennaway 		else
199674664626SKris Kennaway 			{
199774664626SKris Kennaway 			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
199874664626SKris Kennaway 			}
19995c87c606SMark Murray 		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
200074664626SKris Kennaway 		if (p != NULL)
200174664626SKris Kennaway 			{
200274664626SKris Kennaway 			/* This works only for SSL 2.  In later protocol
200374664626SKris Kennaway 			 * versions, the client does not know what other
200474664626SKris Kennaway 			 * ciphers (in addition to the one to be used
200574664626SKris Kennaway 			 * in the current connection) the server supports. */
200674664626SKris Kennaway 
200774664626SKris Kennaway 			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
200874664626SKris Kennaway 			j=i=0;
200974664626SKris Kennaway 			while (*p)
201074664626SKris Kennaway 				{
201174664626SKris Kennaway 				if (*p == ':')
201274664626SKris Kennaway 					{
201374664626SKris Kennaway 					BIO_write(bio,space,15-j%25);
201474664626SKris Kennaway 					i++;
201574664626SKris Kennaway 					j=0;
201674664626SKris Kennaway 					BIO_write(bio,((i%3)?" ":"\n"),1);
201774664626SKris Kennaway 					}
201874664626SKris Kennaway 				else
201974664626SKris Kennaway 					{
202074664626SKris Kennaway 					BIO_write(bio,p,1);
202174664626SKris Kennaway 					j++;
202274664626SKris Kennaway 					}
202374664626SKris Kennaway 				p++;
202474664626SKris Kennaway 				}
202574664626SKris Kennaway 			BIO_write(bio,"\n",1);
202674664626SKris Kennaway 			}
202774664626SKris Kennaway 
202874664626SKris Kennaway 		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
202974664626SKris Kennaway 			BIO_number_read(SSL_get_rbio(s)),
203074664626SKris Kennaway 			BIO_number_written(SSL_get_wbio(s)));
203174664626SKris Kennaway 		}
20321f13597dSJung-uk Kim 	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
203374664626SKris Kennaway 	c=SSL_get_current_cipher(s);
203474664626SKris Kennaway 	BIO_printf(bio,"%s, Cipher is %s\n",
203574664626SKris Kennaway 		SSL_CIPHER_get_version(c),
203674664626SKris Kennaway 		SSL_CIPHER_get_name(c));
203774664626SKris Kennaway 	if (peer != NULL) {
203874664626SKris Kennaway 		EVP_PKEY *pktmp;
203974664626SKris Kennaway 		pktmp = X509_get_pubkey(peer);
204074664626SKris Kennaway 		BIO_printf(bio,"Server public key is %d bit\n",
204174664626SKris Kennaway 							 EVP_PKEY_bits(pktmp));
204274664626SKris Kennaway 		EVP_PKEY_free(pktmp);
204374664626SKris Kennaway 	}
20446a599222SSimon L. B. Nielsen 	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
20456a599222SSimon L. B. Nielsen 			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
20463b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_COMP
20473b4e3dcbSSimon L. B. Nielsen 	comp=SSL_get_current_compression(s);
20483b4e3dcbSSimon L. B. Nielsen 	expansion=SSL_get_current_expansion(s);
20493b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio,"Compression: %s\n",
20503b4e3dcbSSimon L. B. Nielsen 		comp ? SSL_COMP_get_name(comp) : "NONE");
20513b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio,"Expansion: %s\n",
20523b4e3dcbSSimon L. B. Nielsen 		expansion ? SSL_COMP_get_name(expansion) : "NONE");
20533b4e3dcbSSimon L. B. Nielsen #endif
20541f13597dSJung-uk Kim 
20551f13597dSJung-uk Kim #ifdef SSL_DEBUG
20561f13597dSJung-uk Kim 	{
20571f13597dSJung-uk Kim 	/* Print out local port of connection: useful for debugging */
20581f13597dSJung-uk Kim 	int sock;
20591f13597dSJung-uk Kim 	struct sockaddr_in ladd;
20601f13597dSJung-uk Kim 	socklen_t ladd_size = sizeof(ladd);
20611f13597dSJung-uk Kim 	sock = SSL_get_fd(s);
20621f13597dSJung-uk Kim 	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
20631f13597dSJung-uk Kim 	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
20641f13597dSJung-uk Kim 	}
20651f13597dSJung-uk Kim #endif
20661f13597dSJung-uk Kim 
20671f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
20681f13597dSJung-uk Kim 	if (next_proto.status != -1) {
20691f13597dSJung-uk Kim 		const unsigned char *proto;
20701f13597dSJung-uk Kim 		unsigned int proto_len;
20711f13597dSJung-uk Kim 		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
20721f13597dSJung-uk Kim 		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
20731f13597dSJung-uk Kim 		BIO_write(bio, proto, proto_len);
20741f13597dSJung-uk Kim 		BIO_write(bio, "\n", 1);
20751f13597dSJung-uk Kim 	}
20761f13597dSJung-uk Kim #endif
20771f13597dSJung-uk Kim 
2078*09286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
20791f13597dSJung-uk Kim  	{
20801f13597dSJung-uk Kim  	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
20811f13597dSJung-uk Kim 
20821f13597dSJung-uk Kim 	if(srtp_profile)
20831f13597dSJung-uk Kim 		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
20841f13597dSJung-uk Kim 			   srtp_profile->name);
20851f13597dSJung-uk Kim 	}
2086*09286989SJung-uk Kim #endif
20871f13597dSJung-uk Kim 
208874664626SKris Kennaway 	SSL_SESSION_print(bio,SSL_get_session(s));
20891f13597dSJung-uk Kim 	if (keymatexportlabel != NULL)
20901f13597dSJung-uk Kim 		{
20911f13597dSJung-uk Kim 		BIO_printf(bio, "Keying material exporter:\n");
20921f13597dSJung-uk Kim 		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
20931f13597dSJung-uk Kim 		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
20941f13597dSJung-uk Kim 		exportedkeymat = OPENSSL_malloc(keymatexportlen);
20951f13597dSJung-uk Kim 		if (exportedkeymat != NULL)
20961f13597dSJung-uk Kim 			{
20971f13597dSJung-uk Kim 			if (!SSL_export_keying_material(s, exportedkeymat,
20981f13597dSJung-uk Kim 						        keymatexportlen,
20991f13597dSJung-uk Kim 						        keymatexportlabel,
21001f13597dSJung-uk Kim 						        strlen(keymatexportlabel),
21011f13597dSJung-uk Kim 						        NULL, 0, 0))
21021f13597dSJung-uk Kim 				{
21031f13597dSJung-uk Kim 				BIO_printf(bio, "    Error\n");
21041f13597dSJung-uk Kim 				}
21051f13597dSJung-uk Kim 			else
21061f13597dSJung-uk Kim 				{
21071f13597dSJung-uk Kim 				BIO_printf(bio, "    Keying material: ");
21081f13597dSJung-uk Kim 				for (i=0; i<keymatexportlen; i++)
21091f13597dSJung-uk Kim 					BIO_printf(bio, "%02X",
21101f13597dSJung-uk Kim 						   exportedkeymat[i]);
21111f13597dSJung-uk Kim 				BIO_printf(bio, "\n");
21121f13597dSJung-uk Kim 				}
21131f13597dSJung-uk Kim 			OPENSSL_free(exportedkeymat);
21141f13597dSJung-uk Kim 			}
21151f13597dSJung-uk Kim 		}
211674664626SKris Kennaway 	BIO_printf(bio,"---\n");
211774664626SKris Kennaway 	if (peer != NULL)
211874664626SKris Kennaway 		X509_free(peer);
2119a21b1b38SKris Kennaway 	/* flush, or debugging output gets mixed with http response */
2120db522d3aSSimon L. B. Nielsen 	(void)BIO_flush(bio);
212174664626SKris Kennaway 	}
212274664626SKris Kennaway 
2123db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
2124db522d3aSSimon L. B. Nielsen 
2125db522d3aSSimon L. B. Nielsen static int ocsp_resp_cb(SSL *s, void *arg)
2126db522d3aSSimon L. B. Nielsen 	{
2127db522d3aSSimon L. B. Nielsen 	const unsigned char *p;
2128db522d3aSSimon L. B. Nielsen 	int len;
2129db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE *rsp;
2130db522d3aSSimon L. B. Nielsen 	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2131db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "OCSP response: ");
2132db522d3aSSimon L. B. Nielsen 	if (!p)
2133db522d3aSSimon L. B. Nielsen 		{
2134db522d3aSSimon L. B. Nielsen 		BIO_puts(arg, "no response sent\n");
2135db522d3aSSimon L. B. Nielsen 		return 1;
2136db522d3aSSimon L. B. Nielsen 		}
2137db522d3aSSimon L. B. Nielsen 	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2138db522d3aSSimon L. B. Nielsen 	if (!rsp)
2139db522d3aSSimon L. B. Nielsen 		{
2140db522d3aSSimon L. B. Nielsen 		BIO_puts(arg, "response parse error\n");
2141db522d3aSSimon L. B. Nielsen 		BIO_dump_indent(arg, (char *)p, len, 4);
2142db522d3aSSimon L. B. Nielsen 		return 0;
2143db522d3aSSimon L. B. Nielsen 		}
2144db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "\n======================================\n");
2145db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE_print(arg, rsp, 0);
2146db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "======================================\n");
2147db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE_free(rsp);
2148db522d3aSSimon L. B. Nielsen 	return 1;
2149db522d3aSSimon L. B. Nielsen 	}
21501f13597dSJung-uk Kim 
21511f13597dSJung-uk Kim #endif
2152