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