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