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