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