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