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