xref: /freebsd/crypto/openssl/apps/s_client.c (revision fa5fddf17153bfcd7ee6e86d24ca4b3f71689aa4)
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");
293a93cbc2bSJung-uk Kim 	BIO_printf(bio_err," -verify_return_error - return verification errors\n");
29474664626SKris Kennaway 	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
2953b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
2963b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
29774664626SKris Kennaway 	BIO_printf(bio_err,"                 not specified but cert file is.\n");
2983b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
2993b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
30074664626SKris Kennaway 	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
30174664626SKris Kennaway 	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
30274664626SKris Kennaway 	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
30374664626SKris Kennaway 	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
304a93cbc2bSJung-uk Kim 	BIO_printf(bio_err," -prexit       - print session information even on connection failure\n");
30574664626SKris Kennaway 	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
30674664626SKris Kennaway 	BIO_printf(bio_err," -debug        - extra output\n");
3073b4e3dcbSSimon L. B. Nielsen #ifdef WATT32
3083b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
3093b4e3dcbSSimon L. B. Nielsen #endif
3105c87c606SMark Murray 	BIO_printf(bio_err," -msg          - Show protocol messages\n");
31174664626SKris Kennaway 	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
31274664626SKris Kennaway 	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
31374664626SKris Kennaway #ifdef FIONBIO
31474664626SKris Kennaway 	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
31574664626SKris Kennaway #endif
31674664626SKris Kennaway 	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
31774664626SKris Kennaway 	BIO_printf(bio_err," -quiet        - no s_client output\n");
318f579bf8eSKris Kennaway 	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
319db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
3201f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
3211f13597dSJung-uk Kim 	BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
3221f13597dSJung-uk Kim 	BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
3231f13597dSJung-uk Kim # ifndef OPENSSL_NO_JPAKE
3241f13597dSJung-uk Kim 	BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
3251f13597dSJung-uk Kim # endif
3261f13597dSJung-uk Kim #endif
3271f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
3281f13597dSJung-uk Kim 	BIO_printf(bio_err," -srpuser user     - SRP authentification for 'user'\n");
3291f13597dSJung-uk Kim 	BIO_printf(bio_err," -srppass arg      - password for 'user'\n");
3301f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_lateuser     - SRP username into second ClientHello message\n");
3311f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_moregroups   - Tolerate other than the known g N values.\n");
3321f13597dSJung-uk Kim 	BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
3331f13597dSJung-uk Kim #endif
33474664626SKris Kennaway 	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
33574664626SKris Kennaway 	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
3361f13597dSJung-uk Kim 	BIO_printf(bio_err," -tls1_2       - just use TLSv1.2\n");
3371f13597dSJung-uk Kim 	BIO_printf(bio_err," -tls1_1       - just use TLSv1.1\n");
33874664626SKris Kennaway 	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
3393b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
340*fa5fddf1SJung-uk Kim 	BIO_printf(bio_err," -fallback_scsv - send TLS_FALLBACK_SCSV\n");
3416a599222SSimon L. B. Nielsen 	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
3421f13597dSJung-uk Kim 	BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
34374664626SKris Kennaway 	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
3445c87c606SMark Murray 	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
345f579bf8eSKris Kennaway 	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
34674664626SKris Kennaway 	BIO_printf(bio_err,"                 command to see what is available\n");
3475c87c606SMark Murray 	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
3485c87c606SMark Murray 	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
3495c87c606SMark Murray 	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
350db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
351db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err,"                 are supported.\n");
352fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
3535c87c606SMark Murray 	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
354fceca8a3SJacques Vidrine #endif
3555740a5e3SKris Kennaway 	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
356db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
357db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
358db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
359db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
360db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
361db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -status           - request certificate status from server\n");
362db522d3aSSimon L. B. Nielsen 	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
36309286989SJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
3641f13597dSJung-uk Kim 	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
3651f13597dSJung-uk Kim # endif
366db522d3aSSimon L. B. Nielsen #endif
3676a599222SSimon L. B. Nielsen 	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
36809286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
3691f13597dSJung-uk Kim 	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
37009286989SJung-uk Kim #endif
3711f13597dSJung-uk Kim  	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
3721f13597dSJung-uk Kim  	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
37374664626SKris Kennaway 	}
37474664626SKris Kennaway 
375db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
376db522d3aSSimon L. B. Nielsen 
377db522d3aSSimon L. B. Nielsen /* This is a context that we pass to callbacks */
378db522d3aSSimon L. B. Nielsen typedef struct tlsextctx_st {
379db522d3aSSimon L. B. Nielsen    BIO * biodebug;
380db522d3aSSimon L. B. Nielsen    int ack;
381db522d3aSSimon L. B. Nielsen } tlsextctx;
382db522d3aSSimon L. B. Nielsen 
383db522d3aSSimon L. B. Nielsen 
384db522d3aSSimon L. B. Nielsen static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
385db522d3aSSimon L. B. Nielsen 	{
386db522d3aSSimon L. B. Nielsen 	tlsextctx * p = (tlsextctx *) arg;
387db522d3aSSimon L. B. Nielsen 	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
388db522d3aSSimon L. B. Nielsen 	if (SSL_get_servername_type(s) != -1)
389db522d3aSSimon L. B. Nielsen  	        p->ack = !SSL_session_reused(s) && hn != NULL;
390db522d3aSSimon L. B. Nielsen 	else
391db522d3aSSimon L. B. Nielsen 		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
392db522d3aSSimon L. B. Nielsen 
393db522d3aSSimon L. B. Nielsen 	return SSL_TLSEXT_ERR_OK;
394db522d3aSSimon L. B. Nielsen 	}
3951f13597dSJung-uk Kim 
3961f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
3971f13597dSJung-uk Kim 
3981f13597dSJung-uk Kim /* This is a context that we pass to all callbacks */
3991f13597dSJung-uk Kim typedef struct srp_arg_st
4001f13597dSJung-uk Kim 	{
4011f13597dSJung-uk Kim 	char *srppassin;
4021f13597dSJung-uk Kim 	char *srplogin;
4031f13597dSJung-uk Kim 	int msg;   /* copy from c_msg */
4041f13597dSJung-uk Kim 	int debug; /* copy from c_debug */
4051f13597dSJung-uk Kim 	int amp;   /* allow more groups */
4061f13597dSJung-uk Kim 	int strength /* minimal size for N */ ;
4071f13597dSJung-uk Kim 	} SRP_ARG;
4081f13597dSJung-uk Kim 
4091f13597dSJung-uk Kim #define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
4101f13597dSJung-uk Kim 
4111f13597dSJung-uk Kim static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
4121f13597dSJung-uk Kim 	{
4131f13597dSJung-uk Kim 	BN_CTX *bn_ctx = BN_CTX_new();
4141f13597dSJung-uk Kim 	BIGNUM *p = BN_new();
4151f13597dSJung-uk Kim 	BIGNUM *r = BN_new();
4161f13597dSJung-uk Kim 	int ret =
4171f13597dSJung-uk Kim 		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
4181f13597dSJung-uk Kim 		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
4191f13597dSJung-uk Kim 		p != NULL && BN_rshift1(p, N) &&
4201f13597dSJung-uk Kim 
4211f13597dSJung-uk Kim 		/* p = (N-1)/2 */
4221f13597dSJung-uk Kim 		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
4231f13597dSJung-uk Kim 		r != NULL &&
4241f13597dSJung-uk Kim 
4251f13597dSJung-uk Kim 		/* verify g^((N-1)/2) == -1 (mod N) */
4261f13597dSJung-uk Kim 		BN_mod_exp(r, g, p, N, bn_ctx) &&
4271f13597dSJung-uk Kim 		BN_add_word(r, 1) &&
4281f13597dSJung-uk Kim 		BN_cmp(r, N) == 0;
4291f13597dSJung-uk Kim 
4301f13597dSJung-uk Kim 	if(r)
4311f13597dSJung-uk Kim 		BN_free(r);
4321f13597dSJung-uk Kim 	if(p)
4331f13597dSJung-uk Kim 		BN_free(p);
4341f13597dSJung-uk Kim 	if(bn_ctx)
4351f13597dSJung-uk Kim 		BN_CTX_free(bn_ctx);
4361f13597dSJung-uk Kim 	return ret;
4371f13597dSJung-uk Kim 	}
4381f13597dSJung-uk Kim 
4391f13597dSJung-uk Kim /* This callback is used here for two purposes:
4401f13597dSJung-uk Kim    - extended debugging
4411f13597dSJung-uk Kim    - making some primality tests for unknown groups
4421f13597dSJung-uk Kim    The callback is only called for a non default group.
4431f13597dSJung-uk Kim 
4441f13597dSJung-uk Kim    An application does not need the call back at all if
4451f13597dSJung-uk Kim    only the stanard groups are used.  In real life situations,
4461f13597dSJung-uk Kim    client and server already share well known groups,
4471f13597dSJung-uk Kim    thus there is no need to verify them.
4481f13597dSJung-uk Kim    Furthermore, in case that a server actually proposes a group that
4491f13597dSJung-uk Kim    is not one of those defined in RFC 5054, it is more appropriate
4501f13597dSJung-uk Kim    to add the group to a static list and then compare since
4511f13597dSJung-uk Kim    primality tests are rather cpu consuming.
4521f13597dSJung-uk Kim */
4531f13597dSJung-uk Kim 
4541f13597dSJung-uk Kim static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
4551f13597dSJung-uk Kim 	{
4561f13597dSJung-uk Kim 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
4571f13597dSJung-uk Kim 	BIGNUM *N = NULL, *g = NULL;
4581f13597dSJung-uk Kim 	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
4591f13597dSJung-uk Kim 		return 0;
4601f13597dSJung-uk Kim 	if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
4611f13597dSJung-uk Kim 		{
4621f13597dSJung-uk Kim     		BIO_printf(bio_err, "SRP parameters:\n");
4631f13597dSJung-uk Kim 		BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
4641f13597dSJung-uk Kim 		BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
4651f13597dSJung-uk Kim 		BIO_printf(bio_err,"\n");
4661f13597dSJung-uk Kim 		}
4671f13597dSJung-uk Kim 
4681f13597dSJung-uk Kim 	if (SRP_check_known_gN_param(g,N))
4691f13597dSJung-uk Kim 		return 1;
4701f13597dSJung-uk Kim 
4711f13597dSJung-uk Kim 	if (srp_arg->amp == 1)
4721f13597dSJung-uk Kim 		{
4731f13597dSJung-uk Kim 		if (srp_arg->debug)
4741f13597dSJung-uk Kim 			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
4751f13597dSJung-uk Kim 
4761f13597dSJung-uk Kim /* The srp_moregroups is a real debugging feature.
4771f13597dSJung-uk Kim    Implementors should rather add the value to the known ones.
4781f13597dSJung-uk Kim    The minimal size has already been tested.
4791f13597dSJung-uk Kim */
4801f13597dSJung-uk Kim 		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
4811f13597dSJung-uk Kim 			return 1;
4821f13597dSJung-uk Kim 		}
4831f13597dSJung-uk Kim 	BIO_printf(bio_err, "SRP param N and g rejected.\n");
4841f13597dSJung-uk Kim 	return 0;
4851f13597dSJung-uk Kim 	}
4861f13597dSJung-uk Kim 
4871f13597dSJung-uk Kim #define PWD_STRLEN 1024
4881f13597dSJung-uk Kim 
4891f13597dSJung-uk Kim static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
4901f13597dSJung-uk Kim 	{
4911f13597dSJung-uk Kim 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
4921f13597dSJung-uk Kim 	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
4931f13597dSJung-uk Kim 	PW_CB_DATA cb_tmp;
4941f13597dSJung-uk Kim 	int l;
4951f13597dSJung-uk Kim 
4961f13597dSJung-uk Kim 	cb_tmp.password = (char *)srp_arg->srppassin;
4971f13597dSJung-uk Kim 	cb_tmp.prompt_info = "SRP user";
4981f13597dSJung-uk Kim 	if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
4991f13597dSJung-uk Kim 		{
5001f13597dSJung-uk Kim 		BIO_printf (bio_err, "Can't read Password\n");
5011f13597dSJung-uk Kim 		OPENSSL_free(pass);
5021f13597dSJung-uk Kim 		return NULL;
5031f13597dSJung-uk Kim 		}
5041f13597dSJung-uk Kim 	*(pass+l)= '\0';
5051f13597dSJung-uk Kim 
5061f13597dSJung-uk Kim 	return pass;
5071f13597dSJung-uk Kim 	}
5081f13597dSJung-uk Kim 
509db522d3aSSimon L. B. Nielsen #endif
51009286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
5111f13597dSJung-uk Kim 	char *srtp_profiles = NULL;
51209286989SJung-uk Kim #endif
5131f13597dSJung-uk Kim 
5141f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
5151f13597dSJung-uk Kim /* This the context that we pass to next_proto_cb */
5161f13597dSJung-uk Kim typedef struct tlsextnextprotoctx_st {
5171f13597dSJung-uk Kim 	unsigned char *data;
5181f13597dSJung-uk Kim 	unsigned short len;
5191f13597dSJung-uk Kim 	int status;
5201f13597dSJung-uk Kim } tlsextnextprotoctx;
5211f13597dSJung-uk Kim 
5221f13597dSJung-uk Kim static tlsextnextprotoctx next_proto;
5231f13597dSJung-uk Kim 
5241f13597dSJung-uk Kim static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
5251f13597dSJung-uk Kim 	{
5261f13597dSJung-uk Kim 	tlsextnextprotoctx *ctx = arg;
5271f13597dSJung-uk Kim 
5281f13597dSJung-uk Kim 	if (!c_quiet)
5291f13597dSJung-uk Kim 		{
5301f13597dSJung-uk Kim 		/* We can assume that |in| is syntactically valid. */
5311f13597dSJung-uk Kim 		unsigned i;
5321f13597dSJung-uk Kim 		BIO_printf(bio_c_out, "Protocols advertised by server: ");
5331f13597dSJung-uk Kim 		for (i = 0; i < inlen; )
5341f13597dSJung-uk Kim 			{
5351f13597dSJung-uk Kim 			if (i)
5361f13597dSJung-uk Kim 				BIO_write(bio_c_out, ", ", 2);
5371f13597dSJung-uk Kim 			BIO_write(bio_c_out, &in[i + 1], in[i]);
5381f13597dSJung-uk Kim 			i += in[i] + 1;
5391f13597dSJung-uk Kim 			}
5401f13597dSJung-uk Kim 		BIO_write(bio_c_out, "\n", 1);
5411f13597dSJung-uk Kim 		}
5421f13597dSJung-uk Kim 
5431f13597dSJung-uk Kim 	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
5441f13597dSJung-uk Kim 	return SSL_TLSEXT_ERR_OK;
5451f13597dSJung-uk Kim 	}
54609286989SJung-uk Kim # endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
5471f13597dSJung-uk Kim #endif
5481f13597dSJung-uk Kim 
5495471f83eSSimon L. B. Nielsen enum
5505471f83eSSimon L. B. Nielsen {
5515471f83eSSimon L. B. Nielsen 	PROTO_OFF	= 0,
5525471f83eSSimon L. B. Nielsen 	PROTO_SMTP,
5535471f83eSSimon L. B. Nielsen 	PROTO_POP3,
5545471f83eSSimon L. B. Nielsen 	PROTO_IMAP,
555db522d3aSSimon L. B. Nielsen 	PROTO_FTP,
556db522d3aSSimon L. B. Nielsen 	PROTO_XMPP
5575471f83eSSimon L. B. Nielsen };
5585471f83eSSimon L. B. Nielsen 
559f579bf8eSKris Kennaway int MAIN(int, char **);
560f579bf8eSKris Kennaway 
56174664626SKris Kennaway int MAIN(int argc, char **argv)
56274664626SKris Kennaway 	{
5631f13597dSJung-uk Kim 	unsigned int off=0, clr=0;
5641f13597dSJung-uk Kim 	SSL *con=NULL;
5651f13597dSJung-uk Kim #ifndef OPENSSL_NO_KRB5
5661f13597dSJung-uk Kim 	KSSL_CTX *kctx;
5671f13597dSJung-uk Kim #endif
56874664626SKris Kennaway 	int s,k,width,state=0;
5695c87c606SMark Murray 	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
57074664626SKris Kennaway 	int cbuf_len,cbuf_off;
57174664626SKris Kennaway 	int sbuf_len,sbuf_off;
57274664626SKris Kennaway 	fd_set readfds,writefds;
57374664626SKris Kennaway 	short port=PORT;
57474664626SKris Kennaway 	int full_log=1;
57574664626SKris Kennaway 	char *host=SSL_HOST_NAME;
57674664626SKris Kennaway 	char *cert_file=NULL,*key_file=NULL;
5773b4e3dcbSSimon L. B. Nielsen 	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
5783b4e3dcbSSimon L. B. Nielsen 	char *passarg = NULL, *pass = NULL;
5793b4e3dcbSSimon L. B. Nielsen 	X509 *cert = NULL;
5803b4e3dcbSSimon L. B. Nielsen 	EVP_PKEY *key = NULL;
58174664626SKris Kennaway 	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
58274664626SKris Kennaway 	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
58374664626SKris Kennaway 	int crlf=0;
58474664626SKris Kennaway 	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
58574664626SKris Kennaway 	SSL_CTX *ctx=NULL;
58674664626SKris Kennaway 	int ret=1,in_init=1,i,nbio_test=0;
5875471f83eSSimon L. B. Nielsen 	int starttls_proto = PROTO_OFF;
5881f13597dSJung-uk Kim 	int prexit = 0;
5891f13597dSJung-uk Kim 	X509_VERIFY_PARAM *vpm = NULL;
5901f13597dSJung-uk Kim 	int badarg = 0;
5911f13597dSJung-uk Kim 	const SSL_METHOD *meth=NULL;
5921f13597dSJung-uk Kim 	int socket_type=SOCK_STREAM;
59374664626SKris Kennaway 	BIO *sbio;
5945740a5e3SKris Kennaway 	char *inrand=NULL;
5955471f83eSSimon L. B. Nielsen 	int mbuf_len=0;
5966a599222SSimon L. B. Nielsen 	struct timeval timeout, *timeoutp;
597fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
5985c87c606SMark Murray 	char *engine_id=NULL;
599db522d3aSSimon L. B. Nielsen 	char *ssl_client_engine_id=NULL;
600db522d3aSSimon L. B. Nielsen 	ENGINE *ssl_client_engine=NULL;
601fceca8a3SJacques Vidrine #endif
602db522d3aSSimon L. B. Nielsen 	ENGINE *e=NULL;
6031f13597dSJung-uk Kim #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
604f579bf8eSKris Kennaway 	struct timeval tv;
6051f13597dSJung-uk Kim #if defined(OPENSSL_SYS_BEOS_R5)
6061f13597dSJung-uk Kim 	int stdin_set = 0;
607f579bf8eSKris Kennaway #endif
6081f13597dSJung-uk Kim #endif
609db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
610db522d3aSSimon L. B. Nielsen 	char *servername = NULL;
611db522d3aSSimon L. B. Nielsen         tlsextctx tlsextcbp =
612db522d3aSSimon L. B. Nielsen         {NULL,0};
6131f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
6141f13597dSJung-uk Kim 	const char *next_proto_neg_in = NULL;
6151f13597dSJung-uk Kim # endif
616db522d3aSSimon L. B. Nielsen #endif
617db522d3aSSimon L. B. Nielsen 	char *sess_in = NULL;
618db522d3aSSimon L. B. Nielsen 	char *sess_out = NULL;
6193b4e3dcbSSimon L. B. Nielsen 	struct sockaddr peer;
6203b4e3dcbSSimon L. B. Nielsen 	int peerlen = sizeof(peer);
621*fa5fddf1SJung-uk Kim 	int fallback_scsv = 0;
6223b4e3dcbSSimon L. B. Nielsen 	int enable_timeouts = 0 ;
6236a599222SSimon L. B. Nielsen 	long socket_mtu = 0;
624db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
625db522d3aSSimon L. B. Nielsen 	char *jpake_secret = NULL;
626db522d3aSSimon L. B. Nielsen #endif
6271f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
6281f13597dSJung-uk Kim 	char * srppass = NULL;
6291f13597dSJung-uk Kim 	int srp_lateuser = 0;
6301f13597dSJung-uk Kim 	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
6311f13597dSJung-uk Kim #endif
6323b4e3dcbSSimon L. B. Nielsen 
63374664626SKris Kennaway 	meth=SSLv23_client_method();
63474664626SKris Kennaway 
63574664626SKris Kennaway 	apps_startup();
63674664626SKris Kennaway 	c_Pause=0;
63774664626SKris Kennaway 	c_quiet=0;
638f579bf8eSKris Kennaway 	c_ign_eof=0;
63974664626SKris Kennaway 	c_debug=0;
6405c87c606SMark Murray 	c_msg=0;
64174664626SKris Kennaway 	c_showcerts=0;
64274664626SKris Kennaway 
64374664626SKris Kennaway 	if (bio_err == NULL)
64474664626SKris Kennaway 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
64574664626SKris Kennaway 
6465c87c606SMark Murray 	if (!load_config(bio_err, NULL))
6475c87c606SMark Murray 		goto end;
6485c87c606SMark Murray 
649ddd58736SKris Kennaway 	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
6505c87c606SMark Murray 		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
6515c87c606SMark Murray 		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
65274664626SKris Kennaway 		{
65374664626SKris Kennaway 		BIO_printf(bio_err,"out of memory\n");
65474664626SKris Kennaway 		goto end;
65574664626SKris Kennaway 		}
65674664626SKris Kennaway 
65774664626SKris Kennaway 	verify_depth=0;
65874664626SKris Kennaway 	verify_error=X509_V_OK;
65974664626SKris Kennaway #ifdef FIONBIO
66074664626SKris Kennaway 	c_nbio=0;
66174664626SKris Kennaway #endif
66274664626SKris Kennaway 
66374664626SKris Kennaway 	argc--;
66474664626SKris Kennaway 	argv++;
66574664626SKris Kennaway 	while (argc >= 1)
66674664626SKris Kennaway 		{
66774664626SKris Kennaway 		if	(strcmp(*argv,"-host") == 0)
66874664626SKris Kennaway 			{
66974664626SKris Kennaway 			if (--argc < 1) goto bad;
67074664626SKris Kennaway 			host= *(++argv);
67174664626SKris Kennaway 			}
67274664626SKris Kennaway 		else if	(strcmp(*argv,"-port") == 0)
67374664626SKris Kennaway 			{
67474664626SKris Kennaway 			if (--argc < 1) goto bad;
67574664626SKris Kennaway 			port=atoi(*(++argv));
67674664626SKris Kennaway 			if (port == 0) goto bad;
67774664626SKris Kennaway 			}
67874664626SKris Kennaway 		else if (strcmp(*argv,"-connect") == 0)
67974664626SKris Kennaway 			{
68074664626SKris Kennaway 			if (--argc < 1) goto bad;
68174664626SKris Kennaway 			if (!extract_host_port(*(++argv),&host,NULL,&port))
68274664626SKris Kennaway 				goto bad;
68374664626SKris Kennaway 			}
68474664626SKris Kennaway 		else if	(strcmp(*argv,"-verify") == 0)
68574664626SKris Kennaway 			{
68674664626SKris Kennaway 			verify=SSL_VERIFY_PEER;
68774664626SKris Kennaway 			if (--argc < 1) goto bad;
68874664626SKris Kennaway 			verify_depth=atoi(*(++argv));
68974664626SKris Kennaway 			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
69074664626SKris Kennaway 			}
69174664626SKris Kennaway 		else if	(strcmp(*argv,"-cert") == 0)
69274664626SKris Kennaway 			{
69374664626SKris Kennaway 			if (--argc < 1) goto bad;
69474664626SKris Kennaway 			cert_file= *(++argv);
69574664626SKris Kennaway 			}
696db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-sess_out") == 0)
697db522d3aSSimon L. B. Nielsen 			{
698db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
699db522d3aSSimon L. B. Nielsen 			sess_out = *(++argv);
700db522d3aSSimon L. B. Nielsen 			}
701db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-sess_in") == 0)
702db522d3aSSimon L. B. Nielsen 			{
703db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
704db522d3aSSimon L. B. Nielsen 			sess_in = *(++argv);
705db522d3aSSimon L. B. Nielsen 			}
7063b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-certform") == 0)
7073b4e3dcbSSimon L. B. Nielsen 			{
7083b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
7093b4e3dcbSSimon L. B. Nielsen 			cert_format = str2fmt(*(++argv));
7103b4e3dcbSSimon L. B. Nielsen 			}
7111f13597dSJung-uk Kim 		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
7121f13597dSJung-uk Kim 			{
7131f13597dSJung-uk Kim 			if (badarg)
7141f13597dSJung-uk Kim 				goto bad;
7151f13597dSJung-uk Kim 			continue;
7161f13597dSJung-uk Kim 			}
7171f13597dSJung-uk Kim 		else if (strcmp(*argv,"-verify_return_error") == 0)
7181f13597dSJung-uk Kim 			verify_return_error = 1;
719f579bf8eSKris Kennaway 		else if	(strcmp(*argv,"-prexit") == 0)
720f579bf8eSKris Kennaway 			prexit=1;
72174664626SKris Kennaway 		else if	(strcmp(*argv,"-crlf") == 0)
72274664626SKris Kennaway 			crlf=1;
72374664626SKris Kennaway 		else if	(strcmp(*argv,"-quiet") == 0)
724f579bf8eSKris Kennaway 			{
72574664626SKris Kennaway 			c_quiet=1;
726f579bf8eSKris Kennaway 			c_ign_eof=1;
727f579bf8eSKris Kennaway 			}
728f579bf8eSKris Kennaway 		else if	(strcmp(*argv,"-ign_eof") == 0)
729f579bf8eSKris Kennaway 			c_ign_eof=1;
730db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_ign_eof") == 0)
731db522d3aSSimon L. B. Nielsen 			c_ign_eof=0;
73274664626SKris Kennaway 		else if	(strcmp(*argv,"-pause") == 0)
73374664626SKris Kennaway 			c_Pause=1;
73474664626SKris Kennaway 		else if	(strcmp(*argv,"-debug") == 0)
73574664626SKris Kennaway 			c_debug=1;
736db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
737db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-tlsextdebug") == 0)
738db522d3aSSimon L. B. Nielsen 			c_tlsextdebug=1;
739db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-status") == 0)
740db522d3aSSimon L. B. Nielsen 			c_status_req=1;
741db522d3aSSimon L. B. Nielsen #endif
7423b4e3dcbSSimon L. B. Nielsen #ifdef WATT32
7433b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-wdebug") == 0)
7443b4e3dcbSSimon L. B. Nielsen 			dbug_init();
7453b4e3dcbSSimon L. B. Nielsen #endif
7465c87c606SMark Murray 		else if	(strcmp(*argv,"-msg") == 0)
7475c87c606SMark Murray 			c_msg=1;
74874664626SKris Kennaway 		else if	(strcmp(*argv,"-showcerts") == 0)
74974664626SKris Kennaway 			c_showcerts=1;
75074664626SKris Kennaway 		else if	(strcmp(*argv,"-nbio_test") == 0)
75174664626SKris Kennaway 			nbio_test=1;
75274664626SKris Kennaway 		else if	(strcmp(*argv,"-state") == 0)
75374664626SKris Kennaway 			state=1;
7541f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
7551f13597dSJung-uk Kim                 else if (strcmp(*argv,"-psk_identity") == 0)
7561f13597dSJung-uk Kim 			{
7571f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7581f13597dSJung-uk Kim 			psk_identity=*(++argv);
7591f13597dSJung-uk Kim 			}
7601f13597dSJung-uk Kim                 else if (strcmp(*argv,"-psk") == 0)
7611f13597dSJung-uk Kim 			{
7621f13597dSJung-uk Kim                         size_t j;
7631f13597dSJung-uk Kim 
7641f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7651f13597dSJung-uk Kim 			psk_key=*(++argv);
7661f13597dSJung-uk Kim 			for (j = 0; j < strlen(psk_key); j++)
7671f13597dSJung-uk Kim                                 {
7681f13597dSJung-uk Kim                                 if (isxdigit((unsigned char)psk_key[j]))
7691f13597dSJung-uk Kim                                         continue;
7701f13597dSJung-uk Kim                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
7711f13597dSJung-uk Kim                                 goto bad;
7721f13597dSJung-uk Kim                                 }
7731f13597dSJung-uk Kim 			}
7741f13597dSJung-uk Kim #endif
7751f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
7761f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srpuser") == 0)
7771f13597dSJung-uk Kim 			{
7781f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7791f13597dSJung-uk Kim 			srp_arg.srplogin= *(++argv);
7801f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7811f13597dSJung-uk Kim 			}
7821f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srppass") == 0)
7831f13597dSJung-uk Kim 			{
7841f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7851f13597dSJung-uk Kim 			srppass= *(++argv);
7861f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7871f13597dSJung-uk Kim 			}
7881f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srp_strength") == 0)
7891f13597dSJung-uk Kim 			{
7901f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
7911f13597dSJung-uk Kim 			srp_arg.strength=atoi(*(++argv));
7921f13597dSJung-uk Kim 			BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
7931f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7941f13597dSJung-uk Kim 			}
7951f13597dSJung-uk Kim 		else if (strcmp(*argv,"-srp_lateuser") == 0)
7961f13597dSJung-uk Kim 			{
7971f13597dSJung-uk Kim 			srp_lateuser= 1;
7981f13597dSJung-uk Kim 			meth=TLSv1_client_method();
7991f13597dSJung-uk Kim 			}
8001f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-srp_moregroups") == 0)
8011f13597dSJung-uk Kim 			{
8021f13597dSJung-uk Kim 			srp_arg.amp=1;
8031f13597dSJung-uk Kim 			meth=TLSv1_client_method();
8041f13597dSJung-uk Kim 			}
8051f13597dSJung-uk Kim #endif
8065c87c606SMark Murray #ifndef OPENSSL_NO_SSL2
80774664626SKris Kennaway 		else if	(strcmp(*argv,"-ssl2") == 0)
80874664626SKris Kennaway 			meth=SSLv2_client_method();
80974664626SKris Kennaway #endif
8105c87c606SMark Murray #ifndef OPENSSL_NO_SSL3
81174664626SKris Kennaway 		else if	(strcmp(*argv,"-ssl3") == 0)
81274664626SKris Kennaway 			meth=SSLv3_client_method();
81374664626SKris Kennaway #endif
8145c87c606SMark Murray #ifndef OPENSSL_NO_TLS1
8151f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-tls1_2") == 0)
8161f13597dSJung-uk Kim 			meth=TLSv1_2_client_method();
8171f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-tls1_1") == 0)
8181f13597dSJung-uk Kim 			meth=TLSv1_1_client_method();
81974664626SKris Kennaway 		else if	(strcmp(*argv,"-tls1") == 0)
82074664626SKris Kennaway 			meth=TLSv1_client_method();
82174664626SKris Kennaway #endif
8223b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_DTLS1
8233b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-dtls1") == 0)
8243b4e3dcbSSimon L. B. Nielsen 			{
8253b4e3dcbSSimon L. B. Nielsen 			meth=DTLSv1_client_method();
8261f13597dSJung-uk Kim 			socket_type=SOCK_DGRAM;
8273b4e3dcbSSimon L. B. Nielsen 			}
828*fa5fddf1SJung-uk Kim 		else if (strcmp(*argv,"-fallback_scsv") == 0)
829*fa5fddf1SJung-uk Kim 			{
830*fa5fddf1SJung-uk Kim 			fallback_scsv = 1;
831*fa5fddf1SJung-uk Kim 			}
8323b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-timeout") == 0)
8333b4e3dcbSSimon L. B. Nielsen 			enable_timeouts=1;
8343b4e3dcbSSimon L. B. Nielsen 		else if (strcmp(*argv,"-mtu") == 0)
8353b4e3dcbSSimon L. B. Nielsen 			{
8363b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8376a599222SSimon L. B. Nielsen 			socket_mtu = atol(*(++argv));
8383b4e3dcbSSimon L. B. Nielsen 			}
8393b4e3dcbSSimon L. B. Nielsen #endif
84074664626SKris Kennaway 		else if (strcmp(*argv,"-bugs") == 0)
84174664626SKris Kennaway 			bugs=1;
8423b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-keyform") == 0)
8433b4e3dcbSSimon L. B. Nielsen 			{
8443b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8453b4e3dcbSSimon L. B. Nielsen 			key_format = str2fmt(*(++argv));
8463b4e3dcbSSimon L. B. Nielsen 			}
8473b4e3dcbSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-pass") == 0)
8483b4e3dcbSSimon L. B. Nielsen 			{
8493b4e3dcbSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
8503b4e3dcbSSimon L. B. Nielsen 			passarg = *(++argv);
8513b4e3dcbSSimon L. B. Nielsen 			}
85274664626SKris Kennaway 		else if	(strcmp(*argv,"-key") == 0)
85374664626SKris Kennaway 			{
85474664626SKris Kennaway 			if (--argc < 1) goto bad;
85574664626SKris Kennaway 			key_file= *(++argv);
85674664626SKris Kennaway 			}
85774664626SKris Kennaway 		else if	(strcmp(*argv,"-reconnect") == 0)
85874664626SKris Kennaway 			{
85974664626SKris Kennaway 			reconnect=5;
86074664626SKris Kennaway 			}
86174664626SKris Kennaway 		else if	(strcmp(*argv,"-CApath") == 0)
86274664626SKris Kennaway 			{
86374664626SKris Kennaway 			if (--argc < 1) goto bad;
86474664626SKris Kennaway 			CApath= *(++argv);
86574664626SKris Kennaway 			}
86674664626SKris Kennaway 		else if	(strcmp(*argv,"-CAfile") == 0)
86774664626SKris Kennaway 			{
86874664626SKris Kennaway 			if (--argc < 1) goto bad;
86974664626SKris Kennaway 			CAfile= *(++argv);
87074664626SKris Kennaway 			}
8711f13597dSJung-uk Kim 		else if (strcmp(*argv,"-no_tls1_2") == 0)
8721f13597dSJung-uk Kim 			off|=SSL_OP_NO_TLSv1_2;
8731f13597dSJung-uk Kim 		else if (strcmp(*argv,"-no_tls1_1") == 0)
8741f13597dSJung-uk Kim 			off|=SSL_OP_NO_TLSv1_1;
87574664626SKris Kennaway 		else if (strcmp(*argv,"-no_tls1") == 0)
87674664626SKris Kennaway 			off|=SSL_OP_NO_TLSv1;
87774664626SKris Kennaway 		else if (strcmp(*argv,"-no_ssl3") == 0)
87874664626SKris Kennaway 			off|=SSL_OP_NO_SSLv3;
87974664626SKris Kennaway 		else if (strcmp(*argv,"-no_ssl2") == 0)
88074664626SKris Kennaway 			off|=SSL_OP_NO_SSLv2;
8811f13597dSJung-uk Kim 		else if	(strcmp(*argv,"-no_comp") == 0)
8821f13597dSJung-uk Kim 			{ off|=SSL_OP_NO_COMPRESSION; }
883db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
884db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_ticket") == 0)
885db522d3aSSimon L. B. Nielsen 			{ off|=SSL_OP_NO_TICKET; }
8861f13597dSJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
8871f13597dSJung-uk Kim 		else if (strcmp(*argv,"-nextprotoneg") == 0)
8881f13597dSJung-uk Kim 			{
8891f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
8901f13597dSJung-uk Kim 			next_proto_neg_in = *(++argv);
8911f13597dSJung-uk Kim 			}
8921f13597dSJung-uk Kim # endif
893db522d3aSSimon L. B. Nielsen #endif
8945c87c606SMark Murray 		else if (strcmp(*argv,"-serverpref") == 0)
8955c87c606SMark Murray 			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
8966a599222SSimon L. B. Nielsen 		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
8976a599222SSimon L. B. Nielsen 			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
8986a599222SSimon L. B. Nielsen 		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
8996a599222SSimon L. B. Nielsen 			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
9006a599222SSimon L. B. Nielsen 		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
9016a599222SSimon L. B. Nielsen 			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
90274664626SKris Kennaway 		else if	(strcmp(*argv,"-cipher") == 0)
90374664626SKris Kennaway 			{
90474664626SKris Kennaway 			if (--argc < 1) goto bad;
90574664626SKris Kennaway 			cipher= *(++argv);
90674664626SKris Kennaway 			}
90774664626SKris Kennaway #ifdef FIONBIO
90874664626SKris Kennaway 		else if (strcmp(*argv,"-nbio") == 0)
90974664626SKris Kennaway 			{ c_nbio=1; }
91074664626SKris Kennaway #endif
9115c87c606SMark Murray 		else if	(strcmp(*argv,"-starttls") == 0)
9125c87c606SMark Murray 			{
9135c87c606SMark Murray 			if (--argc < 1) goto bad;
9145c87c606SMark Murray 			++argv;
9155c87c606SMark Murray 			if (strcmp(*argv,"smtp") == 0)
9165471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_SMTP;
91750ef0093SJacques Vidrine 			else if (strcmp(*argv,"pop3") == 0)
9185471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_POP3;
9195471f83eSSimon L. B. Nielsen 			else if (strcmp(*argv,"imap") == 0)
9205471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_IMAP;
9215471f83eSSimon L. B. Nielsen 			else if (strcmp(*argv,"ftp") == 0)
9225471f83eSSimon L. B. Nielsen 				starttls_proto = PROTO_FTP;
923db522d3aSSimon L. B. Nielsen 			else if (strcmp(*argv, "xmpp") == 0)
924db522d3aSSimon L. B. Nielsen 				starttls_proto = PROTO_XMPP;
9255c87c606SMark Murray 			else
9265c87c606SMark Murray 				goto bad;
9275c87c606SMark Murray 			}
928fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
9295c87c606SMark Murray 		else if	(strcmp(*argv,"-engine") == 0)
9305c87c606SMark Murray 			{
9315c87c606SMark Murray 			if (--argc < 1) goto bad;
9325c87c606SMark Murray 			engine_id = *(++argv);
9335c87c606SMark Murray 			}
934db522d3aSSimon L. B. Nielsen 		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
935db522d3aSSimon L. B. Nielsen 			{
936db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
937db522d3aSSimon L. B. Nielsen 			ssl_client_engine_id = *(++argv);
938db522d3aSSimon L. B. Nielsen 			}
939fceca8a3SJacques Vidrine #endif
9405740a5e3SKris Kennaway 		else if (strcmp(*argv,"-rand") == 0)
9415740a5e3SKris Kennaway 			{
9425740a5e3SKris Kennaway 			if (--argc < 1) goto bad;
9435740a5e3SKris Kennaway 			inrand= *(++argv);
9445740a5e3SKris Kennaway 			}
945db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
946db522d3aSSimon L. B. Nielsen 		else if (strcmp(*argv,"-servername") == 0)
947db522d3aSSimon L. B. Nielsen 			{
948db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
949db522d3aSSimon L. B. Nielsen 			servername= *(++argv);
950db522d3aSSimon L. B. Nielsen 			/* meth=TLSv1_client_method(); */
951db522d3aSSimon L. B. Nielsen 			}
952db522d3aSSimon L. B. Nielsen #endif
953db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
954db522d3aSSimon L. B. Nielsen 		else if (strcmp(*argv,"-jpake") == 0)
955db522d3aSSimon L. B. Nielsen 			{
956db522d3aSSimon L. B. Nielsen 			if (--argc < 1) goto bad;
957db522d3aSSimon L. B. Nielsen 			jpake_secret = *++argv;
958db522d3aSSimon L. B. Nielsen 			}
959db522d3aSSimon L. B. Nielsen #endif
96009286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
9611f13597dSJung-uk Kim 		else if (strcmp(*argv,"-use_srtp") == 0)
9621f13597dSJung-uk Kim 			{
9631f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9641f13597dSJung-uk Kim 			srtp_profiles = *(++argv);
9651f13597dSJung-uk Kim 			}
96609286989SJung-uk Kim #endif
9671f13597dSJung-uk Kim 		else if (strcmp(*argv,"-keymatexport") == 0)
9681f13597dSJung-uk Kim 			{
9691f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9701f13597dSJung-uk Kim 			keymatexportlabel= *(++argv);
9711f13597dSJung-uk Kim 			}
9721f13597dSJung-uk Kim 		else if (strcmp(*argv,"-keymatexportlen") == 0)
9731f13597dSJung-uk Kim 			{
9741f13597dSJung-uk Kim 			if (--argc < 1) goto bad;
9751f13597dSJung-uk Kim 			keymatexportlen=atoi(*(++argv));
9761f13597dSJung-uk Kim 			if (keymatexportlen == 0) goto bad;
9771f13597dSJung-uk Kim 			}
97874664626SKris Kennaway                 else
97974664626SKris Kennaway 			{
98074664626SKris Kennaway 			BIO_printf(bio_err,"unknown option %s\n",*argv);
98174664626SKris Kennaway 			badop=1;
98274664626SKris Kennaway 			break;
98374664626SKris Kennaway 			}
98474664626SKris Kennaway 		argc--;
98574664626SKris Kennaway 		argv++;
98674664626SKris Kennaway 		}
98774664626SKris Kennaway 	if (badop)
98874664626SKris Kennaway 		{
98974664626SKris Kennaway bad:
99074664626SKris Kennaway 		sc_usage();
99174664626SKris Kennaway 		goto end;
99274664626SKris Kennaway 		}
99374664626SKris Kennaway 
9941f13597dSJung-uk Kim #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
9951f13597dSJung-uk Kim 	if (jpake_secret)
9961f13597dSJung-uk Kim 		{
9971f13597dSJung-uk Kim 		if (psk_key)
9981f13597dSJung-uk Kim 			{
9991f13597dSJung-uk Kim 			BIO_printf(bio_err,
10001f13597dSJung-uk Kim 				   "Can't use JPAKE and PSK together\n");
10011f13597dSJung-uk Kim 			goto end;
10021f13597dSJung-uk Kim 			}
10031f13597dSJung-uk Kim 		psk_identity = "JPAKE";
10041f13597dSJung-uk Kim 		if (cipher)
10051f13597dSJung-uk Kim 			{
10061f13597dSJung-uk Kim 			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
10071f13597dSJung-uk Kim 			goto end;
10081f13597dSJung-uk Kim 			}
10091f13597dSJung-uk Kim 		cipher = "PSK";
10101f13597dSJung-uk Kim 		}
10111f13597dSJung-uk Kim #endif
10121f13597dSJung-uk Kim 
10135c87c606SMark Murray 	OpenSSL_add_ssl_algorithms();
10145c87c606SMark Murray 	SSL_load_error_strings();
10155c87c606SMark Murray 
10161f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
10171f13597dSJung-uk Kim 	next_proto.status = -1;
10181f13597dSJung-uk Kim 	if (next_proto_neg_in)
10191f13597dSJung-uk Kim 		{
10201f13597dSJung-uk Kim 		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
10211f13597dSJung-uk Kim 		if (next_proto.data == NULL)
10221f13597dSJung-uk Kim 			{
10231f13597dSJung-uk Kim 			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
10241f13597dSJung-uk Kim 			goto end;
10251f13597dSJung-uk Kim 			}
10261f13597dSJung-uk Kim 		}
10271f13597dSJung-uk Kim 	else
10281f13597dSJung-uk Kim 		next_proto.data = NULL;
10291f13597dSJung-uk Kim #endif
10301f13597dSJung-uk Kim 
1031fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE
10325c87c606SMark Murray         e = setup_engine(bio_err, engine_id, 1);
1033db522d3aSSimon L. B. Nielsen 	if (ssl_client_engine_id)
1034db522d3aSSimon L. B. Nielsen 		{
1035db522d3aSSimon L. B. Nielsen 		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1036db522d3aSSimon L. B. Nielsen 		if (!ssl_client_engine)
1037db522d3aSSimon L. B. Nielsen 			{
1038db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err,
1039db522d3aSSimon L. B. Nielsen 					"Error getting client auth engine\n");
1040db522d3aSSimon L. B. Nielsen 			goto end;
1041db522d3aSSimon L. B. Nielsen 			}
1042db522d3aSSimon L. B. Nielsen 		}
10431f13597dSJung-uk Kim 
1044fceca8a3SJacques Vidrine #endif
10453b4e3dcbSSimon L. B. Nielsen 	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
10463b4e3dcbSSimon L. B. Nielsen 		{
10473b4e3dcbSSimon L. B. Nielsen 		BIO_printf(bio_err, "Error getting password\n");
10483b4e3dcbSSimon L. B. Nielsen 		goto end;
10493b4e3dcbSSimon L. B. Nielsen 		}
10503b4e3dcbSSimon L. B. Nielsen 
10513b4e3dcbSSimon L. B. Nielsen 	if (key_file == NULL)
10523b4e3dcbSSimon L. B. Nielsen 		key_file = cert_file;
10533b4e3dcbSSimon L. B. Nielsen 
10543b4e3dcbSSimon L. B. Nielsen 
10553b4e3dcbSSimon L. B. Nielsen 	if (key_file)
10563b4e3dcbSSimon L. B. Nielsen 
10573b4e3dcbSSimon L. B. Nielsen 		{
10583b4e3dcbSSimon L. B. Nielsen 
10593b4e3dcbSSimon L. B. Nielsen 		key = load_key(bio_err, key_file, key_format, 0, pass, e,
10603b4e3dcbSSimon L. B. Nielsen 			       "client certificate private key file");
10613b4e3dcbSSimon L. B. Nielsen 		if (!key)
10623b4e3dcbSSimon L. B. Nielsen 			{
10633b4e3dcbSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
10643b4e3dcbSSimon L. B. Nielsen 			goto end;
10653b4e3dcbSSimon L. B. Nielsen 			}
10663b4e3dcbSSimon L. B. Nielsen 
10673b4e3dcbSSimon L. B. Nielsen 		}
10683b4e3dcbSSimon L. B. Nielsen 
10693b4e3dcbSSimon L. B. Nielsen 	if (cert_file)
10703b4e3dcbSSimon L. B. Nielsen 
10713b4e3dcbSSimon L. B. Nielsen 		{
10723b4e3dcbSSimon L. B. Nielsen 		cert = load_cert(bio_err,cert_file,cert_format,
10733b4e3dcbSSimon L. B. Nielsen 				NULL, e, "client certificate file");
10743b4e3dcbSSimon L. B. Nielsen 
10753b4e3dcbSSimon L. B. Nielsen 		if (!cert)
10763b4e3dcbSSimon L. B. Nielsen 			{
10773b4e3dcbSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
10783b4e3dcbSSimon L. B. Nielsen 			goto end;
10793b4e3dcbSSimon L. B. Nielsen 			}
10803b4e3dcbSSimon L. B. Nielsen 		}
10815c87c606SMark Murray 
10825740a5e3SKris Kennaway 	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
10835740a5e3SKris Kennaway 		&& !RAND_status())
10845740a5e3SKris Kennaway 		{
10855740a5e3SKris Kennaway 		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
10865740a5e3SKris Kennaway 		}
10875740a5e3SKris Kennaway 	if (inrand != NULL)
10885740a5e3SKris Kennaway 		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
10895740a5e3SKris Kennaway 			app_RAND_load_files(inrand));
1090f579bf8eSKris Kennaway 
109174664626SKris Kennaway 	if (bio_c_out == NULL)
109274664626SKris Kennaway 		{
10935c87c606SMark Murray 		if (c_quiet && !c_debug && !c_msg)
109474664626SKris Kennaway 			{
109574664626SKris Kennaway 			bio_c_out=BIO_new(BIO_s_null());
109674664626SKris Kennaway 			}
109774664626SKris Kennaway 		else
109874664626SKris Kennaway 			{
109974664626SKris Kennaway 			if (bio_c_out == NULL)
110074664626SKris Kennaway 				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
110174664626SKris Kennaway 			}
110274664626SKris Kennaway 		}
110374664626SKris Kennaway 
11041f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
11051f13597dSJung-uk Kim 	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
11061f13597dSJung-uk Kim 		{
11071f13597dSJung-uk Kim 		BIO_printf(bio_err, "Error getting password\n");
11081f13597dSJung-uk Kim 		goto end;
11091f13597dSJung-uk Kim 		}
11101f13597dSJung-uk Kim #endif
11111f13597dSJung-uk Kim 
111274664626SKris Kennaway 	ctx=SSL_CTX_new(meth);
111374664626SKris Kennaway 	if (ctx == NULL)
111474664626SKris Kennaway 		{
111574664626SKris Kennaway 		ERR_print_errors(bio_err);
111674664626SKris Kennaway 		goto end;
111774664626SKris Kennaway 		}
111874664626SKris Kennaway 
11191f13597dSJung-uk Kim 	if (vpm)
11201f13597dSJung-uk Kim 		SSL_CTX_set1_param(ctx, vpm);
11211f13597dSJung-uk Kim 
1122db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_ENGINE
1123db522d3aSSimon L. B. Nielsen 	if (ssl_client_engine)
1124db522d3aSSimon L. B. Nielsen 		{
1125db522d3aSSimon L. B. Nielsen 		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1126db522d3aSSimon L. B. Nielsen 			{
1127db522d3aSSimon L. B. Nielsen 			BIO_puts(bio_err, "Error setting client auth engine\n");
1128db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1129db522d3aSSimon L. B. Nielsen 			ENGINE_free(ssl_client_engine);
1130db522d3aSSimon L. B. Nielsen 			goto end;
1131db522d3aSSimon L. B. Nielsen 			}
1132db522d3aSSimon L. B. Nielsen 		ENGINE_free(ssl_client_engine);
1133db522d3aSSimon L. B. Nielsen 		}
1134db522d3aSSimon L. B. Nielsen #endif
1135db522d3aSSimon L. B. Nielsen 
11361f13597dSJung-uk Kim #ifndef OPENSSL_NO_PSK
11371f13597dSJung-uk Kim #ifdef OPENSSL_NO_JPAKE
11381f13597dSJung-uk Kim 	if (psk_key != NULL)
11391f13597dSJung-uk Kim #else
11401f13597dSJung-uk Kim 	if (psk_key != NULL || jpake_secret)
11411f13597dSJung-uk Kim #endif
11421f13597dSJung-uk Kim 		{
11431f13597dSJung-uk Kim 		if (c_debug)
11441f13597dSJung-uk Kim 			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
11451f13597dSJung-uk Kim 		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
11461f13597dSJung-uk Kim 		}
114709286989SJung-uk Kim #endif
114809286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
11491f13597dSJung-uk Kim 	if (srtp_profiles != NULL)
11501f13597dSJung-uk Kim 		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
11511f13597dSJung-uk Kim #endif
115274664626SKris Kennaway 	if (bugs)
115374664626SKris Kennaway 		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
115474664626SKris Kennaway 	else
115574664626SKris Kennaway 		SSL_CTX_set_options(ctx,off);
11566a599222SSimon L. B. Nielsen 
11576a599222SSimon L. B. Nielsen 	if (clr)
11586a599222SSimon L. B. Nielsen 		SSL_CTX_clear_options(ctx, clr);
11593b4e3dcbSSimon L. B. Nielsen 	/* DTLS: partial reads end up discarding unread UDP bytes :-(
11603b4e3dcbSSimon L. B. Nielsen 	 * Setting read ahead solves this problem.
11613b4e3dcbSSimon L. B. Nielsen 	 */
11621f13597dSJung-uk Kim 	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
11631f13597dSJung-uk Kim 
11641f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
11651f13597dSJung-uk Kim 	if (next_proto.data)
11661f13597dSJung-uk Kim 		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
11671f13597dSJung-uk Kim #endif
116874664626SKris Kennaway 
116974664626SKris Kennaway 	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
117074664626SKris Kennaway 	if (cipher != NULL)
1171f579bf8eSKris Kennaway 		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1172f579bf8eSKris Kennaway 		BIO_printf(bio_err,"error setting cipher list\n");
1173f579bf8eSKris Kennaway 		ERR_print_errors(bio_err);
1174f579bf8eSKris Kennaway 		goto end;
1175f579bf8eSKris Kennaway 	}
117674664626SKris Kennaway #if 0
117774664626SKris Kennaway 	else
117874664626SKris Kennaway 		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
117974664626SKris Kennaway #endif
118074664626SKris Kennaway 
118174664626SKris Kennaway 	SSL_CTX_set_verify(ctx,verify,verify_callback);
11823b4e3dcbSSimon L. B. Nielsen 	if (!set_cert_key_stuff(ctx,cert,key))
118374664626SKris Kennaway 		goto end;
118474664626SKris Kennaway 
118574664626SKris Kennaway 	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
118674664626SKris Kennaway 		(!SSL_CTX_set_default_verify_paths(ctx)))
118774664626SKris Kennaway 		{
1188f579bf8eSKris Kennaway 		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
118974664626SKris Kennaway 		ERR_print_errors(bio_err);
119074664626SKris Kennaway 		/* goto end; */
119174664626SKris Kennaway 		}
119274664626SKris Kennaway 
1193db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1194db522d3aSSimon L. B. Nielsen 	if (servername != NULL)
1195db522d3aSSimon L. B. Nielsen 		{
1196db522d3aSSimon L. B. Nielsen 		tlsextcbp.biodebug = bio_err;
1197db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1198db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1199db522d3aSSimon L. B. Nielsen 		}
12001f13597dSJung-uk Kim #ifndef OPENSSL_NO_SRP
12011f13597dSJung-uk Kim         if (srp_arg.srplogin)
12021f13597dSJung-uk Kim 		{
12031f13597dSJung-uk Kim 		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
12041f13597dSJung-uk Kim 			{
12051f13597dSJung-uk Kim 			BIO_printf(bio_err,"Unable to set SRP username\n");
12061f13597dSJung-uk Kim 			goto end;
12071f13597dSJung-uk Kim 			}
12081f13597dSJung-uk Kim 		srp_arg.msg = c_msg;
12091f13597dSJung-uk Kim 		srp_arg.debug = c_debug ;
12101f13597dSJung-uk Kim 		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
12111f13597dSJung-uk Kim 		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
12121f13597dSJung-uk Kim 		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
12131f13597dSJung-uk Kim 		if (c_msg || c_debug || srp_arg.amp == 0)
12141f13597dSJung-uk Kim 			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
12151f13597dSJung-uk Kim 		}
12161f13597dSJung-uk Kim 
12171f13597dSJung-uk Kim #endif
1218db522d3aSSimon L. B. Nielsen #endif
121974664626SKris Kennaway 
1220f579bf8eSKris Kennaway 	con=SSL_new(ctx);
1221db522d3aSSimon L. B. Nielsen 	if (sess_in)
1222db522d3aSSimon L. B. Nielsen 		{
1223db522d3aSSimon L. B. Nielsen 		SSL_SESSION *sess;
1224db522d3aSSimon L. B. Nielsen 		BIO *stmp = BIO_new_file(sess_in, "r");
1225db522d3aSSimon L. B. Nielsen 		if (!stmp)
1226db522d3aSSimon L. B. Nielsen 			{
1227db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err, "Can't open session file %s\n",
1228db522d3aSSimon L. B. Nielsen 						sess_in);
1229db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1230db522d3aSSimon L. B. Nielsen 			goto end;
1231db522d3aSSimon L. B. Nielsen 			}
1232db522d3aSSimon L. B. Nielsen 		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1233db522d3aSSimon L. B. Nielsen 		BIO_free(stmp);
1234db522d3aSSimon L. B. Nielsen 		if (!sess)
1235db522d3aSSimon L. B. Nielsen 			{
1236db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err, "Can't open session file %s\n",
1237db522d3aSSimon L. B. Nielsen 						sess_in);
1238db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1239db522d3aSSimon L. B. Nielsen 			goto end;
1240db522d3aSSimon L. B. Nielsen 			}
1241db522d3aSSimon L. B. Nielsen 		SSL_set_session(con, sess);
1242db522d3aSSimon L. B. Nielsen 		SSL_SESSION_free(sess);
1243db522d3aSSimon L. B. Nielsen 		}
1244*fa5fddf1SJung-uk Kim 
1245*fa5fddf1SJung-uk Kim 	if (fallback_scsv)
1246*fa5fddf1SJung-uk Kim 		SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
1247*fa5fddf1SJung-uk Kim 
1248db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1249db522d3aSSimon L. B. Nielsen 	if (servername != NULL)
1250db522d3aSSimon L. B. Nielsen 		{
1251db522d3aSSimon L. B. Nielsen 		if (!SSL_set_tlsext_host_name(con,servername))
1252db522d3aSSimon L. B. Nielsen 			{
1253db522d3aSSimon L. B. Nielsen 			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1254db522d3aSSimon L. B. Nielsen 			ERR_print_errors(bio_err);
1255db522d3aSSimon L. B. Nielsen 			goto end;
1256db522d3aSSimon L. B. Nielsen 			}
1257db522d3aSSimon L. B. Nielsen 		}
1258db522d3aSSimon L. B. Nielsen #endif
12595c87c606SMark Murray #ifndef OPENSSL_NO_KRB5
12601f13597dSJung-uk Kim 	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
12615c87c606SMark Murray                 {
12621f13597dSJung-uk Kim 		SSL_set0_kssl_ctx(con, kctx);
12631f13597dSJung-uk Kim                 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
12645c87c606SMark Murray 		}
12655c87c606SMark Murray #endif	/* OPENSSL_NO_KRB5  */
126674664626SKris Kennaway /*	SSL_set_cipher_list(con,"RC4-MD5"); */
12671f13597dSJung-uk Kim #if 0
12681f13597dSJung-uk Kim #ifdef TLSEXT_TYPE_opaque_prf_input
12691f13597dSJung-uk Kim 	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
12701f13597dSJung-uk Kim #endif
12711f13597dSJung-uk Kim #endif
127274664626SKris Kennaway 
127374664626SKris Kennaway re_start:
127474664626SKris Kennaway 
12751f13597dSJung-uk Kim 	if (init_client(&s,host,port,socket_type) == 0)
127674664626SKris Kennaway 		{
127774664626SKris Kennaway 		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
127874664626SKris Kennaway 		SHUTDOWN(s);
127974664626SKris Kennaway 		goto end;
128074664626SKris Kennaway 		}
128174664626SKris Kennaway 	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
128274664626SKris Kennaway 
128374664626SKris Kennaway #ifdef FIONBIO
128474664626SKris Kennaway 	if (c_nbio)
128574664626SKris Kennaway 		{
128674664626SKris Kennaway 		unsigned long l=1;
128774664626SKris Kennaway 		BIO_printf(bio_c_out,"turning on non blocking io\n");
128874664626SKris Kennaway 		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
128974664626SKris Kennaway 			{
129074664626SKris Kennaway 			ERR_print_errors(bio_err);
129174664626SKris Kennaway 			goto end;
129274664626SKris Kennaway 			}
129374664626SKris Kennaway 		}
129474664626SKris Kennaway #endif
12951f13597dSJung-uk Kim 	if (c_Pause & 0x01) SSL_set_debug(con, 1);
12963b4e3dcbSSimon L. B. Nielsen 
12973b4e3dcbSSimon L. B. Nielsen 	if ( SSL_version(con) == DTLS1_VERSION)
12983b4e3dcbSSimon L. B. Nielsen 		{
12993b4e3dcbSSimon L. B. Nielsen 
13003b4e3dcbSSimon L. B. Nielsen 		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
13013b4e3dcbSSimon L. B. Nielsen 		if (getsockname(s, &peer, (void *)&peerlen) < 0)
13023b4e3dcbSSimon L. B. Nielsen 			{
13033b4e3dcbSSimon L. B. Nielsen 			BIO_printf(bio_err, "getsockname:errno=%d\n",
13043b4e3dcbSSimon L. B. Nielsen 				get_last_socket_error());
13053b4e3dcbSSimon L. B. Nielsen 			SHUTDOWN(s);
13063b4e3dcbSSimon L. B. Nielsen 			goto end;
13073b4e3dcbSSimon L. B. Nielsen 			}
13083b4e3dcbSSimon L. B. Nielsen 
1309db522d3aSSimon L. B. Nielsen 		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
13103b4e3dcbSSimon L. B. Nielsen 
13113b4e3dcbSSimon L. B. Nielsen 		if (enable_timeouts)
13123b4e3dcbSSimon L. B. Nielsen 			{
13133b4e3dcbSSimon L. B. Nielsen 			timeout.tv_sec = 0;
13143b4e3dcbSSimon L. B. Nielsen 			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
13153b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
13163b4e3dcbSSimon L. B. Nielsen 
13173b4e3dcbSSimon L. B. Nielsen 			timeout.tv_sec = 0;
13183b4e3dcbSSimon L. B. Nielsen 			timeout.tv_usec = DGRAM_SND_TIMEOUT;
13193b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
13203b4e3dcbSSimon L. B. Nielsen 			}
13213b4e3dcbSSimon L. B. Nielsen 
13226a599222SSimon L. B. Nielsen 		if (socket_mtu > 28)
13233b4e3dcbSSimon L. B. Nielsen 			{
13243b4e3dcbSSimon L. B. Nielsen 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
13256a599222SSimon L. B. Nielsen 			SSL_set_mtu(con, socket_mtu - 28);
13263b4e3dcbSSimon L. B. Nielsen 			}
13273b4e3dcbSSimon L. B. Nielsen 		else
13283b4e3dcbSSimon L. B. Nielsen 			/* want to do MTU discovery */
13293b4e3dcbSSimon L. B. Nielsen 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
13303b4e3dcbSSimon L. B. Nielsen 		}
13313b4e3dcbSSimon L. B. Nielsen 	else
133274664626SKris Kennaway 		sbio=BIO_new_socket(s,BIO_NOCLOSE);
133374664626SKris Kennaway 
133474664626SKris Kennaway 	if (nbio_test)
133574664626SKris Kennaway 		{
133674664626SKris Kennaway 		BIO *test;
133774664626SKris Kennaway 
133874664626SKris Kennaway 		test=BIO_new(BIO_f_nbio_test());
133974664626SKris Kennaway 		sbio=BIO_push(test,sbio);
134074664626SKris Kennaway 		}
134174664626SKris Kennaway 
134274664626SKris Kennaway 	if (c_debug)
134374664626SKris Kennaway 		{
13441f13597dSJung-uk Kim 		SSL_set_debug(con, 1);
13453b4e3dcbSSimon L. B. Nielsen 		BIO_set_callback(sbio,bio_dump_callback);
13465471f83eSSimon L. B. Nielsen 		BIO_set_callback_arg(sbio,(char *)bio_c_out);
134774664626SKris Kennaway 		}
13485c87c606SMark Murray 	if (c_msg)
13495c87c606SMark Murray 		{
13505c87c606SMark Murray 		SSL_set_msg_callback(con, msg_cb);
13515c87c606SMark Murray 		SSL_set_msg_callback_arg(con, bio_c_out);
13525c87c606SMark Murray 		}
1353db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
1354db522d3aSSimon L. B. Nielsen 	if (c_tlsextdebug)
1355db522d3aSSimon L. B. Nielsen 		{
1356db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1357db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_debug_arg(con, bio_c_out);
1358db522d3aSSimon L. B. Nielsen 		}
1359db522d3aSSimon L. B. Nielsen 	if (c_status_req)
1360db522d3aSSimon L. B. Nielsen 		{
1361db522d3aSSimon L. B. Nielsen 		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1362db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1363db522d3aSSimon L. B. Nielsen 		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1364db522d3aSSimon L. B. Nielsen #if 0
1365db522d3aSSimon L. B. Nielsen {
1366db522d3aSSimon L. B. Nielsen STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1367db522d3aSSimon L. B. Nielsen OCSP_RESPID *id = OCSP_RESPID_new();
1368db522d3aSSimon L. B. Nielsen id->value.byKey = ASN1_OCTET_STRING_new();
1369db522d3aSSimon L. B. Nielsen id->type = V_OCSP_RESPID_KEY;
1370db522d3aSSimon L. B. Nielsen ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1371db522d3aSSimon L. B. Nielsen sk_OCSP_RESPID_push(ids, id);
1372db522d3aSSimon L. B. Nielsen SSL_set_tlsext_status_ids(con, ids);
1373db522d3aSSimon L. B. Nielsen }
1374db522d3aSSimon L. B. Nielsen #endif
1375db522d3aSSimon L. B. Nielsen 		}
1376db522d3aSSimon L. B. Nielsen #endif
1377db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE
1378db522d3aSSimon L. B. Nielsen 	if (jpake_secret)
1379db522d3aSSimon L. B. Nielsen 		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1380db522d3aSSimon L. B. Nielsen #endif
138174664626SKris Kennaway 
138274664626SKris Kennaway 	SSL_set_bio(con,sbio,sbio);
138374664626SKris Kennaway 	SSL_set_connect_state(con);
138474664626SKris Kennaway 
138574664626SKris Kennaway 	/* ok, lets connect */
138674664626SKris Kennaway 	width=SSL_get_fd(con)+1;
138774664626SKris Kennaway 
138874664626SKris Kennaway 	read_tty=1;
138974664626SKris Kennaway 	write_tty=0;
139074664626SKris Kennaway 	tty_on=0;
139174664626SKris Kennaway 	read_ssl=1;
139274664626SKris Kennaway 	write_ssl=1;
139374664626SKris Kennaway 
139474664626SKris Kennaway 	cbuf_len=0;
139574664626SKris Kennaway 	cbuf_off=0;
139674664626SKris Kennaway 	sbuf_len=0;
139774664626SKris Kennaway 	sbuf_off=0;
139874664626SKris Kennaway 
13995c87c606SMark Murray 	/* This is an ugly hack that does a lot of assumptions */
14005471f83eSSimon L. B. Nielsen 	/* We do have to handle multi-line responses which may come
14015471f83eSSimon L. B. Nielsen  	   in a single packet or not. We therefore have to use
14025471f83eSSimon L. B. Nielsen 	   BIO_gets() which does need a buffering BIO. So during
14035471f83eSSimon L. B. Nielsen 	   the initial chitchat we do push a buffering BIO into the
14045471f83eSSimon L. B. Nielsen 	   chain that is removed again later on to not disturb the
14055471f83eSSimon L. B. Nielsen 	   rest of the s_client operation. */
14065471f83eSSimon L. B. Nielsen 	if (starttls_proto == PROTO_SMTP)
14075c87c606SMark Murray 		{
14085471f83eSSimon L. B. Nielsen 		int foundit=0;
14095471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
14105471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
14115471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end from SMTP */
14125471f83eSSimon L. B. Nielsen 		do
14135471f83eSSimon L. B. Nielsen 			{
14145471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14155471f83eSSimon L. B. Nielsen 			}
14165471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
14175471f83eSSimon L. B. Nielsen 		/* STARTTLS command requires EHLO... */
14185471f83eSSimon L. B. Nielsen 		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1419db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14205471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end EHLO SMTP response */
14215471f83eSSimon L. B. Nielsen 		do
14225471f83eSSimon L. B. Nielsen 			{
14235471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14245471f83eSSimon L. B. Nielsen 			if (strstr(mbuf,"STARTTLS"))
14255471f83eSSimon L. B. Nielsen 				foundit=1;
14265471f83eSSimon L. B. Nielsen 			}
14275471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
1428db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14295471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14305471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14315471f83eSSimon L. B. Nielsen 		if (!foundit)
14325471f83eSSimon L. B. Nielsen 			BIO_printf(bio_err,
14335471f83eSSimon L. B. Nielsen 				   "didn't found starttls in server response,"
14345471f83eSSimon L. B. Nielsen 				   " try anyway...\n");
14355c87c606SMark Murray 		BIO_printf(sbio,"STARTTLS\r\n");
14365c87c606SMark Murray 		BIO_read(sbio,sbuf,BUFSIZZ);
14375c87c606SMark Murray 		}
14385471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_POP3)
143950ef0093SJacques Vidrine 		{
144050ef0093SJacques Vidrine 		BIO_read(sbio,mbuf,BUFSIZZ);
144150ef0093SJacques Vidrine 		BIO_printf(sbio,"STLS\r\n");
144250ef0093SJacques Vidrine 		BIO_read(sbio,sbuf,BUFSIZZ);
144350ef0093SJacques Vidrine 		}
14445471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_IMAP)
14455471f83eSSimon L. B. Nielsen 		{
14465471f83eSSimon L. B. Nielsen 		int foundit=0;
14475471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
14485471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
14495471f83eSSimon L. B. Nielsen 		BIO_gets(fbio,mbuf,BUFSIZZ);
14505471f83eSSimon L. B. Nielsen 		/* STARTTLS command requires CAPABILITY... */
14515471f83eSSimon L. B. Nielsen 		BIO_printf(fbio,". CAPABILITY\r\n");
1452db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14535471f83eSSimon L. B. Nielsen 		/* wait for multi-line CAPABILITY response */
14545471f83eSSimon L. B. Nielsen 		do
14555471f83eSSimon L. B. Nielsen 			{
14565471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14575471f83eSSimon L. B. Nielsen 			if (strstr(mbuf,"STARTTLS"))
14585471f83eSSimon L. B. Nielsen 				foundit=1;
14595471f83eSSimon L. B. Nielsen 			}
14605471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[0]!='.');
1461db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14625471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14635471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14645471f83eSSimon L. B. Nielsen 		if (!foundit)
14655471f83eSSimon L. B. Nielsen 			BIO_printf(bio_err,
14665471f83eSSimon L. B. Nielsen 				   "didn't found STARTTLS in server response,"
14675471f83eSSimon L. B. Nielsen 				   " try anyway...\n");
14685471f83eSSimon L. B. Nielsen 		BIO_printf(sbio,". STARTTLS\r\n");
14695471f83eSSimon L. B. Nielsen 		BIO_read(sbio,sbuf,BUFSIZZ);
14705471f83eSSimon L. B. Nielsen 		}
14715471f83eSSimon L. B. Nielsen 	else if (starttls_proto == PROTO_FTP)
14725471f83eSSimon L. B. Nielsen 		{
14735471f83eSSimon L. B. Nielsen 		BIO *fbio = BIO_new(BIO_f_buffer());
14745471f83eSSimon L. B. Nielsen 		BIO_push(fbio, sbio);
14755471f83eSSimon L. B. Nielsen 		/* wait for multi-line response to end from FTP */
14765471f83eSSimon L. B. Nielsen 		do
14775471f83eSSimon L. B. Nielsen 			{
14785471f83eSSimon L. B. Nielsen 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
14795471f83eSSimon L. B. Nielsen 			}
14805471f83eSSimon L. B. Nielsen 		while (mbuf_len>3 && mbuf[3]=='-');
1481db522d3aSSimon L. B. Nielsen 		(void)BIO_flush(fbio);
14825471f83eSSimon L. B. Nielsen 		BIO_pop(fbio);
14835471f83eSSimon L. B. Nielsen 		BIO_free(fbio);
14845471f83eSSimon L. B. Nielsen 		BIO_printf(sbio,"AUTH TLS\r\n");
14855471f83eSSimon L. B. Nielsen 		BIO_read(sbio,sbuf,BUFSIZZ);
14865471f83eSSimon L. B. Nielsen 		}
1487db522d3aSSimon L. B. Nielsen 	if (starttls_proto == PROTO_XMPP)
1488db522d3aSSimon L. B. Nielsen 		{
1489db522d3aSSimon L. B. Nielsen 		int seen = 0;
1490db522d3aSSimon L. B. Nielsen 		BIO_printf(sbio,"<stream:stream "
1491db522d3aSSimon L. B. Nielsen 		    "xmlns:stream='http://etherx.jabber.org/streams' "
1492db522d3aSSimon L. B. Nielsen 		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1493db522d3aSSimon L. B. Nielsen 		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1494db522d3aSSimon L. B. Nielsen 		mbuf[seen] = 0;
1495db522d3aSSimon L. B. Nielsen 		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1496db522d3aSSimon L. B. Nielsen 			{
1497db522d3aSSimon L. B. Nielsen 			if (strstr(mbuf, "/stream:features>"))
1498db522d3aSSimon L. B. Nielsen 				goto shut;
1499db522d3aSSimon L. B. Nielsen 			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1500db522d3aSSimon L. B. Nielsen 			mbuf[seen] = 0;
1501db522d3aSSimon L. B. Nielsen 			}
1502db522d3aSSimon L. B. Nielsen 		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1503db522d3aSSimon L. B. Nielsen 		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1504db522d3aSSimon L. B. Nielsen 		sbuf[seen] = 0;
1505db522d3aSSimon L. B. Nielsen 		if (!strstr(sbuf, "<proceed"))
1506db522d3aSSimon L. B. Nielsen 			goto shut;
1507db522d3aSSimon L. B. Nielsen 		mbuf[0] = 0;
1508db522d3aSSimon L. B. Nielsen 		}
15095c87c606SMark Murray 
151074664626SKris Kennaway 	for (;;)
151174664626SKris Kennaway 		{
151274664626SKris Kennaway 		FD_ZERO(&readfds);
151374664626SKris Kennaway 		FD_ZERO(&writefds);
151474664626SKris Kennaway 
15156a599222SSimon L. B. Nielsen 		if ((SSL_version(con) == DTLS1_VERSION) &&
15166a599222SSimon L. B. Nielsen 			DTLSv1_get_timeout(con, &timeout))
15176a599222SSimon L. B. Nielsen 			timeoutp = &timeout;
15186a599222SSimon L. B. Nielsen 		else
15196a599222SSimon L. B. Nielsen 			timeoutp = NULL;
15206a599222SSimon L. B. Nielsen 
152174664626SKris Kennaway 		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
152274664626SKris Kennaway 			{
152374664626SKris Kennaway 			in_init=1;
152474664626SKris Kennaway 			tty_on=0;
152574664626SKris Kennaway 			}
152674664626SKris Kennaway 		else
152774664626SKris Kennaway 			{
152874664626SKris Kennaway 			tty_on=1;
152974664626SKris Kennaway 			if (in_init)
153074664626SKris Kennaway 				{
153174664626SKris Kennaway 				in_init=0;
15321f13597dSJung-uk Kim #if 0 /* This test doesn't really work as intended (needs to be fixed) */
15331f13597dSJung-uk Kim #ifndef OPENSSL_NO_TLSEXT
15341f13597dSJung-uk Kim 				if (servername != NULL && !SSL_session_reused(con))
15351f13597dSJung-uk Kim 					{
15361f13597dSJung-uk Kim 					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
15371f13597dSJung-uk Kim 					}
15381f13597dSJung-uk Kim #endif
15391f13597dSJung-uk Kim #endif
1540db522d3aSSimon L. B. Nielsen 				if (sess_out)
1541db522d3aSSimon L. B. Nielsen 					{
1542db522d3aSSimon L. B. Nielsen 					BIO *stmp = BIO_new_file(sess_out, "w");
1543db522d3aSSimon L. B. Nielsen 					if (stmp)
1544db522d3aSSimon L. B. Nielsen 						{
1545db522d3aSSimon L. B. Nielsen 						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1546db522d3aSSimon L. B. Nielsen 						BIO_free(stmp);
1547db522d3aSSimon L. B. Nielsen 						}
1548db522d3aSSimon L. B. Nielsen 					else
1549db522d3aSSimon L. B. Nielsen 						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1550db522d3aSSimon L. B. Nielsen 					}
155174664626SKris Kennaway 				print_stuff(bio_c_out,con,full_log);
155274664626SKris Kennaway 				if (full_log > 0) full_log--;
155374664626SKris Kennaway 
155450ef0093SJacques Vidrine 				if (starttls_proto)
15555c87c606SMark Murray 					{
15565c87c606SMark Murray 					BIO_printf(bio_err,"%s",mbuf);
15575c87c606SMark Murray 					/* We don't need to know any more */
15585471f83eSSimon L. B. Nielsen 					starttls_proto = PROTO_OFF;
15595c87c606SMark Murray 					}
15605c87c606SMark Murray 
156174664626SKris Kennaway 				if (reconnect)
156274664626SKris Kennaway 					{
156374664626SKris Kennaway 					reconnect--;
156474664626SKris Kennaway 					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
156574664626SKris Kennaway 					SSL_shutdown(con);
156674664626SKris Kennaway 					SSL_set_connect_state(con);
156774664626SKris Kennaway 					SHUTDOWN(SSL_get_fd(con));
156874664626SKris Kennaway 					goto re_start;
156974664626SKris Kennaway 					}
157074664626SKris Kennaway 				}
157174664626SKris Kennaway 			}
157274664626SKris Kennaway 
157374664626SKris Kennaway 		ssl_pending = read_ssl && SSL_pending(con);
157474664626SKris Kennaway 
157574664626SKris Kennaway 		if (!ssl_pending)
157674664626SKris Kennaway 			{
15771f13597dSJung-uk Kim #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
157874664626SKris Kennaway 			if (tty_on)
157974664626SKris Kennaway 				{
15801f13597dSJung-uk Kim 				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
15811f13597dSJung-uk Kim 				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
158274664626SKris Kennaway 				}
158374664626SKris Kennaway 			if (read_ssl)
15841f13597dSJung-uk Kim 				openssl_fdset(SSL_get_fd(con),&readfds);
158574664626SKris Kennaway 			if (write_ssl)
15861f13597dSJung-uk Kim 				openssl_fdset(SSL_get_fd(con),&writefds);
1587f579bf8eSKris Kennaway #else
1588f579bf8eSKris Kennaway 			if(!tty_on || !write_tty) {
1589f579bf8eSKris Kennaway 				if (read_ssl)
15901f13597dSJung-uk Kim 					openssl_fdset(SSL_get_fd(con),&readfds);
1591f579bf8eSKris Kennaway 				if (write_ssl)
15921f13597dSJung-uk Kim 					openssl_fdset(SSL_get_fd(con),&writefds);
1593f579bf8eSKris Kennaway 			}
1594f579bf8eSKris Kennaway #endif
159574664626SKris Kennaway /*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
159674664626SKris Kennaway 				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
159774664626SKris Kennaway 
159874664626SKris Kennaway 			/* Note: under VMS with SOCKETSHR the second parameter
159974664626SKris Kennaway 			 * is currently of type (int *) whereas under other
160074664626SKris Kennaway 			 * systems it is (void *) if you don't have a cast it
160174664626SKris Kennaway 			 * will choke the compiler: if you do have a cast then
160274664626SKris Kennaway 			 * you can either go for (int *) or (void *).
160374664626SKris Kennaway 			 */
160450ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
160550ef0093SJacques Vidrine                         /* Under Windows/DOS we make the assumption that we can
1606f579bf8eSKris Kennaway 			 * always write to the tty: therefore if we need to
1607f579bf8eSKris Kennaway 			 * write to the tty we just fall through. Otherwise
1608f579bf8eSKris Kennaway 			 * we timeout the select every second and see if there
1609f579bf8eSKris Kennaway 			 * are any keypresses. Note: this is a hack, in a proper
1610f579bf8eSKris Kennaway 			 * Windows application we wouldn't do this.
1611f579bf8eSKris Kennaway 			 */
1612f579bf8eSKris Kennaway 			i=0;
1613f579bf8eSKris Kennaway 			if(!write_tty) {
1614f579bf8eSKris Kennaway 				if(read_tty) {
1615f579bf8eSKris Kennaway 					tv.tv_sec = 1;
1616f579bf8eSKris Kennaway 					tv.tv_usec = 0;
1617f579bf8eSKris Kennaway 					i=select(width,(void *)&readfds,(void *)&writefds,
1618f579bf8eSKris Kennaway 						 NULL,&tv);
161950ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
16205c87c606SMark Murray 					if(!i && (!_kbhit() || !read_tty) ) continue;
16215c87c606SMark Murray #else
1622ddd58736SKris Kennaway 					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
16235c87c606SMark Murray #endif
1624f579bf8eSKris Kennaway 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16256a599222SSimon L. B. Nielsen 					 NULL,timeoutp);
1626f579bf8eSKris Kennaway 			}
16273b4e3dcbSSimon L. B. Nielsen #elif defined(OPENSSL_SYS_NETWARE)
16283b4e3dcbSSimon L. B. Nielsen 			if(!write_tty) {
16293b4e3dcbSSimon L. B. Nielsen 				if(read_tty) {
16303b4e3dcbSSimon L. B. Nielsen 					tv.tv_sec = 1;
16313b4e3dcbSSimon L. B. Nielsen 					tv.tv_usec = 0;
16323b4e3dcbSSimon L. B. Nielsen 					i=select(width,(void *)&readfds,(void *)&writefds,
16333b4e3dcbSSimon L. B. Nielsen 						NULL,&tv);
16343b4e3dcbSSimon L. B. Nielsen 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16356a599222SSimon L. B. Nielsen 					NULL,timeoutp);
16363b4e3dcbSSimon L. B. Nielsen 			}
16371f13597dSJung-uk Kim #elif defined(OPENSSL_SYS_BEOS_R5)
16381f13597dSJung-uk Kim 			/* Under BeOS-R5 the situation is similar to DOS */
16391f13597dSJung-uk Kim 			i=0;
16401f13597dSJung-uk Kim 			stdin_set = 0;
16411f13597dSJung-uk Kim 			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
16421f13597dSJung-uk Kim 			if(!write_tty) {
16431f13597dSJung-uk Kim 				if(read_tty) {
16441f13597dSJung-uk Kim 					tv.tv_sec = 1;
16451f13597dSJung-uk Kim 					tv.tv_usec = 0;
16461f13597dSJung-uk Kim 					i=select(width,(void *)&readfds,(void *)&writefds,
16471f13597dSJung-uk Kim 						 NULL,&tv);
16481f13597dSJung-uk Kim 					if (read(fileno(stdin), sbuf, 0) >= 0)
16491f13597dSJung-uk Kim 						stdin_set = 1;
16501f13597dSJung-uk Kim 					if (!i && (stdin_set != 1 || !read_tty))
16511f13597dSJung-uk Kim 						continue;
16521f13597dSJung-uk Kim 				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
16531f13597dSJung-uk Kim 					 NULL,timeoutp);
16541f13597dSJung-uk Kim 			}
16551f13597dSJung-uk Kim 			(void)fcntl(fileno(stdin), F_SETFL, 0);
1656f579bf8eSKris Kennaway #else
165774664626SKris Kennaway 			i=select(width,(void *)&readfds,(void *)&writefds,
16586a599222SSimon L. B. Nielsen 				 NULL,timeoutp);
1659f579bf8eSKris Kennaway #endif
166074664626SKris Kennaway 			if ( i < 0)
166174664626SKris Kennaway 				{
166274664626SKris Kennaway 				BIO_printf(bio_err,"bad select %d\n",
166374664626SKris Kennaway 				get_last_socket_error());
166474664626SKris Kennaway 				goto shut;
166574664626SKris Kennaway 				/* goto end; */
166674664626SKris Kennaway 				}
166774664626SKris Kennaway 			}
166874664626SKris Kennaway 
16696a599222SSimon L. B. Nielsen 		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
16706a599222SSimon L. B. Nielsen 			{
16716a599222SSimon L. B. Nielsen 			BIO_printf(bio_err,"TIMEOUT occured\n");
16726a599222SSimon L. B. Nielsen 			}
16736a599222SSimon L. B. Nielsen 
167474664626SKris Kennaway 		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
167574664626SKris Kennaway 			{
167674664626SKris Kennaway 			k=SSL_write(con,&(cbuf[cbuf_off]),
167774664626SKris Kennaway 				(unsigned int)cbuf_len);
167874664626SKris Kennaway 			switch (SSL_get_error(con,k))
167974664626SKris Kennaway 				{
168074664626SKris Kennaway 			case SSL_ERROR_NONE:
168174664626SKris Kennaway 				cbuf_off+=k;
168274664626SKris Kennaway 				cbuf_len-=k;
168374664626SKris Kennaway 				if (k <= 0) goto end;
168474664626SKris Kennaway 				/* we have done a  write(con,NULL,0); */
168574664626SKris Kennaway 				if (cbuf_len <= 0)
168674664626SKris Kennaway 					{
168774664626SKris Kennaway 					read_tty=1;
168874664626SKris Kennaway 					write_ssl=0;
168974664626SKris Kennaway 					}
169074664626SKris Kennaway 				else /* if (cbuf_len > 0) */
169174664626SKris Kennaway 					{
169274664626SKris Kennaway 					read_tty=0;
169374664626SKris Kennaway 					write_ssl=1;
169474664626SKris Kennaway 					}
169574664626SKris Kennaway 				break;
169674664626SKris Kennaway 			case SSL_ERROR_WANT_WRITE:
169774664626SKris Kennaway 				BIO_printf(bio_c_out,"write W BLOCK\n");
169874664626SKris Kennaway 				write_ssl=1;
169974664626SKris Kennaway 				read_tty=0;
170074664626SKris Kennaway 				break;
170174664626SKris Kennaway 			case SSL_ERROR_WANT_READ:
170274664626SKris Kennaway 				BIO_printf(bio_c_out,"write R BLOCK\n");
170374664626SKris Kennaway 				write_tty=0;
170474664626SKris Kennaway 				read_ssl=1;
170574664626SKris Kennaway 				write_ssl=0;
170674664626SKris Kennaway 				break;
170774664626SKris Kennaway 			case SSL_ERROR_WANT_X509_LOOKUP:
170874664626SKris Kennaway 				BIO_printf(bio_c_out,"write X BLOCK\n");
170974664626SKris Kennaway 				break;
171074664626SKris Kennaway 			case SSL_ERROR_ZERO_RETURN:
171174664626SKris Kennaway 				if (cbuf_len != 0)
171274664626SKris Kennaway 					{
171374664626SKris Kennaway 					BIO_printf(bio_c_out,"shutdown\n");
17141f13597dSJung-uk Kim 					ret = 0;
171574664626SKris Kennaway 					goto shut;
171674664626SKris Kennaway 					}
171774664626SKris Kennaway 				else
171874664626SKris Kennaway 					{
171974664626SKris Kennaway 					read_tty=1;
172074664626SKris Kennaway 					write_ssl=0;
172174664626SKris Kennaway 					break;
172274664626SKris Kennaway 					}
172374664626SKris Kennaway 
172474664626SKris Kennaway 			case SSL_ERROR_SYSCALL:
172574664626SKris Kennaway 				if ((k != 0) || (cbuf_len != 0))
172674664626SKris Kennaway 					{
172774664626SKris Kennaway 					BIO_printf(bio_err,"write:errno=%d\n",
172874664626SKris Kennaway 						get_last_socket_error());
172974664626SKris Kennaway 					goto shut;
173074664626SKris Kennaway 					}
173174664626SKris Kennaway 				else
173274664626SKris Kennaway 					{
173374664626SKris Kennaway 					read_tty=1;
173474664626SKris Kennaway 					write_ssl=0;
173574664626SKris Kennaway 					}
173674664626SKris Kennaway 				break;
173774664626SKris Kennaway 			case SSL_ERROR_SSL:
173874664626SKris Kennaway 				ERR_print_errors(bio_err);
173974664626SKris Kennaway 				goto shut;
174074664626SKris Kennaway 				}
174174664626SKris Kennaway 			}
17421f13597dSJung-uk Kim #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
17431f13597dSJung-uk Kim 		/* Assume Windows/DOS/BeOS can always write */
1744f579bf8eSKris Kennaway 		else if (!ssl_pending && write_tty)
1745f579bf8eSKris Kennaway #else
174674664626SKris Kennaway 		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1747f579bf8eSKris Kennaway #endif
174874664626SKris Kennaway 			{
174974664626SKris Kennaway #ifdef CHARSET_EBCDIC
175074664626SKris Kennaway 			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
175174664626SKris Kennaway #endif
17521f13597dSJung-uk Kim 			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
175374664626SKris Kennaway 
175474664626SKris Kennaway 			if (i <= 0)
175574664626SKris Kennaway 				{
175674664626SKris Kennaway 				BIO_printf(bio_c_out,"DONE\n");
17571f13597dSJung-uk Kim 				ret = 0;
175874664626SKris Kennaway 				goto shut;
175974664626SKris Kennaway 				/* goto end; */
176074664626SKris Kennaway 				}
176174664626SKris Kennaway 
176274664626SKris Kennaway 			sbuf_len-=i;;
176374664626SKris Kennaway 			sbuf_off+=i;
176474664626SKris Kennaway 			if (sbuf_len <= 0)
176574664626SKris Kennaway 				{
176674664626SKris Kennaway 				read_ssl=1;
176774664626SKris Kennaway 				write_tty=0;
176874664626SKris Kennaway 				}
176974664626SKris Kennaway 			}
177074664626SKris Kennaway 		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
177174664626SKris Kennaway 			{
177274664626SKris Kennaway #ifdef RENEG
177374664626SKris Kennaway { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
177474664626SKris Kennaway #endif
177574664626SKris Kennaway #if 1
177674664626SKris Kennaway 			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
177774664626SKris Kennaway #else
177874664626SKris Kennaway /* Demo for pending and peek :-) */
177974664626SKris Kennaway 			k=SSL_read(con,sbuf,16);
178074664626SKris Kennaway { char zbuf[10240];
178174664626SKris Kennaway printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
178274664626SKris Kennaway }
178374664626SKris Kennaway #endif
178474664626SKris Kennaway 
178574664626SKris Kennaway 			switch (SSL_get_error(con,k))
178674664626SKris Kennaway 				{
178774664626SKris Kennaway 			case SSL_ERROR_NONE:
178874664626SKris Kennaway 				if (k <= 0)
178974664626SKris Kennaway 					goto end;
179074664626SKris Kennaway 				sbuf_off=0;
179174664626SKris Kennaway 				sbuf_len=k;
179274664626SKris Kennaway 
179374664626SKris Kennaway 				read_ssl=0;
179474664626SKris Kennaway 				write_tty=1;
179574664626SKris Kennaway 				break;
179674664626SKris Kennaway 			case SSL_ERROR_WANT_WRITE:
179774664626SKris Kennaway 				BIO_printf(bio_c_out,"read W BLOCK\n");
179874664626SKris Kennaway 				write_ssl=1;
179974664626SKris Kennaway 				read_tty=0;
180074664626SKris Kennaway 				break;
180174664626SKris Kennaway 			case SSL_ERROR_WANT_READ:
180274664626SKris Kennaway 				BIO_printf(bio_c_out,"read R BLOCK\n");
180374664626SKris Kennaway 				write_tty=0;
180474664626SKris Kennaway 				read_ssl=1;
180574664626SKris Kennaway 				if ((read_tty == 0) && (write_ssl == 0))
180674664626SKris Kennaway 					write_ssl=1;
180774664626SKris Kennaway 				break;
180874664626SKris Kennaway 			case SSL_ERROR_WANT_X509_LOOKUP:
180974664626SKris Kennaway 				BIO_printf(bio_c_out,"read X BLOCK\n");
181074664626SKris Kennaway 				break;
181174664626SKris Kennaway 			case SSL_ERROR_SYSCALL:
18121f13597dSJung-uk Kim 				ret=get_last_socket_error();
18131f13597dSJung-uk Kim 				BIO_printf(bio_err,"read:errno=%d\n",ret);
181474664626SKris Kennaway 				goto shut;
181574664626SKris Kennaway 			case SSL_ERROR_ZERO_RETURN:
181674664626SKris Kennaway 				BIO_printf(bio_c_out,"closed\n");
18171f13597dSJung-uk Kim 				ret=0;
181874664626SKris Kennaway 				goto shut;
181974664626SKris Kennaway 			case SSL_ERROR_SSL:
182074664626SKris Kennaway 				ERR_print_errors(bio_err);
182174664626SKris Kennaway 				goto shut;
182274664626SKris Kennaway 				/* break; */
182374664626SKris Kennaway 				}
182474664626SKris Kennaway 			}
182574664626SKris Kennaway 
182650ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
182750ef0093SJacques Vidrine #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
18285c87c606SMark Murray 		else if (_kbhit())
18295c87c606SMark Murray #else
1830ddd58736SKris Kennaway 		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
18315c87c606SMark Murray #endif
18323b4e3dcbSSimon L. B. Nielsen #elif defined (OPENSSL_SYS_NETWARE)
18333b4e3dcbSSimon L. B. Nielsen 		else if (_kbhit())
18341f13597dSJung-uk Kim #elif defined(OPENSSL_SYS_BEOS_R5)
18351f13597dSJung-uk Kim 		else if (stdin_set)
1836f579bf8eSKris Kennaway #else
183774664626SKris Kennaway 		else if (FD_ISSET(fileno(stdin),&readfds))
1838f579bf8eSKris Kennaway #endif
183974664626SKris Kennaway 			{
184074664626SKris Kennaway 			if (crlf)
184174664626SKris Kennaway 				{
184274664626SKris Kennaway 				int j, lf_num;
184374664626SKris Kennaway 
18441f13597dSJung-uk Kim 				i=raw_read_stdin(cbuf,BUFSIZZ/2);
184574664626SKris Kennaway 				lf_num = 0;
184674664626SKris Kennaway 				/* both loops are skipped when i <= 0 */
184774664626SKris Kennaway 				for (j = 0; j < i; j++)
184874664626SKris Kennaway 					if (cbuf[j] == '\n')
184974664626SKris Kennaway 						lf_num++;
185074664626SKris Kennaway 				for (j = i-1; j >= 0; j--)
185174664626SKris Kennaway 					{
185274664626SKris Kennaway 					cbuf[j+lf_num] = cbuf[j];
185374664626SKris Kennaway 					if (cbuf[j] == '\n')
185474664626SKris Kennaway 						{
185574664626SKris Kennaway 						lf_num--;
185674664626SKris Kennaway 						i++;
185774664626SKris Kennaway 						cbuf[j+lf_num] = '\r';
185874664626SKris Kennaway 						}
185974664626SKris Kennaway 					}
186074664626SKris Kennaway 				assert(lf_num == 0);
186174664626SKris Kennaway 				}
186274664626SKris Kennaway 			else
18631f13597dSJung-uk Kim 				i=raw_read_stdin(cbuf,BUFSIZZ);
186474664626SKris Kennaway 
1865f579bf8eSKris Kennaway 			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
186674664626SKris Kennaway 				{
186774664626SKris Kennaway 				BIO_printf(bio_err,"DONE\n");
18681f13597dSJung-uk Kim 				ret=0;
186974664626SKris Kennaway 				goto shut;
187074664626SKris Kennaway 				}
187174664626SKris Kennaway 
1872f579bf8eSKris Kennaway 			if ((!c_ign_eof) && (cbuf[0] == 'R'))
187374664626SKris Kennaway 				{
187474664626SKris Kennaway 				BIO_printf(bio_err,"RENEGOTIATING\n");
187574664626SKris Kennaway 				SSL_renegotiate(con);
187674664626SKris Kennaway 				cbuf_len=0;
187774664626SKris Kennaway 				}
18781f13597dSJung-uk Kim #ifndef OPENSSL_NO_HEARTBEATS
18791f13597dSJung-uk Kim 			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
18801f13597dSJung-uk Kim  				{
18811f13597dSJung-uk Kim 				BIO_printf(bio_err,"HEARTBEATING\n");
18821f13597dSJung-uk Kim 				SSL_heartbeat(con);
18831f13597dSJung-uk Kim 				cbuf_len=0;
18841f13597dSJung-uk Kim 				}
18851f13597dSJung-uk Kim #endif
188674664626SKris Kennaway 			else
188774664626SKris Kennaway 				{
188874664626SKris Kennaway 				cbuf_len=i;
188974664626SKris Kennaway 				cbuf_off=0;
189074664626SKris Kennaway #ifdef CHARSET_EBCDIC
189174664626SKris Kennaway 				ebcdic2ascii(cbuf, cbuf, i);
189274664626SKris Kennaway #endif
189374664626SKris Kennaway 				}
189474664626SKris Kennaway 
189574664626SKris Kennaway 			write_ssl=1;
189674664626SKris Kennaway 			read_tty=0;
189774664626SKris Kennaway 			}
189874664626SKris Kennaway 		}
18991f13597dSJung-uk Kim 
19001f13597dSJung-uk Kim 	ret=0;
190174664626SKris Kennaway shut:
19021f13597dSJung-uk Kim 	if (in_init)
19031f13597dSJung-uk Kim 		print_stuff(bio_c_out,con,full_log);
190474664626SKris Kennaway 	SSL_shutdown(con);
190574664626SKris Kennaway 	SHUTDOWN(SSL_get_fd(con));
190674664626SKris Kennaway end:
19071f13597dSJung-uk Kim 	if (con != NULL)
19081f13597dSJung-uk Kim 		{
19091f13597dSJung-uk Kim 		if (prexit != 0)
19101f13597dSJung-uk Kim 			print_stuff(bio_c_out,con,1);
19111f13597dSJung-uk Kim 		SSL_free(con);
19121f13597dSJung-uk Kim 		}
191309286989SJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
191409286989SJung-uk Kim 	if (next_proto.data)
191509286989SJung-uk Kim 		OPENSSL_free(next_proto.data);
191609286989SJung-uk Kim #endif
191774664626SKris Kennaway 	if (ctx != NULL) SSL_CTX_free(ctx);
19183b4e3dcbSSimon L. B. Nielsen 	if (cert)
19193b4e3dcbSSimon L. B. Nielsen 		X509_free(cert);
19203b4e3dcbSSimon L. B. Nielsen 	if (key)
19213b4e3dcbSSimon L. B. Nielsen 		EVP_PKEY_free(key);
19223b4e3dcbSSimon L. B. Nielsen 	if (pass)
19233b4e3dcbSSimon L. B. Nielsen 		OPENSSL_free(pass);
192409286989SJung-uk Kim 	if (vpm)
192509286989SJung-uk Kim 		X509_VERIFY_PARAM_free(vpm);
19265c87c606SMark Murray 	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
19275c87c606SMark Murray 	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
19285c87c606SMark Murray 	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
192974664626SKris Kennaway 	if (bio_c_out != NULL)
193074664626SKris Kennaway 		{
193174664626SKris Kennaway 		BIO_free(bio_c_out);
193274664626SKris Kennaway 		bio_c_out=NULL;
193374664626SKris Kennaway 		}
19345c87c606SMark Murray 	apps_shutdown();
19355c87c606SMark Murray 	OPENSSL_EXIT(ret);
193674664626SKris Kennaway 	}
193774664626SKris Kennaway 
193874664626SKris Kennaway 
193974664626SKris Kennaway static void print_stuff(BIO *bio, SSL *s, int full)
194074664626SKris Kennaway 	{
194174664626SKris Kennaway 	X509 *peer=NULL;
194274664626SKris Kennaway 	char *p;
19433b4e3dcbSSimon L. B. Nielsen 	static const char *space="                ";
194474664626SKris Kennaway 	char buf[BUFSIZ];
194574664626SKris Kennaway 	STACK_OF(X509) *sk;
194674664626SKris Kennaway 	STACK_OF(X509_NAME) *sk2;
19471f13597dSJung-uk Kim 	const SSL_CIPHER *c;
194874664626SKris Kennaway 	X509_NAME *xn;
194974664626SKris Kennaway 	int j,i;
19503b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_COMP
19513b4e3dcbSSimon L. B. Nielsen 	const COMP_METHOD *comp, *expansion;
19523b4e3dcbSSimon L. B. Nielsen #endif
19531f13597dSJung-uk Kim 	unsigned char *exportedkeymat;
195474664626SKris Kennaway 
195574664626SKris Kennaway 	if (full)
195674664626SKris Kennaway 		{
195774664626SKris Kennaway 		int got_a_chain = 0;
195874664626SKris Kennaway 
195974664626SKris Kennaway 		sk=SSL_get_peer_cert_chain(s);
196074664626SKris Kennaway 		if (sk != NULL)
196174664626SKris Kennaway 			{
196274664626SKris Kennaway 			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
196374664626SKris Kennaway 
196474664626SKris Kennaway 			BIO_printf(bio,"---\nCertificate chain\n");
196574664626SKris Kennaway 			for (i=0; i<sk_X509_num(sk); i++)
196674664626SKris Kennaway 				{
196774664626SKris Kennaway 				X509_NAME_oneline(X509_get_subject_name(
19685c87c606SMark Murray 					sk_X509_value(sk,i)),buf,sizeof buf);
196974664626SKris Kennaway 				BIO_printf(bio,"%2d s:%s\n",i,buf);
197074664626SKris Kennaway 				X509_NAME_oneline(X509_get_issuer_name(
19715c87c606SMark Murray 					sk_X509_value(sk,i)),buf,sizeof buf);
197274664626SKris Kennaway 				BIO_printf(bio,"   i:%s\n",buf);
197374664626SKris Kennaway 				if (c_showcerts)
197474664626SKris Kennaway 					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
197574664626SKris Kennaway 				}
197674664626SKris Kennaway 			}
197774664626SKris Kennaway 
197874664626SKris Kennaway 		BIO_printf(bio,"---\n");
197974664626SKris Kennaway 		peer=SSL_get_peer_certificate(s);
198074664626SKris Kennaway 		if (peer != NULL)
198174664626SKris Kennaway 			{
198274664626SKris Kennaway 			BIO_printf(bio,"Server certificate\n");
198374664626SKris Kennaway 			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
198474664626SKris Kennaway 				PEM_write_bio_X509(bio,peer);
198574664626SKris Kennaway 			X509_NAME_oneline(X509_get_subject_name(peer),
19865c87c606SMark Murray 				buf,sizeof buf);
198774664626SKris Kennaway 			BIO_printf(bio,"subject=%s\n",buf);
198874664626SKris Kennaway 			X509_NAME_oneline(X509_get_issuer_name(peer),
19895c87c606SMark Murray 				buf,sizeof buf);
199074664626SKris Kennaway 			BIO_printf(bio,"issuer=%s\n",buf);
199174664626SKris Kennaway 			}
199274664626SKris Kennaway 		else
199374664626SKris Kennaway 			BIO_printf(bio,"no peer certificate available\n");
199474664626SKris Kennaway 
199574664626SKris Kennaway 		sk2=SSL_get_client_CA_list(s);
199674664626SKris Kennaway 		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
199774664626SKris Kennaway 			{
199874664626SKris Kennaway 			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
199974664626SKris Kennaway 			for (i=0; i<sk_X509_NAME_num(sk2); i++)
200074664626SKris Kennaway 				{
200174664626SKris Kennaway 				xn=sk_X509_NAME_value(sk2,i);
200274664626SKris Kennaway 				X509_NAME_oneline(xn,buf,sizeof(buf));
200374664626SKris Kennaway 				BIO_write(bio,buf,strlen(buf));
200474664626SKris Kennaway 				BIO_write(bio,"\n",1);
200574664626SKris Kennaway 				}
200674664626SKris Kennaway 			}
200774664626SKris Kennaway 		else
200874664626SKris Kennaway 			{
200974664626SKris Kennaway 			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
201074664626SKris Kennaway 			}
20115c87c606SMark Murray 		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
201274664626SKris Kennaway 		if (p != NULL)
201374664626SKris Kennaway 			{
201474664626SKris Kennaway 			/* This works only for SSL 2.  In later protocol
201574664626SKris Kennaway 			 * versions, the client does not know what other
201674664626SKris Kennaway 			 * ciphers (in addition to the one to be used
201774664626SKris Kennaway 			 * in the current connection) the server supports. */
201874664626SKris Kennaway 
201974664626SKris Kennaway 			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
202074664626SKris Kennaway 			j=i=0;
202174664626SKris Kennaway 			while (*p)
202274664626SKris Kennaway 				{
202374664626SKris Kennaway 				if (*p == ':')
202474664626SKris Kennaway 					{
202574664626SKris Kennaway 					BIO_write(bio,space,15-j%25);
202674664626SKris Kennaway 					i++;
202774664626SKris Kennaway 					j=0;
202874664626SKris Kennaway 					BIO_write(bio,((i%3)?" ":"\n"),1);
202974664626SKris Kennaway 					}
203074664626SKris Kennaway 				else
203174664626SKris Kennaway 					{
203274664626SKris Kennaway 					BIO_write(bio,p,1);
203374664626SKris Kennaway 					j++;
203474664626SKris Kennaway 					}
203574664626SKris Kennaway 				p++;
203674664626SKris Kennaway 				}
203774664626SKris Kennaway 			BIO_write(bio,"\n",1);
203874664626SKris Kennaway 			}
203974664626SKris Kennaway 
204074664626SKris Kennaway 		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
204174664626SKris Kennaway 			BIO_number_read(SSL_get_rbio(s)),
204274664626SKris Kennaway 			BIO_number_written(SSL_get_wbio(s)));
204374664626SKris Kennaway 		}
20441f13597dSJung-uk Kim 	BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
204574664626SKris Kennaway 	c=SSL_get_current_cipher(s);
204674664626SKris Kennaway 	BIO_printf(bio,"%s, Cipher is %s\n",
204774664626SKris Kennaway 		SSL_CIPHER_get_version(c),
204874664626SKris Kennaway 		SSL_CIPHER_get_name(c));
204974664626SKris Kennaway 	if (peer != NULL) {
205074664626SKris Kennaway 		EVP_PKEY *pktmp;
205174664626SKris Kennaway 		pktmp = X509_get_pubkey(peer);
205274664626SKris Kennaway 		BIO_printf(bio,"Server public key is %d bit\n",
205374664626SKris Kennaway 							 EVP_PKEY_bits(pktmp));
205474664626SKris Kennaway 		EVP_PKEY_free(pktmp);
205574664626SKris Kennaway 	}
20566a599222SSimon L. B. Nielsen 	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
20576a599222SSimon L. B. Nielsen 			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
20583b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_COMP
20593b4e3dcbSSimon L. B. Nielsen 	comp=SSL_get_current_compression(s);
20603b4e3dcbSSimon L. B. Nielsen 	expansion=SSL_get_current_expansion(s);
20613b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio,"Compression: %s\n",
20623b4e3dcbSSimon L. B. Nielsen 		comp ? SSL_COMP_get_name(comp) : "NONE");
20633b4e3dcbSSimon L. B. Nielsen 	BIO_printf(bio,"Expansion: %s\n",
20643b4e3dcbSSimon L. B. Nielsen 		expansion ? SSL_COMP_get_name(expansion) : "NONE");
20653b4e3dcbSSimon L. B. Nielsen #endif
20661f13597dSJung-uk Kim 
20671f13597dSJung-uk Kim #ifdef SSL_DEBUG
20681f13597dSJung-uk Kim 	{
20691f13597dSJung-uk Kim 	/* Print out local port of connection: useful for debugging */
20701f13597dSJung-uk Kim 	int sock;
20711f13597dSJung-uk Kim 	struct sockaddr_in ladd;
20721f13597dSJung-uk Kim 	socklen_t ladd_size = sizeof(ladd);
20731f13597dSJung-uk Kim 	sock = SSL_get_fd(s);
20741f13597dSJung-uk Kim 	getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
20751f13597dSJung-uk Kim 	BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
20761f13597dSJung-uk Kim 	}
20771f13597dSJung-uk Kim #endif
20781f13597dSJung-uk Kim 
20791f13597dSJung-uk Kim #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
20801f13597dSJung-uk Kim 	if (next_proto.status != -1) {
20811f13597dSJung-uk Kim 		const unsigned char *proto;
20821f13597dSJung-uk Kim 		unsigned int proto_len;
20831f13597dSJung-uk Kim 		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
20841f13597dSJung-uk Kim 		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
20851f13597dSJung-uk Kim 		BIO_write(bio, proto, proto_len);
20861f13597dSJung-uk Kim 		BIO_write(bio, "\n", 1);
20871f13597dSJung-uk Kim 	}
20881f13597dSJung-uk Kim #endif
20891f13597dSJung-uk Kim 
209009286989SJung-uk Kim #ifndef OPENSSL_NO_SRTP
20911f13597dSJung-uk Kim  	{
20921f13597dSJung-uk Kim  	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
20931f13597dSJung-uk Kim 
20941f13597dSJung-uk Kim 	if(srtp_profile)
20951f13597dSJung-uk Kim 		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
20961f13597dSJung-uk Kim 			   srtp_profile->name);
20971f13597dSJung-uk Kim 	}
209809286989SJung-uk Kim #endif
20991f13597dSJung-uk Kim 
210074664626SKris Kennaway 	SSL_SESSION_print(bio,SSL_get_session(s));
21011f13597dSJung-uk Kim 	if (keymatexportlabel != NULL)
21021f13597dSJung-uk Kim 		{
21031f13597dSJung-uk Kim 		BIO_printf(bio, "Keying material exporter:\n");
21041f13597dSJung-uk Kim 		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
21051f13597dSJung-uk Kim 		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
21061f13597dSJung-uk Kim 		exportedkeymat = OPENSSL_malloc(keymatexportlen);
21071f13597dSJung-uk Kim 		if (exportedkeymat != NULL)
21081f13597dSJung-uk Kim 			{
21091f13597dSJung-uk Kim 			if (!SSL_export_keying_material(s, exportedkeymat,
21101f13597dSJung-uk Kim 						        keymatexportlen,
21111f13597dSJung-uk Kim 						        keymatexportlabel,
21121f13597dSJung-uk Kim 						        strlen(keymatexportlabel),
21131f13597dSJung-uk Kim 						        NULL, 0, 0))
21141f13597dSJung-uk Kim 				{
21151f13597dSJung-uk Kim 				BIO_printf(bio, "    Error\n");
21161f13597dSJung-uk Kim 				}
21171f13597dSJung-uk Kim 			else
21181f13597dSJung-uk Kim 				{
21191f13597dSJung-uk Kim 				BIO_printf(bio, "    Keying material: ");
21201f13597dSJung-uk Kim 				for (i=0; i<keymatexportlen; i++)
21211f13597dSJung-uk Kim 					BIO_printf(bio, "%02X",
21221f13597dSJung-uk Kim 						   exportedkeymat[i]);
21231f13597dSJung-uk Kim 				BIO_printf(bio, "\n");
21241f13597dSJung-uk Kim 				}
21251f13597dSJung-uk Kim 			OPENSSL_free(exportedkeymat);
21261f13597dSJung-uk Kim 			}
21271f13597dSJung-uk Kim 		}
212874664626SKris Kennaway 	BIO_printf(bio,"---\n");
212974664626SKris Kennaway 	if (peer != NULL)
213074664626SKris Kennaway 		X509_free(peer);
2131a21b1b38SKris Kennaway 	/* flush, or debugging output gets mixed with http response */
2132db522d3aSSimon L. B. Nielsen 	(void)BIO_flush(bio);
213374664626SKris Kennaway 	}
213474664626SKris Kennaway 
2135db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT
2136db522d3aSSimon L. B. Nielsen 
2137db522d3aSSimon L. B. Nielsen static int ocsp_resp_cb(SSL *s, void *arg)
2138db522d3aSSimon L. B. Nielsen 	{
2139db522d3aSSimon L. B. Nielsen 	const unsigned char *p;
2140db522d3aSSimon L. B. Nielsen 	int len;
2141db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE *rsp;
2142db522d3aSSimon L. B. Nielsen 	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2143db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "OCSP response: ");
2144db522d3aSSimon L. B. Nielsen 	if (!p)
2145db522d3aSSimon L. B. Nielsen 		{
2146db522d3aSSimon L. B. Nielsen 		BIO_puts(arg, "no response sent\n");
2147db522d3aSSimon L. B. Nielsen 		return 1;
2148db522d3aSSimon L. B. Nielsen 		}
2149db522d3aSSimon L. B. Nielsen 	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2150db522d3aSSimon L. B. Nielsen 	if (!rsp)
2151db522d3aSSimon L. B. Nielsen 		{
2152db522d3aSSimon L. B. Nielsen 		BIO_puts(arg, "response parse error\n");
2153db522d3aSSimon L. B. Nielsen 		BIO_dump_indent(arg, (char *)p, len, 4);
2154db522d3aSSimon L. B. Nielsen 		return 0;
2155db522d3aSSimon L. B. Nielsen 		}
2156db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "\n======================================\n");
2157db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE_print(arg, rsp, 0);
2158db522d3aSSimon L. B. Nielsen 	BIO_puts(arg, "======================================\n");
2159db522d3aSSimon L. B. Nielsen 	OCSP_RESPONSE_free(rsp);
2160db522d3aSSimon L. B. Nielsen 	return 1;
2161db522d3aSSimon L. B. Nielsen 	}
21621f13597dSJung-uk Kim 
21631f13597dSJung-uk Kim #endif
2164