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