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