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