• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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," -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," -cutthrough       - enable 1-RTT full-handshake for strong ciphers\n");
365 	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
366 #ifndef OPENSSL_NO_SRTP
367 	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
368 #endif
369  	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
370  	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
371 	}
372 
373 #ifndef OPENSSL_NO_TLSEXT
374 
375 /* This is a context that we pass to callbacks */
376 typedef struct tlsextctx_st {
377    BIO * biodebug;
378    int ack;
379 } tlsextctx;
380 
381 
ssl_servername_cb(SSL * s,int * ad,void * arg)382 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
383 	{
384 	tlsextctx * p = (tlsextctx *) arg;
385 	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
386 	if (SSL_get_servername_type(s) != -1)
387  	        p->ack = !SSL_session_reused(s) && hn != NULL;
388 	else
389 		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
390 
391 	return SSL_TLSEXT_ERR_OK;
392 	}
393 
394 #ifndef OPENSSL_NO_SRP
395 
396 /* This is a context that we pass to all callbacks */
397 typedef struct srp_arg_st
398 	{
399 	char *srppassin;
400 	char *srplogin;
401 	int msg;   /* copy from c_msg */
402 	int debug; /* copy from c_debug */
403 	int amp;   /* allow more groups */
404 	int strength /* minimal size for N */ ;
405 	} SRP_ARG;
406 
407 #define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
408 
srp_Verify_N_and_g(BIGNUM * N,BIGNUM * g)409 static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
410 	{
411 	BN_CTX *bn_ctx = BN_CTX_new();
412 	BIGNUM *p = BN_new();
413 	BIGNUM *r = BN_new();
414 	int ret =
415 		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
416 		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
417 		p != NULL && BN_rshift1(p, N) &&
418 
419 		/* p = (N-1)/2 */
420 		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
421 		r != NULL &&
422 
423 		/* verify g^((N-1)/2) == -1 (mod N) */
424 		BN_mod_exp(r, g, p, N, bn_ctx) &&
425 		BN_add_word(r, 1) &&
426 		BN_cmp(r, N) == 0;
427 
428 	if(r)
429 		BN_free(r);
430 	if(p)
431 		BN_free(p);
432 	if(bn_ctx)
433 		BN_CTX_free(bn_ctx);
434 	return ret;
435 	}
436 
437 /* This callback is used here for two purposes:
438    - extended debugging
439    - making some primality tests for unknown groups
440    The callback is only called for a non default group.
441 
442    An application does not need the call back at all if
443    only the stanard groups are used.  In real life situations,
444    client and server already share well known groups,
445    thus there is no need to verify them.
446    Furthermore, in case that a server actually proposes a group that
447    is not one of those defined in RFC 5054, it is more appropriate
448    to add the group to a static list and then compare since
449    primality tests are rather cpu consuming.
450 */
451 
ssl_srp_verify_param_cb(SSL * s,void * arg)452 static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
453 	{
454 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
455 	BIGNUM *N = NULL, *g = NULL;
456 	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
457 		return 0;
458 	if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
459 		{
460     		BIO_printf(bio_err, "SRP parameters:\n");
461 		BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
462 		BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
463 		BIO_printf(bio_err,"\n");
464 		}
465 
466 	if (SRP_check_known_gN_param(g,N))
467 		return 1;
468 
469 	if (srp_arg->amp == 1)
470 		{
471 		if (srp_arg->debug)
472 			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
473 
474 /* The srp_moregroups is a real debugging feature.
475    Implementors should rather add the value to the known ones.
476    The minimal size has already been tested.
477 */
478 		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
479 			return 1;
480 		}
481 	BIO_printf(bio_err, "SRP param N and g rejected.\n");
482 	return 0;
483 	}
484 
485 #define PWD_STRLEN 1024
486 
ssl_give_srp_client_pwd_cb(SSL * s,void * arg)487 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
488 	{
489 	SRP_ARG *srp_arg = (SRP_ARG *)arg;
490 	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
491 	PW_CB_DATA cb_tmp;
492 	int l;
493 
494 	cb_tmp.password = (char *)srp_arg->srppassin;
495 	cb_tmp.prompt_info = "SRP user";
496 	if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
497 		{
498 		BIO_printf (bio_err, "Can't read Password\n");
499 		OPENSSL_free(pass);
500 		return NULL;
501 		}
502 	*(pass+l)= '\0';
503 
504 	return pass;
505 	}
506 
507 #endif
508 #ifndef OPENSSL_NO_SRTP
509 	char *srtp_profiles = NULL;
510 #endif
511 
512 # ifndef OPENSSL_NO_NEXTPROTONEG
513 /* This the context that we pass to next_proto_cb */
514 typedef struct tlsextnextprotoctx_st {
515 	unsigned char *data;
516 	unsigned short len;
517 	int status;
518 } tlsextnextprotoctx;
519 
520 static tlsextnextprotoctx next_proto;
521 
next_proto_cb(SSL * s,unsigned char ** out,unsigned char * outlen,const unsigned char * in,unsigned int inlen,void * arg)522 static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
523 	{
524 	tlsextnextprotoctx *ctx = arg;
525 
526 	if (!c_quiet)
527 		{
528 		/* We can assume that |in| is syntactically valid. */
529 		unsigned i;
530 		BIO_printf(bio_c_out, "Protocols advertised by server: ");
531 		for (i = 0; i < inlen; )
532 			{
533 			if (i)
534 				BIO_write(bio_c_out, ", ", 2);
535 			BIO_write(bio_c_out, &in[i + 1], in[i]);
536 			i += in[i] + 1;
537 			}
538 		BIO_write(bio_c_out, "\n", 1);
539 		}
540 
541 	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
542 	return SSL_TLSEXT_ERR_OK;
543 	}
544 # endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
545 #endif
546 
547 enum
548 {
549 	PROTO_OFF	= 0,
550 	PROTO_SMTP,
551 	PROTO_POP3,
552 	PROTO_IMAP,
553 	PROTO_FTP,
554 	PROTO_XMPP
555 };
556 
557 int MAIN(int, char **);
558 
MAIN(int argc,char ** argv)559 int MAIN(int argc, char **argv)
560 	{
561 	unsigned int off=0, clr=0;
562 	SSL *con=NULL;
563 #ifndef OPENSSL_NO_KRB5
564 	KSSL_CTX *kctx;
565 #endif
566 	int s,k,width,state=0;
567 	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
568 	int cbuf_len,cbuf_off;
569 	int sbuf_len,sbuf_off;
570 	fd_set readfds,writefds;
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 cutthrough=0;
582 	int crlf=0;
583 	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
584 	SSL_CTX *ctx=NULL;
585 	int ret=1,in_init=1,i,nbio_test=0;
586 	int starttls_proto = PROTO_OFF;
587 	int prexit = 0;
588 	X509_VERIFY_PARAM *vpm = NULL;
589 	int badarg = 0;
590 	const SSL_METHOD *meth=NULL;
591 	int socket_type=SOCK_STREAM;
592 	BIO *sbio;
593 	char *inrand=NULL;
594 	int mbuf_len=0;
595 	struct timeval timeout, *timeoutp;
596 #ifndef OPENSSL_NO_ENGINE
597 	char *engine_id=NULL;
598 	char *ssl_client_engine_id=NULL;
599 	ENGINE *ssl_client_engine=NULL;
600 #endif
601 	ENGINE *e=NULL;
602 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
603 	struct timeval tv;
604 #if defined(OPENSSL_SYS_BEOS_R5)
605 	int stdin_set = 0;
606 #endif
607 #endif
608 #ifndef OPENSSL_NO_TLSEXT
609 	char *servername = NULL;
610         tlsextctx tlsextcbp =
611         {NULL,0};
612 # ifndef OPENSSL_NO_NEXTPROTONEG
613 	const char *next_proto_neg_in = NULL;
614 # endif
615 #endif
616 	char *sess_in = NULL;
617 	char *sess_out = NULL;
618 	struct sockaddr peer;
619 	int peerlen = sizeof(peer);
620 	int enable_timeouts = 0 ;
621 	long socket_mtu = 0;
622 #ifndef OPENSSL_NO_JPAKE
623 	char *jpake_secret = NULL;
624 #endif
625 #ifndef OPENSSL_NO_SRP
626 	char * srppass = NULL;
627 	int srp_lateuser = 0;
628 	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
629 #endif
630 
631 	meth=SSLv23_client_method();
632 
633 	apps_startup();
634 	c_Pause=0;
635 	c_quiet=0;
636 	c_ign_eof=0;
637 	c_debug=0;
638 	c_msg=0;
639 	c_showcerts=0;
640 
641 	if (bio_err == NULL)
642 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
643 
644 	if (!load_config(bio_err, NULL))
645 		goto end;
646 
647 	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
648 		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
649 		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
650 		{
651 		BIO_printf(bio_err,"out of memory\n");
652 		goto end;
653 		}
654 
655 	verify_depth=0;
656 	verify_error=X509_V_OK;
657 #ifdef FIONBIO
658 	c_nbio=0;
659 #endif
660 
661 	argc--;
662 	argv++;
663 	while (argc >= 1)
664 		{
665 		if	(strcmp(*argv,"-host") == 0)
666 			{
667 			if (--argc < 1) goto bad;
668 			host= *(++argv);
669 			}
670 		else if	(strcmp(*argv,"-port") == 0)
671 			{
672 			if (--argc < 1) goto bad;
673 			port=atoi(*(++argv));
674 			if (port == 0) goto bad;
675 			}
676 		else if (strcmp(*argv,"-connect") == 0)
677 			{
678 			if (--argc < 1) goto bad;
679 			if (!extract_host_port(*(++argv),&host,NULL,&port))
680 				goto bad;
681 			}
682 		else if	(strcmp(*argv,"-verify") == 0)
683 			{
684 			verify=SSL_VERIFY_PEER;
685 			if (--argc < 1) goto bad;
686 			verify_depth=atoi(*(++argv));
687 			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
688 			}
689 		else if	(strcmp(*argv,"-cert") == 0)
690 			{
691 			if (--argc < 1) goto bad;
692 			cert_file= *(++argv);
693 			}
694 		else if	(strcmp(*argv,"-sess_out") == 0)
695 			{
696 			if (--argc < 1) goto bad;
697 			sess_out = *(++argv);
698 			}
699 		else if	(strcmp(*argv,"-sess_in") == 0)
700 			{
701 			if (--argc < 1) goto bad;
702 			sess_in = *(++argv);
703 			}
704 		else if	(strcmp(*argv,"-certform") == 0)
705 			{
706 			if (--argc < 1) goto bad;
707 			cert_format = str2fmt(*(++argv));
708 			}
709 		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
710 			{
711 			if (badarg)
712 				goto bad;
713 			continue;
714 			}
715 		else if (strcmp(*argv,"-verify_return_error") == 0)
716 			verify_return_error = 1;
717 		else if	(strcmp(*argv,"-prexit") == 0)
718 			prexit=1;
719 		else if	(strcmp(*argv,"-crlf") == 0)
720 			crlf=1;
721 		else if	(strcmp(*argv,"-quiet") == 0)
722 			{
723 			c_quiet=1;
724 			c_ign_eof=1;
725 			}
726 		else if	(strcmp(*argv,"-ign_eof") == 0)
727 			c_ign_eof=1;
728 		else if	(strcmp(*argv,"-no_ign_eof") == 0)
729 			c_ign_eof=0;
730 		else if	(strcmp(*argv,"-pause") == 0)
731 			c_Pause=1;
732 		else if	(strcmp(*argv,"-debug") == 0)
733 			c_debug=1;
734 #ifndef OPENSSL_NO_TLSEXT
735 		else if	(strcmp(*argv,"-tlsextdebug") == 0)
736 			c_tlsextdebug=1;
737 		else if	(strcmp(*argv,"-status") == 0)
738 			c_status_req=1;
739 #endif
740 #ifdef WATT32
741 		else if (strcmp(*argv,"-wdebug") == 0)
742 			dbug_init();
743 #endif
744 		else if	(strcmp(*argv,"-msg") == 0)
745 			c_msg=1;
746 		else if	(strcmp(*argv,"-showcerts") == 0)
747 			c_showcerts=1;
748 		else if	(strcmp(*argv,"-nbio_test") == 0)
749 			nbio_test=1;
750 		else if	(strcmp(*argv,"-state") == 0)
751 			state=1;
752 #ifndef OPENSSL_NO_PSK
753                 else if (strcmp(*argv,"-psk_identity") == 0)
754 			{
755 			if (--argc < 1) goto bad;
756 			psk_identity=*(++argv);
757 			}
758                 else if (strcmp(*argv,"-psk") == 0)
759 			{
760                         size_t j;
761 
762 			if (--argc < 1) goto bad;
763 			psk_key=*(++argv);
764 			for (j = 0; j < strlen(psk_key); j++)
765                                 {
766                                 if (isxdigit((unsigned char)psk_key[j]))
767                                         continue;
768                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
769                                 goto bad;
770                                 }
771 			}
772 #endif
773 #ifndef OPENSSL_NO_SRP
774 		else if (strcmp(*argv,"-srpuser") == 0)
775 			{
776 			if (--argc < 1) goto bad;
777 			srp_arg.srplogin= *(++argv);
778 			meth=TLSv1_client_method();
779 			}
780 		else if (strcmp(*argv,"-srppass") == 0)
781 			{
782 			if (--argc < 1) goto bad;
783 			srppass= *(++argv);
784 			meth=TLSv1_client_method();
785 			}
786 		else if (strcmp(*argv,"-srp_strength") == 0)
787 			{
788 			if (--argc < 1) goto bad;
789 			srp_arg.strength=atoi(*(++argv));
790 			BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
791 			meth=TLSv1_client_method();
792 			}
793 		else if (strcmp(*argv,"-srp_lateuser") == 0)
794 			{
795 			srp_lateuser= 1;
796 			meth=TLSv1_client_method();
797 			}
798 		else if	(strcmp(*argv,"-srp_moregroups") == 0)
799 			{
800 			srp_arg.amp=1;
801 			meth=TLSv1_client_method();
802 			}
803 #endif
804 #ifndef OPENSSL_NO_SSL2
805 		else if	(strcmp(*argv,"-ssl2") == 0)
806 			meth=SSLv2_client_method();
807 #endif
808 #ifndef OPENSSL_NO_SSL3
809 		else if	(strcmp(*argv,"-ssl3") == 0)
810 			meth=SSLv3_client_method();
811 #endif
812 #ifndef OPENSSL_NO_TLS1
813 		else if	(strcmp(*argv,"-tls1_2") == 0)
814 			meth=TLSv1_2_client_method();
815 		else if	(strcmp(*argv,"-tls1_1") == 0)
816 			meth=TLSv1_1_client_method();
817 		else if	(strcmp(*argv,"-tls1") == 0)
818 			meth=TLSv1_client_method();
819 #endif
820 #ifndef OPENSSL_NO_DTLS1
821 		else if	(strcmp(*argv,"-dtls1") == 0)
822 			{
823 			meth=DTLSv1_client_method();
824 			socket_type=SOCK_DGRAM;
825 			}
826 		else if (strcmp(*argv,"-timeout") == 0)
827 			enable_timeouts=1;
828 		else if (strcmp(*argv,"-mtu") == 0)
829 			{
830 			if (--argc < 1) goto bad;
831 			socket_mtu = atol(*(++argv));
832 			}
833 #endif
834 		else if (strcmp(*argv,"-bugs") == 0)
835 			bugs=1;
836 		else if	(strcmp(*argv,"-keyform") == 0)
837 			{
838 			if (--argc < 1) goto bad;
839 			key_format = str2fmt(*(++argv));
840 			}
841 		else if	(strcmp(*argv,"-pass") == 0)
842 			{
843 			if (--argc < 1) goto bad;
844 			passarg = *(++argv);
845 			}
846 		else if	(strcmp(*argv,"-key") == 0)
847 			{
848 			if (--argc < 1) goto bad;
849 			key_file= *(++argv);
850 			}
851 		else if	(strcmp(*argv,"-reconnect") == 0)
852 			{
853 			reconnect=5;
854 			}
855 		else if	(strcmp(*argv,"-CApath") == 0)
856 			{
857 			if (--argc < 1) goto bad;
858 			CApath= *(++argv);
859 			}
860 		else if	(strcmp(*argv,"-CAfile") == 0)
861 			{
862 			if (--argc < 1) goto bad;
863 			CAfile= *(++argv);
864 			}
865 		else if (strcmp(*argv,"-no_tls1_2") == 0)
866 			off|=SSL_OP_NO_TLSv1_2;
867 		else if (strcmp(*argv,"-no_tls1_1") == 0)
868 			off|=SSL_OP_NO_TLSv1_1;
869 		else if (strcmp(*argv,"-no_tls1") == 0)
870 			off|=SSL_OP_NO_TLSv1;
871 		else if (strcmp(*argv,"-no_ssl3") == 0)
872 			off|=SSL_OP_NO_SSLv3;
873 		else if (strcmp(*argv,"-no_ssl2") == 0)
874 			off|=SSL_OP_NO_SSLv2;
875 		else if	(strcmp(*argv,"-no_comp") == 0)
876 			{ off|=SSL_OP_NO_COMPRESSION; }
877 #ifndef OPENSSL_NO_TLSEXT
878 		else if	(strcmp(*argv,"-no_ticket") == 0)
879 			{ off|=SSL_OP_NO_TICKET; }
880 # ifndef OPENSSL_NO_NEXTPROTONEG
881 		else if (strcmp(*argv,"-nextprotoneg") == 0)
882 			{
883 			if (--argc < 1) goto bad;
884 			next_proto_neg_in = *(++argv);
885 			}
886 # endif
887 #endif
888 		else if (strcmp(*argv,"-cutthrough") == 0)
889 			cutthrough=1;
890 		else if (strcmp(*argv,"-serverpref") == 0)
891 			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
892 		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
893 			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
894 		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
895 			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
896 		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
897 			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
898 		else if	(strcmp(*argv,"-cipher") == 0)
899 			{
900 			if (--argc < 1) goto bad;
901 			cipher= *(++argv);
902 			}
903 #ifdef FIONBIO
904 		else if (strcmp(*argv,"-nbio") == 0)
905 			{ c_nbio=1; }
906 #endif
907 		else if	(strcmp(*argv,"-starttls") == 0)
908 			{
909 			if (--argc < 1) goto bad;
910 			++argv;
911 			if (strcmp(*argv,"smtp") == 0)
912 				starttls_proto = PROTO_SMTP;
913 			else if (strcmp(*argv,"pop3") == 0)
914 				starttls_proto = PROTO_POP3;
915 			else if (strcmp(*argv,"imap") == 0)
916 				starttls_proto = PROTO_IMAP;
917 			else if (strcmp(*argv,"ftp") == 0)
918 				starttls_proto = PROTO_FTP;
919 			else if (strcmp(*argv, "xmpp") == 0)
920 				starttls_proto = PROTO_XMPP;
921 			else
922 				goto bad;
923 			}
924 #ifndef OPENSSL_NO_ENGINE
925 		else if	(strcmp(*argv,"-engine") == 0)
926 			{
927 			if (--argc < 1) goto bad;
928 			engine_id = *(++argv);
929 			}
930 		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
931 			{
932 			if (--argc < 1) goto bad;
933 			ssl_client_engine_id = *(++argv);
934 			}
935 #endif
936 		else if (strcmp(*argv,"-rand") == 0)
937 			{
938 			if (--argc < 1) goto bad;
939 			inrand= *(++argv);
940 			}
941 #ifndef OPENSSL_NO_TLSEXT
942 		else if (strcmp(*argv,"-servername") == 0)
943 			{
944 			if (--argc < 1) goto bad;
945 			servername= *(++argv);
946 			/* meth=TLSv1_client_method(); */
947 			}
948 #endif
949 #ifndef OPENSSL_NO_JPAKE
950 		else if (strcmp(*argv,"-jpake") == 0)
951 			{
952 			if (--argc < 1) goto bad;
953 			jpake_secret = *++argv;
954 			}
955 #endif
956 #ifndef OPENSSL_NO_SRTP
957 		else if (strcmp(*argv,"-use_srtp") == 0)
958 			{
959 			if (--argc < 1) goto bad;
960 			srtp_profiles = *(++argv);
961 			}
962 #endif
963 		else if (strcmp(*argv,"-keymatexport") == 0)
964 			{
965 			if (--argc < 1) goto bad;
966 			keymatexportlabel= *(++argv);
967 			}
968 		else if (strcmp(*argv,"-keymatexportlen") == 0)
969 			{
970 			if (--argc < 1) goto bad;
971 			keymatexportlen=atoi(*(++argv));
972 			if (keymatexportlen == 0) goto bad;
973 			}
974                 else
975 			{
976 			BIO_printf(bio_err,"unknown option %s\n",*argv);
977 			badop=1;
978 			break;
979 			}
980 		argc--;
981 		argv++;
982 		}
983 	if (badop)
984 		{
985 bad:
986 		sc_usage();
987 		goto end;
988 		}
989 
990 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
991 	if (jpake_secret)
992 		{
993 		if (psk_key)
994 			{
995 			BIO_printf(bio_err,
996 				   "Can't use JPAKE and PSK together\n");
997 			goto end;
998 			}
999 		psk_identity = "JPAKE";
1000 		if (cipher)
1001 			{
1002 			BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1003 			goto end;
1004 			}
1005 		cipher = "PSK";
1006 		}
1007 #endif
1008 
1009 	OpenSSL_add_ssl_algorithms();
1010 	SSL_load_error_strings();
1011 
1012 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1013 	next_proto.status = -1;
1014 	if (next_proto_neg_in)
1015 		{
1016 		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1017 		if (next_proto.data == NULL)
1018 			{
1019 			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1020 			goto end;
1021 			}
1022 		}
1023 	else
1024 		next_proto.data = NULL;
1025 #endif
1026 
1027 #ifndef OPENSSL_NO_ENGINE
1028         e = setup_engine(bio_err, engine_id, 1);
1029 	if (ssl_client_engine_id)
1030 		{
1031 		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1032 		if (!ssl_client_engine)
1033 			{
1034 			BIO_printf(bio_err,
1035 					"Error getting client auth engine\n");
1036 			goto end;
1037 			}
1038 		}
1039 
1040 #endif
1041 	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1042 		{
1043 		BIO_printf(bio_err, "Error getting password\n");
1044 		goto end;
1045 		}
1046 
1047 	if (key_file == NULL)
1048 		key_file = cert_file;
1049 
1050 
1051 	if (key_file)
1052 
1053 		{
1054 
1055 		key = load_key(bio_err, key_file, key_format, 0, pass, e,
1056 			       "client certificate private key file");
1057 		if (!key)
1058 			{
1059 			ERR_print_errors(bio_err);
1060 			goto end;
1061 			}
1062 
1063 		}
1064 
1065 	if (cert_file)
1066 
1067 		{
1068 		cert = load_cert(bio_err,cert_file,cert_format,
1069 				NULL, e, "client certificate file");
1070 
1071 		if (!cert)
1072 			{
1073 			ERR_print_errors(bio_err);
1074 			goto end;
1075 			}
1076 		}
1077 
1078 	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1079 		&& !RAND_status())
1080 		{
1081 		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1082 		}
1083 	if (inrand != NULL)
1084 		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1085 			app_RAND_load_files(inrand));
1086 
1087 	if (bio_c_out == NULL)
1088 		{
1089 		if (c_quiet && !c_debug && !c_msg)
1090 			{
1091 			bio_c_out=BIO_new(BIO_s_null());
1092 			}
1093 		else
1094 			{
1095 			if (bio_c_out == NULL)
1096 				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1097 			}
1098 		}
1099 
1100 #ifndef OPENSSL_NO_SRP
1101 	if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1102 		{
1103 		BIO_printf(bio_err, "Error getting password\n");
1104 		goto end;
1105 		}
1106 #endif
1107 
1108 	ctx=SSL_CTX_new(meth);
1109 	if (ctx == NULL)
1110 		{
1111 		ERR_print_errors(bio_err);
1112 		goto end;
1113 		}
1114 
1115 	if (vpm)
1116 		SSL_CTX_set1_param(ctx, vpm);
1117 
1118 #ifndef OPENSSL_NO_ENGINE
1119 	if (ssl_client_engine)
1120 		{
1121 		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1122 			{
1123 			BIO_puts(bio_err, "Error setting client auth engine\n");
1124 			ERR_print_errors(bio_err);
1125 			ENGINE_free(ssl_client_engine);
1126 			goto end;
1127 			}
1128 		ENGINE_free(ssl_client_engine);
1129 		}
1130 #endif
1131 
1132 #ifndef OPENSSL_NO_PSK
1133 #ifdef OPENSSL_NO_JPAKE
1134 	if (psk_key != NULL)
1135 #else
1136 	if (psk_key != NULL || jpake_secret)
1137 #endif
1138 		{
1139 		if (c_debug)
1140 			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
1141 		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1142 		}
1143 #endif
1144 #ifndef OPENSSL_NO_SRTP
1145 	if (srtp_profiles != NULL)
1146 		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1147 #endif
1148 	if (bugs)
1149 		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1150 	else
1151 		SSL_CTX_set_options(ctx,off);
1152 
1153 	if (clr)
1154 		SSL_CTX_clear_options(ctx, clr);
1155 	/* DTLS: partial reads end up discarding unread UDP bytes :-(
1156 	 * Setting read ahead solves this problem.
1157 	 */
1158 	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1159 
1160 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1161 	if (next_proto.data)
1162 		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1163 #endif
1164 
1165 	/* Enable handshake cutthrough for client connections using
1166 	 * strong ciphers. */
1167 	if (cutthrough)
1168 		{
1169 		int ssl_mode = SSL_CTX_get_mode(ctx);
1170 		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
1171 		SSL_CTX_set_mode(ctx, ssl_mode);
1172 		}
1173 
1174 	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1175 	if (cipher != NULL)
1176 		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1177 		BIO_printf(bio_err,"error setting cipher list\n");
1178 		ERR_print_errors(bio_err);
1179 		goto end;
1180 	}
1181 #if 0
1182 	else
1183 		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1184 #endif
1185 
1186 	SSL_CTX_set_verify(ctx,verify,verify_callback);
1187 	if (!set_cert_key_stuff(ctx,cert,key))
1188 		goto end;
1189 
1190 	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1191 		(!SSL_CTX_set_default_verify_paths(ctx)))
1192 		{
1193 		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
1194 		ERR_print_errors(bio_err);
1195 		/* goto end; */
1196 		}
1197 
1198 #ifndef OPENSSL_NO_TLSEXT
1199 	if (servername != NULL)
1200 		{
1201 		tlsextcbp.biodebug = bio_err;
1202 		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1203 		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1204 		}
1205 #ifndef OPENSSL_NO_SRP
1206         if (srp_arg.srplogin)
1207 		{
1208 		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
1209 			{
1210 			BIO_printf(bio_err,"Unable to set SRP username\n");
1211 			goto end;
1212 			}
1213 		srp_arg.msg = c_msg;
1214 		srp_arg.debug = c_debug ;
1215 		SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1216 		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1217 		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1218 		if (c_msg || c_debug || srp_arg.amp == 0)
1219 			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1220 		}
1221 
1222 #endif
1223 #endif
1224 
1225 	con=SSL_new(ctx);
1226 	if (sess_in)
1227 		{
1228 		SSL_SESSION *sess;
1229 		BIO *stmp = BIO_new_file(sess_in, "r");
1230 		if (!stmp)
1231 			{
1232 			BIO_printf(bio_err, "Can't open session file %s\n",
1233 						sess_in);
1234 			ERR_print_errors(bio_err);
1235 			goto end;
1236 			}
1237 		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1238 		BIO_free(stmp);
1239 		if (!sess)
1240 			{
1241 			BIO_printf(bio_err, "Can't open session file %s\n",
1242 						sess_in);
1243 			ERR_print_errors(bio_err);
1244 			goto end;
1245 			}
1246 		SSL_set_session(con, sess);
1247 		SSL_SESSION_free(sess);
1248 		}
1249 #ifndef OPENSSL_NO_TLSEXT
1250 	if (servername != NULL)
1251 		{
1252 		if (!SSL_set_tlsext_host_name(con,servername))
1253 			{
1254 			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1255 			ERR_print_errors(bio_err);
1256 			goto end;
1257 			}
1258 		}
1259 #endif
1260 #ifndef OPENSSL_NO_KRB5
1261 	if (con  &&  (kctx = kssl_ctx_new()) != NULL)
1262                 {
1263 		SSL_set0_kssl_ctx(con, kctx);
1264                 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1265 		}
1266 #endif	/* OPENSSL_NO_KRB5  */
1267 /*	SSL_set_cipher_list(con,"RC4-MD5"); */
1268 #if 0
1269 #ifdef TLSEXT_TYPE_opaque_prf_input
1270 	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1271 #endif
1272 #endif
1273 
1274 re_start:
1275 
1276 	if (init_client(&s,host,port,socket_type) == 0)
1277 		{
1278 		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1279 		SHUTDOWN(s);
1280 		goto end;
1281 		}
1282 	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1283 
1284 #ifdef FIONBIO
1285 	if (c_nbio)
1286 		{
1287 		unsigned long l=1;
1288 		BIO_printf(bio_c_out,"turning on non blocking io\n");
1289 		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1290 			{
1291 			ERR_print_errors(bio_err);
1292 			goto end;
1293 			}
1294 		}
1295 #endif
1296 	if (c_Pause & 0x01) SSL_set_debug(con, 1);
1297 
1298 	if ( SSL_version(con) == DTLS1_VERSION)
1299 		{
1300 
1301 		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1302 		if (getsockname(s, &peer, (void *)&peerlen) < 0)
1303 			{
1304 			BIO_printf(bio_err, "getsockname:errno=%d\n",
1305 				get_last_socket_error());
1306 			SHUTDOWN(s);
1307 			goto end;
1308 			}
1309 
1310 		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
1311 
1312 		if (enable_timeouts)
1313 			{
1314 			timeout.tv_sec = 0;
1315 			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1316 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1317 
1318 			timeout.tv_sec = 0;
1319 			timeout.tv_usec = DGRAM_SND_TIMEOUT;
1320 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1321 			}
1322 
1323 		if (socket_mtu > 28)
1324 			{
1325 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1326 			SSL_set_mtu(con, socket_mtu - 28);
1327 			}
1328 		else
1329 			/* want to do MTU discovery */
1330 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1331 		}
1332 	else
1333 		sbio=BIO_new_socket(s,BIO_NOCLOSE);
1334 
1335 	if (nbio_test)
1336 		{
1337 		BIO *test;
1338 
1339 		test=BIO_new(BIO_f_nbio_test());
1340 		sbio=BIO_push(test,sbio);
1341 		}
1342 
1343 	if (c_debug)
1344 		{
1345 		SSL_set_debug(con, 1);
1346 		BIO_set_callback(sbio,bio_dump_callback);
1347 		BIO_set_callback_arg(sbio,(char *)bio_c_out);
1348 		}
1349 	if (c_msg)
1350 		{
1351 		SSL_set_msg_callback(con, msg_cb);
1352 		SSL_set_msg_callback_arg(con, bio_c_out);
1353 		}
1354 #ifndef OPENSSL_NO_TLSEXT
1355 	if (c_tlsextdebug)
1356 		{
1357 		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1358 		SSL_set_tlsext_debug_arg(con, bio_c_out);
1359 		}
1360 	if (c_status_req)
1361 		{
1362 		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1363 		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1364 		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1365 #if 0
1366 {
1367 STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1368 OCSP_RESPID *id = OCSP_RESPID_new();
1369 id->value.byKey = ASN1_OCTET_STRING_new();
1370 id->type = V_OCSP_RESPID_KEY;
1371 ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1372 sk_OCSP_RESPID_push(ids, id);
1373 SSL_set_tlsext_status_ids(con, ids);
1374 }
1375 #endif
1376 		}
1377 #endif
1378 #ifndef OPENSSL_NO_JPAKE
1379 	if (jpake_secret)
1380 		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1381 #endif
1382 
1383 	SSL_set_bio(con,sbio,sbio);
1384 	SSL_set_connect_state(con);
1385 
1386 	/* ok, lets connect */
1387 	width=SSL_get_fd(con)+1;
1388 
1389 	read_tty=1;
1390 	write_tty=0;
1391 	tty_on=0;
1392 	read_ssl=1;
1393 	write_ssl=1;
1394 
1395 	cbuf_len=0;
1396 	cbuf_off=0;
1397 	sbuf_len=0;
1398 	sbuf_off=0;
1399 
1400 	/* This is an ugly hack that does a lot of assumptions */
1401 	/* We do have to handle multi-line responses which may come
1402  	   in a single packet or not. We therefore have to use
1403 	   BIO_gets() which does need a buffering BIO. So during
1404 	   the initial chitchat we do push a buffering BIO into the
1405 	   chain that is removed again later on to not disturb the
1406 	   rest of the s_client operation. */
1407 	if (starttls_proto == PROTO_SMTP)
1408 		{
1409 		int foundit=0;
1410 		BIO *fbio = BIO_new(BIO_f_buffer());
1411 		BIO_push(fbio, sbio);
1412 		/* wait for multi-line response to end from SMTP */
1413 		do
1414 			{
1415 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1416 			}
1417 		while (mbuf_len>3 && mbuf[3]=='-');
1418 		/* STARTTLS command requires EHLO... */
1419 		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1420 		(void)BIO_flush(fbio);
1421 		/* wait for multi-line response to end EHLO SMTP response */
1422 		do
1423 			{
1424 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1425 			if (strstr(mbuf,"STARTTLS"))
1426 				foundit=1;
1427 			}
1428 		while (mbuf_len>3 && mbuf[3]=='-');
1429 		(void)BIO_flush(fbio);
1430 		BIO_pop(fbio);
1431 		BIO_free(fbio);
1432 		if (!foundit)
1433 			BIO_printf(bio_err,
1434 				   "didn't found starttls in server response,"
1435 				   " try anyway...\n");
1436 		BIO_printf(sbio,"STARTTLS\r\n");
1437 		BIO_read(sbio,sbuf,BUFSIZZ);
1438 		}
1439 	else if (starttls_proto == PROTO_POP3)
1440 		{
1441 		BIO_read(sbio,mbuf,BUFSIZZ);
1442 		BIO_printf(sbio,"STLS\r\n");
1443 		BIO_read(sbio,sbuf,BUFSIZZ);
1444 		}
1445 	else if (starttls_proto == PROTO_IMAP)
1446 		{
1447 		int foundit=0;
1448 		BIO *fbio = BIO_new(BIO_f_buffer());
1449 		BIO_push(fbio, sbio);
1450 		BIO_gets(fbio,mbuf,BUFSIZZ);
1451 		/* STARTTLS command requires CAPABILITY... */
1452 		BIO_printf(fbio,". CAPABILITY\r\n");
1453 		(void)BIO_flush(fbio);
1454 		/* wait for multi-line CAPABILITY response */
1455 		do
1456 			{
1457 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1458 			if (strstr(mbuf,"STARTTLS"))
1459 				foundit=1;
1460 			}
1461 		while (mbuf_len>3 && mbuf[0]!='.');
1462 		(void)BIO_flush(fbio);
1463 		BIO_pop(fbio);
1464 		BIO_free(fbio);
1465 		if (!foundit)
1466 			BIO_printf(bio_err,
1467 				   "didn't found STARTTLS in server response,"
1468 				   " try anyway...\n");
1469 		BIO_printf(sbio,". STARTTLS\r\n");
1470 		BIO_read(sbio,sbuf,BUFSIZZ);
1471 		}
1472 	else if (starttls_proto == PROTO_FTP)
1473 		{
1474 		BIO *fbio = BIO_new(BIO_f_buffer());
1475 		BIO_push(fbio, sbio);
1476 		/* wait for multi-line response to end from FTP */
1477 		do
1478 			{
1479 			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1480 			}
1481 		while (mbuf_len>3 && mbuf[3]=='-');
1482 		(void)BIO_flush(fbio);
1483 		BIO_pop(fbio);
1484 		BIO_free(fbio);
1485 		BIO_printf(sbio,"AUTH TLS\r\n");
1486 		BIO_read(sbio,sbuf,BUFSIZZ);
1487 		}
1488 	if (starttls_proto == PROTO_XMPP)
1489 		{
1490 		int seen = 0;
1491 		BIO_printf(sbio,"<stream:stream "
1492 		    "xmlns:stream='http://etherx.jabber.org/streams' "
1493 		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1494 		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1495 		mbuf[seen] = 0;
1496 		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1497 			{
1498 			if (strstr(mbuf, "/stream:features>"))
1499 				goto shut;
1500 			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1501 			mbuf[seen] = 0;
1502 			}
1503 		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1504 		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1505 		sbuf[seen] = 0;
1506 		if (!strstr(sbuf, "<proceed"))
1507 			goto shut;
1508 		mbuf[0] = 0;
1509 		}
1510 
1511 	for (;;)
1512 		{
1513 		FD_ZERO(&readfds);
1514 		FD_ZERO(&writefds);
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(fileno(stdin),&readfds);
1582 				if (write_tty) openssl_fdset(fileno(stdout),&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(fileno(stdin), 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(fileno(stdin), 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(fileno(stdin), 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(fileno(stdout),&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(fileno(stdin),&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 
print_stuff(BIO * bio,SSL * s,int full)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 
ocsp_resp_cb(SSL * s,void * arg)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