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