]> CyberLeo.Net >> Repos - FreeBSD/releng/9.3.git/blob - crypto/openssl/apps/s_client.c
Fix multiple OpenSSL vulnerabilities.
[FreeBSD/releng/9.3.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-2001 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 #include <assert.h>
113 #include <stdio.h>
114 #include <stdlib.h>
115 #include <string.h>
116 #include <openssl/e_os2.h>
117 #ifdef OPENSSL_NO_STDIO
118 # define APPS_WIN16
119 #endif
120
121 /*
122  * With IPv6, it looks like Digital has mixed up the proper order of
123  * recursive header file inclusion, resulting in the compiler complaining
124  * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
125  * needed to have fileno() declared correctly...  So let's define u_int
126  */
127 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
128 # define __U_INT
129 typedef unsigned int u_int;
130 #endif
131
132 #define USE_SOCKETS
133 #include "apps.h"
134 #include <openssl/x509.h>
135 #include <openssl/ssl.h>
136 #include <openssl/err.h>
137 #include <openssl/pem.h>
138 #include <openssl/rand.h>
139 #include <openssl/ocsp.h>
140 #include "s_apps.h"
141 #include "timeouts.h"
142
143 #ifdef OPENSSL_SYS_WINCE
144 /*
145  * Windows CE incorrectly defines fileno as returning void*, so to avoid
146  * problems below...
147  */
148 # ifdef fileno
149 #  undef fileno
150 # endif
151 # define fileno(a) (int)_fileno(a)
152 #endif
153
154 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
155 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
156 # undef FIONBIO
157 #endif
158
159 #undef PROG
160 #define PROG    s_client_main
161
162 /*
163  * #define SSL_HOST_NAME "www.netscape.com"
164  */
165 /*
166  * #define SSL_HOST_NAME "193.118.187.102"
167  */
168 #define SSL_HOST_NAME   "localhost"
169
170 /* no default cert. */
171 /*
172  * #define TEST_CERT "client.pem"
173  */
174
175 #undef BUFSIZZ
176 #define BUFSIZZ 1024*8
177
178 extern int verify_depth;
179 extern int verify_error;
180
181 #ifdef FIONBIO
182 static int c_nbio = 0;
183 #endif
184 static int c_Pause = 0;
185 static int c_debug = 0;
186 #ifndef OPENSSL_NO_TLSEXT
187 static int c_tlsextdebug = 0;
188 static int c_status_req = 0;
189 #endif
190 static int c_msg = 0;
191 static int c_showcerts = 0;
192
193 static void sc_usage(void);
194 static void print_stuff(BIO *berr, SSL *con, int full);
195 #ifndef OPENSSL_NO_TLSEXT
196 static int ocsp_resp_cb(SSL *s, void *arg);
197 #endif
198 static BIO *bio_c_out = NULL;
199 static int c_quiet = 0;
200 static int c_ign_eof = 0;
201
202 static void sc_usage(void)
203 {
204     BIO_printf(bio_err, "usage: s_client args\n");
205     BIO_printf(bio_err, "\n");
206     BIO_printf(bio_err, " -host host     - use -connect instead\n");
207     BIO_printf(bio_err, " -port port     - use -connect instead\n");
208     BIO_printf(bio_err,
209                " -connect host:port - who to connect to (default is %s:%s)\n",
210                SSL_HOST_NAME, PORT_STR);
211
212     BIO_printf(bio_err,
213                " -verify depth - turn on peer certificate verification\n");
214     BIO_printf(bio_err,
215                " -cert arg     - certificate file to use, PEM format assumed\n");
216     BIO_printf(bio_err,
217                " -certform arg - certificate format (PEM or DER) PEM default\n");
218     BIO_printf(bio_err,
219                " -key arg      - Private key file to use, in cert file if\n");
220     BIO_printf(bio_err, "                 not specified but cert file is.\n");
221     BIO_printf(bio_err,
222                " -keyform arg  - key format (PEM or DER) PEM default\n");
223     BIO_printf(bio_err,
224                " -pass arg     - private key file pass phrase source\n");
225     BIO_printf(bio_err, " -CApath arg   - PEM format directory of CA's\n");
226     BIO_printf(bio_err, " -CAfile arg   - PEM format file of CA's\n");
227     BIO_printf(bio_err,
228                " -reconnect    - Drop and re-make the connection with the same Session-ID\n");
229     BIO_printf(bio_err,
230                " -pause        - sleep(1) after each read(2) and write(2) system call\n");
231     BIO_printf(bio_err,
232                " -showcerts    - show all certificates in the chain\n");
233     BIO_printf(bio_err, " -debug        - extra output\n");
234 #ifdef WATT32
235     BIO_printf(bio_err, " -wdebug       - WATT-32 tcp debugging\n");
236 #endif
237     BIO_printf(bio_err, " -msg          - Show protocol messages\n");
238     BIO_printf(bio_err, " -nbio_test    - more ssl protocol testing\n");
239     BIO_printf(bio_err, " -state        - print the 'ssl' states\n");
240 #ifdef FIONBIO
241     BIO_printf(bio_err, " -nbio         - Run with non-blocking IO\n");
242 #endif
243     BIO_printf(bio_err,
244                " -crlf         - convert LF from terminal into CRLF\n");
245     BIO_printf(bio_err, " -quiet        - no s_client output\n");
246     BIO_printf(bio_err,
247                " -ign_eof      - ignore input eof (default when -quiet)\n");
248     BIO_printf(bio_err, " -no_ign_eof   - don't ignore input eof\n");
249     BIO_printf(bio_err, " -ssl2         - just use SSLv2\n");
250     BIO_printf(bio_err, " -ssl3         - just use SSLv3\n");
251     BIO_printf(bio_err, " -tls1         - just use TLSv1\n");
252     BIO_printf(bio_err, " -dtls1        - just use DTLSv1\n");
253     BIO_printf(bio_err, " -fallback_scsv - send TLS_FALLBACK_SCSV\n");
254     BIO_printf(bio_err, " -mtu          - set the link layer MTU\n");
255     BIO_printf(bio_err,
256                " -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
257     BIO_printf(bio_err,
258                " -bugs         - Switch on all SSL implementation bug workarounds\n");
259     BIO_printf(bio_err,
260                " -serverpref   - Use server's cipher preferences (only SSLv2)\n");
261     BIO_printf(bio_err,
262                " -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
263     BIO_printf(bio_err,
264                "                 command to see what is available\n");
265     BIO_printf(bio_err,
266                " -starttls prot - use the STARTTLS command before starting TLS\n");
267     BIO_printf(bio_err,
268                "                 for those protocols that support it, where\n");
269     BIO_printf(bio_err,
270                "                 'prot' defines which one to assume.  Currently,\n");
271     BIO_printf(bio_err,
272                "                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
273     BIO_printf(bio_err, "                 are supported.\n");
274 #ifndef OPENSSL_NO_ENGINE
275     BIO_printf(bio_err,
276                " -engine id    - Initialise and use the specified engine\n");
277 #endif
278     BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
279                LIST_SEPARATOR_CHAR);
280     BIO_printf(bio_err, " -sess_out arg - file to write SSL session to\n");
281     BIO_printf(bio_err, " -sess_in arg  - file to read SSL session from\n");
282 #ifndef OPENSSL_NO_TLSEXT
283     BIO_printf(bio_err,
284                " -servername host  - Set TLS extension servername in ClientHello\n");
285     BIO_printf(bio_err,
286                " -tlsextdebug      - hex dump of all TLS extensions received\n");
287     BIO_printf(bio_err,
288                " -status           - request certificate status from server\n");
289     BIO_printf(bio_err,
290                " -no_ticket        - disable use of RFC4507bis session tickets\n");
291 #endif
292     BIO_printf(bio_err,
293                " -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
294 }
295
296 #ifndef OPENSSL_NO_TLSEXT
297
298 /* This is a context that we pass to callbacks */
299 typedef struct tlsextctx_st {
300     BIO *biodebug;
301     int ack;
302 } tlsextctx;
303
304 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
305 {
306     tlsextctx *p = (tlsextctx *) arg;
307     const char *hn = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
308     if (SSL_get_servername_type(s) != -1)
309         p->ack = !SSL_session_reused(s) && hn != NULL;
310     else
311         BIO_printf(bio_err, "Can't use SSL_get_servername\n");
312
313     return SSL_TLSEXT_ERR_OK;
314 }
315 #endif
316 enum {
317     PROTO_OFF = 0,
318     PROTO_SMTP,
319     PROTO_POP3,
320     PROTO_IMAP,
321     PROTO_FTP,
322     PROTO_XMPP
323 };
324
325 int MAIN(int, char **);
326
327 int MAIN(int argc, char **argv)
328 {
329     int off = 0, clr = 0;
330     SSL *con = NULL, *con2 = NULL;
331     X509_STORE *store = NULL;
332     int s, k, width, state = 0;
333     char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL;
334     int cbuf_len, cbuf_off;
335     int sbuf_len, sbuf_off;
336     fd_set readfds, writefds;
337     short port = PORT;
338     int full_log = 1;
339     char *host = SSL_HOST_NAME;
340     char *cert_file = NULL, *key_file = NULL;
341     int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
342     char *passarg = NULL, *pass = NULL;
343     X509 *cert = NULL;
344     EVP_PKEY *key = NULL;
345     char *CApath = NULL, *CAfile = NULL, *cipher = NULL;
346     int reconnect = 0, badop = 0, verify = SSL_VERIFY_NONE, bugs = 0;
347     int crlf = 0;
348     int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending;
349     SSL_CTX *ctx = NULL;
350     int ret = 1, in_init = 1, i, nbio_test = 0;
351     int starttls_proto = PROTO_OFF;
352     int prexit = 0, vflags = 0;
353     SSL_METHOD *meth = NULL;
354 #ifdef sock_type
355 # undef sock_type
356 #endif
357     int sock_type = SOCK_STREAM;
358     BIO *sbio;
359     char *inrand = NULL;
360     int mbuf_len = 0;
361     struct timeval timeout, *timeoutp;
362 #ifndef OPENSSL_NO_ENGINE
363     char *engine_id = NULL;
364     char *ssl_client_engine_id = NULL;
365     ENGINE *ssl_client_engine = NULL;
366 #endif
367     ENGINE *e = NULL;
368 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
369     struct timeval tv;
370 #endif
371
372 #ifndef OPENSSL_NO_TLSEXT
373     char *servername = NULL;
374     tlsextctx tlsextcbp = { NULL, 0 };
375 #endif
376     char *sess_in = NULL;
377     char *sess_out = NULL;
378     struct sockaddr peer;
379     int peerlen = sizeof(peer);
380     int fallback_scsv = 0;
381     int enable_timeouts = 0;
382     long socket_mtu = 0;
383 #ifndef OPENSSL_NO_JPAKE
384     char *jpake_secret = NULL;
385 #endif
386
387     meth = SSLv23_client_method();
388
389     apps_startup();
390     c_Pause = 0;
391     c_quiet = 0;
392     c_ign_eof = 0;
393     c_debug = 0;
394     c_msg = 0;
395     c_showcerts = 0;
396
397     if (bio_err == NULL)
398         bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
399
400     if (!load_config(bio_err, NULL))
401         goto end;
402
403     if (((cbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
404         ((sbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
405         ((mbuf = OPENSSL_malloc(BUFSIZZ)) == NULL)) {
406         BIO_printf(bio_err, "out of memory\n");
407         goto end;
408     }
409
410     verify_depth = 0;
411     verify_error = X509_V_OK;
412 #ifdef FIONBIO
413     c_nbio = 0;
414 #endif
415
416     argc--;
417     argv++;
418     while (argc >= 1) {
419         if (strcmp(*argv, "-host") == 0) {
420             if (--argc < 1)
421                 goto bad;
422             host = *(++argv);
423         } else if (strcmp(*argv, "-port") == 0) {
424             if (--argc < 1)
425                 goto bad;
426             port = atoi(*(++argv));
427             if (port == 0)
428                 goto bad;
429         } else if (strcmp(*argv, "-connect") == 0) {
430             if (--argc < 1)
431                 goto bad;
432             if (!extract_host_port(*(++argv), &host, NULL, &port))
433                 goto bad;
434         } else if (strcmp(*argv, "-verify") == 0) {
435             verify = SSL_VERIFY_PEER;
436             if (--argc < 1)
437                 goto bad;
438             verify_depth = atoi(*(++argv));
439             BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
440         } else if (strcmp(*argv, "-cert") == 0) {
441             if (--argc < 1)
442                 goto bad;
443             cert_file = *(++argv);
444         } else if (strcmp(*argv, "-sess_out") == 0) {
445             if (--argc < 1)
446                 goto bad;
447             sess_out = *(++argv);
448         } else if (strcmp(*argv, "-sess_in") == 0) {
449             if (--argc < 1)
450                 goto bad;
451             sess_in = *(++argv);
452         } else if (strcmp(*argv, "-certform") == 0) {
453             if (--argc < 1)
454                 goto bad;
455             cert_format = str2fmt(*(++argv));
456         } else if (strcmp(*argv, "-crl_check") == 0)
457             vflags |= X509_V_FLAG_CRL_CHECK;
458         else if (strcmp(*argv, "-crl_check_all") == 0)
459             vflags |= X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL;
460         else if (strcmp(*argv, "-prexit") == 0)
461             prexit = 1;
462         else if (strcmp(*argv, "-crlf") == 0)
463             crlf = 1;
464         else if (strcmp(*argv, "-quiet") == 0) {
465             c_quiet = 1;
466             c_ign_eof = 1;
467         } else if (strcmp(*argv, "-ign_eof") == 0)
468             c_ign_eof = 1;
469         else if (strcmp(*argv, "-no_ign_eof") == 0)
470             c_ign_eof = 0;
471         else if (strcmp(*argv, "-pause") == 0)
472             c_Pause = 1;
473         else if (strcmp(*argv, "-debug") == 0)
474             c_debug = 1;
475 #ifndef OPENSSL_NO_TLSEXT
476         else if (strcmp(*argv, "-tlsextdebug") == 0)
477             c_tlsextdebug = 1;
478         else if (strcmp(*argv, "-status") == 0)
479             c_status_req = 1;
480 #endif
481 #ifdef WATT32
482         else if (strcmp(*argv, "-wdebug") == 0)
483             dbug_init();
484 #endif
485         else if (strcmp(*argv, "-msg") == 0)
486             c_msg = 1;
487         else if (strcmp(*argv, "-showcerts") == 0)
488             c_showcerts = 1;
489         else if (strcmp(*argv, "-nbio_test") == 0)
490             nbio_test = 1;
491         else if (strcmp(*argv, "-state") == 0)
492             state = 1;
493 #ifndef OPENSSL_NO_SSL2
494         else if (strcmp(*argv, "-ssl2") == 0)
495             meth = SSLv2_client_method();
496 #endif
497 #ifndef OPENSSL_NO_SSL3
498         else if (strcmp(*argv, "-ssl3") == 0)
499             meth = SSLv3_client_method();
500 #endif
501 #ifndef OPENSSL_NO_TLS1
502         else if (strcmp(*argv, "-tls1") == 0)
503             meth = TLSv1_client_method();
504 #endif
505 #ifndef OPENSSL_NO_DTLS1
506         else if (strcmp(*argv, "-dtls1") == 0) {
507             meth = DTLSv1_client_method();
508             sock_type = SOCK_DGRAM;
509         } else if (strcmp(*argv, "-timeout") == 0)
510             enable_timeouts = 1;
511         else if (strcmp(*argv, "-mtu") == 0) {
512             if (--argc < 1)
513                 goto bad;
514             socket_mtu = atol(*(++argv));
515         }
516 #endif
517         else if (strcmp(*argv, "-fallback_scsv") == 0) {
518             fallback_scsv = 1;
519         } else if (strcmp(*argv, "-bugs") == 0)
520             bugs = 1;
521         else if (strcmp(*argv, "-keyform") == 0) {
522             if (--argc < 1)
523                 goto bad;
524             key_format = str2fmt(*(++argv));
525         } else if (strcmp(*argv, "-pass") == 0) {
526             if (--argc < 1)
527                 goto bad;
528             passarg = *(++argv);
529         } else if (strcmp(*argv, "-key") == 0) {
530             if (--argc < 1)
531                 goto bad;
532             key_file = *(++argv);
533         } else if (strcmp(*argv, "-reconnect") == 0) {
534             reconnect = 5;
535         } else if (strcmp(*argv, "-CApath") == 0) {
536             if (--argc < 1)
537                 goto bad;
538             CApath = *(++argv);
539         } else if (strcmp(*argv, "-CAfile") == 0) {
540             if (--argc < 1)
541                 goto bad;
542             CAfile = *(++argv);
543         } else if (strcmp(*argv, "-no_tls1") == 0)
544             off |= SSL_OP_NO_TLSv1;
545         else if (strcmp(*argv, "-no_ssl3") == 0)
546             off |= SSL_OP_NO_SSLv3;
547         else if (strcmp(*argv, "-no_ssl2") == 0)
548             off |= SSL_OP_NO_SSLv2;
549 #ifndef OPENSSL_NO_TLSEXT
550         else if (strcmp(*argv, "-no_ticket") == 0) {
551             off |= SSL_OP_NO_TICKET;
552         }
553 #endif
554         else if (strcmp(*argv, "-serverpref") == 0)
555             off |= SSL_OP_CIPHER_SERVER_PREFERENCE;
556         else if (strcmp(*argv, "-legacy_renegotiation") == 0)
557             off |= SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
558         else if (strcmp(*argv, "-legacy_server_connect") == 0) {
559             off |= SSL_OP_LEGACY_SERVER_CONNECT;
560         } else if (strcmp(*argv, "-no_legacy_server_connect") == 0) {
561             clr |= SSL_OP_LEGACY_SERVER_CONNECT;
562         } else if (strcmp(*argv, "-cipher") == 0) {
563             if (--argc < 1)
564                 goto bad;
565             cipher = *(++argv);
566         }
567 #ifdef FIONBIO
568         else if (strcmp(*argv, "-nbio") == 0) {
569             c_nbio = 1;
570         }
571 #endif
572         else if (strcmp(*argv, "-starttls") == 0) {
573             if (--argc < 1)
574                 goto bad;
575             ++argv;
576             if (strcmp(*argv, "smtp") == 0)
577                 starttls_proto = PROTO_SMTP;
578             else if (strcmp(*argv, "pop3") == 0)
579                 starttls_proto = PROTO_POP3;
580             else if (strcmp(*argv, "imap") == 0)
581                 starttls_proto = PROTO_IMAP;
582             else if (strcmp(*argv, "ftp") == 0)
583                 starttls_proto = PROTO_FTP;
584             else if (strcmp(*argv, "xmpp") == 0)
585                 starttls_proto = PROTO_XMPP;
586             else
587                 goto bad;
588         }
589 #ifndef OPENSSL_NO_ENGINE
590         else if (strcmp(*argv, "-engine") == 0) {
591             if (--argc < 1)
592                 goto bad;
593             engine_id = *(++argv);
594         } else if (strcmp(*argv, "-ssl_client_engine") == 0) {
595             if (--argc < 1)
596                 goto bad;
597             ssl_client_engine_id = *(++argv);
598         }
599 #endif
600         else if (strcmp(*argv, "-rand") == 0) {
601             if (--argc < 1)
602                 goto bad;
603             inrand = *(++argv);
604         }
605 #ifndef OPENSSL_NO_TLSEXT
606         else if (strcmp(*argv, "-servername") == 0) {
607             if (--argc < 1)
608                 goto bad;
609             servername = *(++argv);
610             /* meth=TLSv1_client_method(); */
611         }
612 #endif
613 #ifndef OPENSSL_NO_JPAKE
614         else if (strcmp(*argv, "-jpake") == 0) {
615             if (--argc < 1)
616                 goto bad;
617             jpake_secret = *++argv;
618         }
619 #endif
620         else {
621             BIO_printf(bio_err, "unknown option %s\n", *argv);
622             badop = 1;
623             break;
624         }
625         argc--;
626         argv++;
627     }
628     if (badop) {
629  bad:
630         sc_usage();
631         goto end;
632     }
633
634     OpenSSL_add_ssl_algorithms();
635     SSL_load_error_strings();
636
637 #ifndef OPENSSL_NO_ENGINE
638     e = setup_engine(bio_err, engine_id, 1);
639     if (ssl_client_engine_id) {
640         ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
641         if (!ssl_client_engine) {
642             BIO_printf(bio_err, "Error getting client auth engine\n");
643             goto end;
644         }
645     }
646 #endif
647     if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
648         BIO_printf(bio_err, "Error getting password\n");
649         goto end;
650     }
651
652     if (key_file == NULL)
653         key_file = cert_file;
654
655     if (key_file) {
656
657         key = load_key(bio_err, key_file, key_format, 0, pass, e,
658                        "client certificate private key file");
659         if (!key) {
660             ERR_print_errors(bio_err);
661             goto end;
662         }
663
664     }
665
666     if (cert_file) {
667         cert = load_cert(bio_err, cert_file, cert_format,
668                          NULL, e, "client certificate file");
669
670         if (!cert) {
671             ERR_print_errors(bio_err);
672             goto end;
673         }
674     }
675
676     if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
677         && !RAND_status()) {
678         BIO_printf(bio_err,
679                    "warning, not much extra random data, consider using the -rand option\n");
680     }
681     if (inrand != NULL)
682         BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
683                    app_RAND_load_files(inrand));
684
685     if (bio_c_out == NULL) {
686         if (c_quiet && !c_debug && !c_msg) {
687             bio_c_out = BIO_new(BIO_s_null());
688         } else {
689             if (bio_c_out == NULL)
690                 bio_c_out = BIO_new_fp(stdout, BIO_NOCLOSE);
691         }
692     }
693
694     ctx = SSL_CTX_new(meth);
695     if (ctx == NULL) {
696         ERR_print_errors(bio_err);
697         goto end;
698     }
699 #ifndef OPENSSL_NO_ENGINE
700     if (ssl_client_engine) {
701         if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) {
702             BIO_puts(bio_err, "Error setting client auth engine\n");
703             ERR_print_errors(bio_err);
704             ENGINE_free(ssl_client_engine);
705             goto end;
706         }
707         ENGINE_free(ssl_client_engine);
708     }
709 #endif
710
711     if (bugs)
712         SSL_CTX_set_options(ctx, SSL_OP_ALL | off);
713     else
714         SSL_CTX_set_options(ctx, off);
715
716     if (clr)
717         SSL_CTX_clear_options(ctx, clr);
718     /*
719      * DTLS: partial reads end up discarding unread UDP bytes :-( Setting
720      * read ahead solves this problem.
721      */
722     if (sock_type == SOCK_DGRAM)
723         SSL_CTX_set_read_ahead(ctx, 1);
724
725     if (state)
726         SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
727     if (cipher != NULL)
728         if (!SSL_CTX_set_cipher_list(ctx, cipher)) {
729             BIO_printf(bio_err, "error setting cipher list\n");
730             ERR_print_errors(bio_err);
731             goto end;
732         }
733 #if 0
734         else
735             SSL_CTX_set_cipher_list(ctx, getenv("SSL_CIPHER"));
736 #endif
737
738     SSL_CTX_set_verify(ctx, verify, verify_callback);
739     if (!set_cert_key_stuff(ctx, cert, key))
740         goto end;
741
742     if ((!SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) ||
743         (!SSL_CTX_set_default_verify_paths(ctx))) {
744         /*
745          * BIO_printf(bio_err,"error setting default verify locations\n");
746          */
747         ERR_print_errors(bio_err);
748         /* goto end; */
749     }
750
751     store = SSL_CTX_get_cert_store(ctx);
752     X509_STORE_set_flags(store, vflags);
753 #ifndef OPENSSL_NO_TLSEXT
754     if (servername != NULL) {
755         tlsextcbp.biodebug = bio_err;
756         SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
757         SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
758     }
759 #endif
760
761     con = SSL_new(ctx);
762     if (sess_in) {
763         SSL_SESSION *sess;
764         BIO *stmp = BIO_new_file(sess_in, "r");
765         if (!stmp) {
766             BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
767             ERR_print_errors(bio_err);
768             goto end;
769         }
770         sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
771         BIO_free(stmp);
772         if (!sess) {
773             BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
774             ERR_print_errors(bio_err);
775             goto end;
776         }
777         SSL_set_session(con, sess);
778         SSL_SESSION_free(sess);
779     }
780
781     if (fallback_scsv)
782         SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
783
784 #ifndef OPENSSL_NO_TLSEXT
785     if (servername != NULL) {
786         if (!SSL_set_tlsext_host_name(con, servername)) {
787             BIO_printf(bio_err, "Unable to set TLS servername extension.\n");
788             ERR_print_errors(bio_err);
789             goto end;
790         }
791     }
792 #endif
793
794 #ifndef OPENSSL_NO_KRB5
795     if (con && (con->kssl_ctx = kssl_ctx_new()) != NULL) {
796         kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);
797     }
798 #endif                          /* OPENSSL_NO_KRB5 */
799 /*      SSL_set_cipher_list(con,"RC4-MD5"); */
800
801  re_start:
802
803     if (init_client(&s, host, port, sock_type) == 0) {
804         BIO_printf(bio_err, "connect:errno=%d\n", get_last_socket_error());
805         SHUTDOWN(s);
806         goto end;
807     }
808     BIO_printf(bio_c_out, "CONNECTED(%08X)\n", s);
809
810 #ifdef FIONBIO
811     if (c_nbio) {
812         unsigned long l = 1;
813         BIO_printf(bio_c_out, "turning on non blocking io\n");
814         if (BIO_socket_ioctl(s, FIONBIO, &l) < 0) {
815             ERR_print_errors(bio_err);
816             goto end;
817         }
818     }
819 #endif
820     if (c_Pause & 0x01)
821         con->debug = 1;
822
823     if (SSL_version(con) == DTLS1_VERSION) {
824
825         sbio = BIO_new_dgram(s, BIO_NOCLOSE);
826         if (getsockname(s, &peer, (void *)&peerlen) < 0) {
827             BIO_printf(bio_err, "getsockname:errno=%d\n",
828                        get_last_socket_error());
829             SHUTDOWN(s);
830             goto end;
831         }
832
833         (void)BIO_ctrl_set_connected(sbio, 1, &peer);
834
835         if (enable_timeouts) {
836             timeout.tv_sec = 0;
837             timeout.tv_usec = DGRAM_RCV_TIMEOUT;
838             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
839
840             timeout.tv_sec = 0;
841             timeout.tv_usec = DGRAM_SND_TIMEOUT;
842             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
843         }
844
845         if (socket_mtu > 28) {
846             SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
847             SSL_set_mtu(con, socket_mtu - 28);
848         } else
849             /* want to do MTU discovery */
850             BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
851     } else
852         sbio = BIO_new_socket(s, BIO_NOCLOSE);
853
854     if (nbio_test) {
855         BIO *test;
856
857         test = BIO_new(BIO_f_nbio_test());
858         sbio = BIO_push(test, sbio);
859     }
860
861     if (c_debug) {
862         con->debug = 1;
863         BIO_set_callback(sbio, bio_dump_callback);
864         BIO_set_callback_arg(sbio, (char *)bio_c_out);
865     }
866     if (c_msg) {
867         SSL_set_msg_callback(con, msg_cb);
868         SSL_set_msg_callback_arg(con, bio_c_out);
869     }
870 #ifndef OPENSSL_NO_TLSEXT
871     if (c_tlsextdebug) {
872         SSL_set_tlsext_debug_callback(con, tlsext_cb);
873         SSL_set_tlsext_debug_arg(con, bio_c_out);
874     }
875     if (c_status_req) {
876         SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
877         SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
878         SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
879 # if 0
880         {
881             STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
882             OCSP_RESPID *id = OCSP_RESPID_new();
883             id->value.byKey = ASN1_OCTET_STRING_new();
884             id->type = V_OCSP_RESPID_KEY;
885             ASN1_STRING_set(id->value.byKey, "Hello World", -1);
886             sk_OCSP_RESPID_push(ids, id);
887             SSL_set_tlsext_status_ids(con, ids);
888         }
889 # endif
890     }
891 #endif
892 #ifndef OPENSSL_NO_JPAKE
893     if (jpake_secret)
894         jpake_client_auth(bio_c_out, sbio, jpake_secret);
895 #endif
896
897     SSL_set_bio(con, sbio, sbio);
898     SSL_set_connect_state(con);
899
900     /* ok, lets connect */
901     width = SSL_get_fd(con) + 1;
902
903     read_tty = 1;
904     write_tty = 0;
905     tty_on = 0;
906     read_ssl = 1;
907     write_ssl = 1;
908
909     cbuf_len = 0;
910     cbuf_off = 0;
911     sbuf_len = 0;
912     sbuf_off = 0;
913
914     /* This is an ugly hack that does a lot of assumptions */
915     /*
916      * We do have to handle multi-line responses which may come in a single
917      * packet or not. We therefore have to use BIO_gets() which does need a
918      * buffering BIO. So during the initial chitchat we do push a buffering
919      * BIO into the chain that is removed again later on to not disturb the
920      * rest of the s_client operation.
921      */
922     if (starttls_proto == PROTO_SMTP) {
923         int foundit = 0;
924         BIO *fbio = BIO_new(BIO_f_buffer());
925         BIO_push(fbio, sbio);
926         /* wait for multi-line response to end from SMTP */
927         do {
928             mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
929         }
930         while (mbuf_len > 3 && mbuf[3] == '-');
931         /* STARTTLS command requires EHLO... */
932         BIO_printf(fbio, "EHLO openssl.client.net\r\n");
933         (void)BIO_flush(fbio);
934         /* wait for multi-line response to end EHLO SMTP response */
935         do {
936             mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
937             if (strstr(mbuf, "STARTTLS"))
938                 foundit = 1;
939         }
940         while (mbuf_len > 3 && mbuf[3] == '-');
941         (void)BIO_flush(fbio);
942         BIO_pop(fbio);
943         BIO_free(fbio);
944         if (!foundit)
945             BIO_printf(bio_err,
946                        "didn't found starttls in server response,"
947                        " try anyway...\n");
948         BIO_printf(sbio, "STARTTLS\r\n");
949         BIO_read(sbio, sbuf, BUFSIZZ);
950     } else if (starttls_proto == PROTO_POP3) {
951         BIO_read(sbio, mbuf, BUFSIZZ);
952         BIO_printf(sbio, "STLS\r\n");
953         BIO_read(sbio, sbuf, BUFSIZZ);
954     } else if (starttls_proto == PROTO_IMAP) {
955         int foundit = 0;
956         BIO *fbio = BIO_new(BIO_f_buffer());
957         BIO_push(fbio, sbio);
958         BIO_gets(fbio, mbuf, BUFSIZZ);
959         /* STARTTLS command requires CAPABILITY... */
960         BIO_printf(fbio, ". CAPABILITY\r\n");
961         (void)BIO_flush(fbio);
962         /* wait for multi-line CAPABILITY response */
963         do {
964             mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
965             if (strstr(mbuf, "STARTTLS"))
966                 foundit = 1;
967         }
968         while (mbuf_len > 3 && mbuf[0] != '.');
969         (void)BIO_flush(fbio);
970         BIO_pop(fbio);
971         BIO_free(fbio);
972         if (!foundit)
973             BIO_printf(bio_err,
974                        "didn't found STARTTLS in server response,"
975                        " try anyway...\n");
976         BIO_printf(sbio, ". STARTTLS\r\n");
977         BIO_read(sbio, sbuf, BUFSIZZ);
978     } else if (starttls_proto == PROTO_FTP) {
979         BIO *fbio = BIO_new(BIO_f_buffer());
980         BIO_push(fbio, sbio);
981         /* wait for multi-line response to end from FTP */
982         do {
983             mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
984         }
985         while (mbuf_len > 3 && mbuf[3] == '-');
986         (void)BIO_flush(fbio);
987         BIO_pop(fbio);
988         BIO_free(fbio);
989         BIO_printf(sbio, "AUTH TLS\r\n");
990         BIO_read(sbio, sbuf, BUFSIZZ);
991     }
992     if (starttls_proto == PROTO_XMPP) {
993         int seen = 0;
994         BIO_printf(sbio, "<stream:stream "
995                    "xmlns:stream='http://etherx.jabber.org/streams' "
996                    "xmlns='jabber:client' to='%s' version='1.0'>", host);
997         seen = BIO_read(sbio, mbuf, BUFSIZZ);
998         mbuf[seen] = 0;
999         while (!strstr
1000                (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) {
1001             if (strstr(mbuf, "/stream:features>"))
1002                 goto shut;
1003             seen = BIO_read(sbio, mbuf, BUFSIZZ);
1004             mbuf[seen] = 0;
1005         }
1006         BIO_printf(sbio,
1007                    "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1008         seen = BIO_read(sbio, sbuf, BUFSIZZ);
1009         sbuf[seen] = 0;
1010         if (!strstr(sbuf, "<proceed"))
1011             goto shut;
1012         mbuf[0] = 0;
1013     }
1014
1015     for (;;) {
1016         FD_ZERO(&readfds);
1017         FD_ZERO(&writefds);
1018
1019         if ((SSL_version(con) == DTLS1_VERSION) &&
1020             DTLSv1_get_timeout(con, &timeout))
1021             timeoutp = &timeout;
1022         else
1023             timeoutp = NULL;
1024
1025         if (SSL_in_init(con) && !SSL_total_renegotiations(con)) {
1026             in_init = 1;
1027             tty_on = 0;
1028         } else {
1029             tty_on = 1;
1030             if (in_init) {
1031                 in_init = 0;
1032                 if (sess_out) {
1033                     BIO *stmp = BIO_new_file(sess_out, "w");
1034                     if (stmp) {
1035                         PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1036                         BIO_free(stmp);
1037                     } else
1038                         BIO_printf(bio_err, "Error writing session file %s\n",
1039                                    sess_out);
1040                 }
1041                 print_stuff(bio_c_out, con, full_log);
1042                 if (full_log > 0)
1043                     full_log--;
1044
1045                 if (starttls_proto) {
1046                     BIO_printf(bio_err, "%s", mbuf);
1047                     /* We don't need to know any more */
1048                     starttls_proto = PROTO_OFF;
1049                 }
1050
1051                 if (reconnect) {
1052                     reconnect--;
1053                     BIO_printf(bio_c_out,
1054                                "drop connection and then reconnect\n");
1055                     SSL_shutdown(con);
1056                     SSL_set_connect_state(con);
1057                     SHUTDOWN(SSL_get_fd(con));
1058                     goto re_start;
1059                 }
1060             }
1061         }
1062
1063         ssl_pending = read_ssl && SSL_pending(con);
1064
1065         if (!ssl_pending) {
1066 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
1067             if (tty_on) {
1068                 if (read_tty)
1069                     FD_SET(fileno(stdin), &readfds);
1070                 if (write_tty)
1071                     FD_SET(fileno(stdout), &writefds);
1072             }
1073             if (read_ssl)
1074                 FD_SET(SSL_get_fd(con), &readfds);
1075             if (write_ssl)
1076                 FD_SET(SSL_get_fd(con), &writefds);
1077 #else
1078             if (!tty_on || !write_tty) {
1079                 if (read_ssl)
1080                     FD_SET(SSL_get_fd(con), &readfds);
1081                 if (write_ssl)
1082                     FD_SET(SSL_get_fd(con), &writefds);
1083             }
1084 #endif
1085 /*-         printf("mode tty(%d %d%d) ssl(%d%d)\n",
1086                     tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1087
1088             /*
1089              * Note: under VMS with SOCKETSHR the second parameter is
1090              * currently of type (int *) whereas under other systems it is
1091              * (void *) if you don't have a cast it will choke the compiler:
1092              * if you do have a cast then you can either go for (int *) or
1093              * (void *).
1094              */
1095 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1096             /*
1097              * Under Windows/DOS we make the assumption that we can always
1098              * write to the tty: therefore if we need to write to the tty we
1099              * just fall through. Otherwise we timeout the select every
1100              * second and see if there are any keypresses. Note: this is a
1101              * hack, in a proper Windows application we wouldn't do this.
1102              */
1103             i = 0;
1104             if (!write_tty) {
1105                 if (read_tty) {
1106                     tv.tv_sec = 1;
1107                     tv.tv_usec = 0;
1108                     i = select(width, (void *)&readfds, (void *)&writefds,
1109                                NULL, &tv);
1110 # if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1111                     if (!i && (!_kbhit() || !read_tty))
1112                         continue;
1113 # else
1114                     if (!i && (!((_kbhit())
1115                                  || (WAIT_OBJECT_0 ==
1116                                      WaitForSingleObject(GetStdHandle
1117                                                          (STD_INPUT_HANDLE),
1118                                                          0)))
1119                                || !read_tty))
1120                         continue;
1121 # endif
1122                 } else
1123                     i = select(width, (void *)&readfds, (void *)&writefds,
1124                                NULL, timeoutp);
1125             }
1126 #elif defined(OPENSSL_SYS_NETWARE)
1127             if (!write_tty) {
1128                 if (read_tty) {
1129                     tv.tv_sec = 1;
1130                     tv.tv_usec = 0;
1131                     i = select(width, (void *)&readfds, (void *)&writefds,
1132                                NULL, &tv);
1133                 } else
1134                     i = select(width, (void *)&readfds, (void *)&writefds,
1135                                NULL, timeoutp);
1136             }
1137 #else
1138             i = select(width, (void *)&readfds, (void *)&writefds,
1139                        NULL, timeoutp);
1140 #endif
1141             if (i < 0) {
1142                 BIO_printf(bio_err, "bad select %d\n",
1143                            get_last_socket_error());
1144                 goto shut;
1145                 /* goto end; */
1146             }
1147         }
1148
1149         if ((SSL_version(con) == DTLS1_VERSION)
1150             && DTLSv1_handle_timeout(con) > 0) {
1151             BIO_printf(bio_err, "TIMEOUT occured\n");
1152         }
1153
1154         if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) {
1155             k = SSL_write(con, &(cbuf[cbuf_off]), (unsigned int)cbuf_len);
1156             switch (SSL_get_error(con, k)) {
1157             case SSL_ERROR_NONE:
1158                 cbuf_off += k;
1159                 cbuf_len -= k;
1160                 if (k <= 0)
1161                     goto end;
1162                 /* we have done a  write(con,NULL,0); */
1163                 if (cbuf_len <= 0) {
1164                     read_tty = 1;
1165                     write_ssl = 0;
1166                 } else {        /* if (cbuf_len > 0) */
1167
1168                     read_tty = 0;
1169                     write_ssl = 1;
1170                 }
1171                 break;
1172             case SSL_ERROR_WANT_WRITE:
1173                 BIO_printf(bio_c_out, "write W BLOCK\n");
1174                 write_ssl = 1;
1175                 read_tty = 0;
1176                 break;
1177             case SSL_ERROR_WANT_READ:
1178                 BIO_printf(bio_c_out, "write R BLOCK\n");
1179                 write_tty = 0;
1180                 read_ssl = 1;
1181                 write_ssl = 0;
1182                 break;
1183             case SSL_ERROR_WANT_X509_LOOKUP:
1184                 BIO_printf(bio_c_out, "write X BLOCK\n");
1185                 break;
1186             case SSL_ERROR_ZERO_RETURN:
1187                 if (cbuf_len != 0) {
1188                     BIO_printf(bio_c_out, "shutdown\n");
1189                     goto shut;
1190                 } else {
1191                     read_tty = 1;
1192                     write_ssl = 0;
1193                     break;
1194                 }
1195
1196             case SSL_ERROR_SYSCALL:
1197                 if ((k != 0) || (cbuf_len != 0)) {
1198                     BIO_printf(bio_err, "write:errno=%d\n",
1199                                get_last_socket_error());
1200                     goto shut;
1201                 } else {
1202                     read_tty = 1;
1203                     write_ssl = 0;
1204                 }
1205                 break;
1206             case SSL_ERROR_SSL:
1207                 ERR_print_errors(bio_err);
1208                 goto shut;
1209             }
1210         }
1211 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
1212         /* Assume Windows/DOS can always write */
1213         else if (!ssl_pending && write_tty)
1214 #else
1215         else if (!ssl_pending && FD_ISSET(fileno(stdout), &writefds))
1216 #endif
1217         {
1218 #ifdef CHARSET_EBCDIC
1219             ascii2ebcdic(&(sbuf[sbuf_off]), &(sbuf[sbuf_off]), sbuf_len);
1220 #endif
1221             i = write(fileno(stdout), &(sbuf[sbuf_off]), sbuf_len);
1222
1223             if (i <= 0) {
1224                 BIO_printf(bio_c_out, "DONE\n");
1225                 goto shut;
1226                 /* goto end; */
1227             }
1228
1229             sbuf_len -= i;;
1230             sbuf_off += i;
1231             if (sbuf_len <= 0) {
1232                 read_ssl = 1;
1233                 write_tty = 0;
1234             }
1235         } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) {
1236 #ifdef RENEG
1237             {
1238                 static int iiii;
1239                 if (++iiii == 52) {
1240                     SSL_renegotiate(con);
1241                     iiii = 0;
1242                 }
1243             }
1244 #endif
1245 #if 1
1246             k = SSL_read(con, sbuf, 1024 /* BUFSIZZ */ );
1247 #else
1248 /* Demo for pending and peek :-) */
1249             k = SSL_read(con, sbuf, 16);
1250             {
1251                 char zbuf[10240];
1252                 printf("read=%d pending=%d peek=%d\n", k, SSL_pending(con),
1253                        SSL_peek(con, zbuf, 10240));
1254             }
1255 #endif
1256
1257             switch (SSL_get_error(con, k)) {
1258             case SSL_ERROR_NONE:
1259                 if (k <= 0)
1260                     goto end;
1261                 sbuf_off = 0;
1262                 sbuf_len = k;
1263
1264                 read_ssl = 0;
1265                 write_tty = 1;
1266                 break;
1267             case SSL_ERROR_WANT_WRITE:
1268                 BIO_printf(bio_c_out, "read W BLOCK\n");
1269                 write_ssl = 1;
1270                 read_tty = 0;
1271                 break;
1272             case SSL_ERROR_WANT_READ:
1273                 BIO_printf(bio_c_out, "read R BLOCK\n");
1274                 write_tty = 0;
1275                 read_ssl = 1;
1276                 if ((read_tty == 0) && (write_ssl == 0))
1277                     write_ssl = 1;
1278                 break;
1279             case SSL_ERROR_WANT_X509_LOOKUP:
1280                 BIO_printf(bio_c_out, "read X BLOCK\n");
1281                 break;
1282             case SSL_ERROR_SYSCALL:
1283                 BIO_printf(bio_err, "read:errno=%d\n",
1284                            get_last_socket_error());
1285                 goto shut;
1286             case SSL_ERROR_ZERO_RETURN:
1287                 BIO_printf(bio_c_out, "closed\n");
1288                 goto shut;
1289             case SSL_ERROR_SSL:
1290                 ERR_print_errors(bio_err);
1291                 goto shut;
1292                 /* break; */
1293             }
1294         }
1295 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1296 # if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1297         else if (_kbhit())
1298 # else
1299         else if ((_kbhit())
1300                  || (WAIT_OBJECT_0 ==
1301                      WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1302 # endif
1303 #elif defined (OPENSSL_SYS_NETWARE)
1304         else if (_kbhit())
1305 #else
1306         else if (FD_ISSET(fileno(stdin), &readfds))
1307 #endif
1308         {
1309             if (crlf) {
1310                 int j, lf_num;
1311
1312                 i = read(fileno(stdin), cbuf, BUFSIZZ / 2);
1313                 lf_num = 0;
1314                 /* both loops are skipped when i <= 0 */
1315                 for (j = 0; j < i; j++)
1316                     if (cbuf[j] == '\n')
1317                         lf_num++;
1318                 for (j = i - 1; j >= 0; j--) {
1319                     cbuf[j + lf_num] = cbuf[j];
1320                     if (cbuf[j] == '\n') {
1321                         lf_num--;
1322                         i++;
1323                         cbuf[j + lf_num] = '\r';
1324                     }
1325                 }
1326                 assert(lf_num == 0);
1327             } else
1328                 i = read(fileno(stdin), cbuf, BUFSIZZ);
1329
1330             if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q'))) {
1331                 BIO_printf(bio_err, "DONE\n");
1332                 goto shut;
1333             }
1334
1335             if ((!c_ign_eof) && (cbuf[0] == 'R')) {
1336                 BIO_printf(bio_err, "RENEGOTIATING\n");
1337                 SSL_renegotiate(con);
1338                 cbuf_len = 0;
1339             } else {
1340                 cbuf_len = i;
1341                 cbuf_off = 0;
1342 #ifdef CHARSET_EBCDIC
1343                 ebcdic2ascii(cbuf, cbuf, i);
1344 #endif
1345             }
1346
1347             write_ssl = 1;
1348             read_tty = 0;
1349         }
1350     }
1351  shut:
1352     SSL_shutdown(con);
1353     SHUTDOWN(SSL_get_fd(con));
1354     ret = 0;
1355  end:
1356     if (prexit)
1357         print_stuff(bio_c_out, con, 1);
1358     if (con != NULL)
1359         SSL_free(con);
1360     if (con2 != NULL)
1361         SSL_free(con2);
1362     if (ctx != NULL)
1363         SSL_CTX_free(ctx);
1364     if (cert)
1365         X509_free(cert);
1366     if (key)
1367         EVP_PKEY_free(key);
1368     if (pass)
1369         OPENSSL_free(pass);
1370     if (cbuf != NULL) {
1371         OPENSSL_cleanse(cbuf, BUFSIZZ);
1372         OPENSSL_free(cbuf);
1373     }
1374     if (sbuf != NULL) {
1375         OPENSSL_cleanse(sbuf, BUFSIZZ);
1376         OPENSSL_free(sbuf);
1377     }
1378     if (mbuf != NULL) {
1379         OPENSSL_cleanse(mbuf, BUFSIZZ);
1380         OPENSSL_free(mbuf);
1381     }
1382     if (bio_c_out != NULL) {
1383         BIO_free(bio_c_out);
1384         bio_c_out = NULL;
1385     }
1386     apps_shutdown();
1387     OPENSSL_EXIT(ret);
1388 }
1389
1390 static void print_stuff(BIO *bio, SSL *s, int full)
1391 {
1392     X509 *peer = NULL;
1393     char *p;
1394     static const char *space = "                ";
1395     char buf[BUFSIZ];
1396     STACK_OF(X509) *sk;
1397     STACK_OF(X509_NAME) *sk2;
1398     SSL_CIPHER *c;
1399     X509_NAME *xn;
1400     int j, i;
1401 #ifndef OPENSSL_NO_COMP
1402     const COMP_METHOD *comp, *expansion;
1403 #endif
1404
1405     if (full) {
1406         int got_a_chain = 0;
1407
1408         sk = SSL_get_peer_cert_chain(s);
1409         if (sk != NULL) {
1410             got_a_chain = 1;    /* we don't have it for SSL2 (yet) */
1411
1412             BIO_printf(bio, "---\nCertificate chain\n");
1413             for (i = 0; i < sk_X509_num(sk); i++) {
1414                 X509_NAME_oneline(X509_get_subject_name(sk_X509_value(sk, i)),
1415                                   buf, sizeof buf);
1416                 BIO_printf(bio, "%2d s:%s\n", i, buf);
1417                 X509_NAME_oneline(X509_get_issuer_name(sk_X509_value(sk, i)),
1418                                   buf, sizeof buf);
1419                 BIO_printf(bio, "   i:%s\n", buf);
1420                 if (c_showcerts)
1421                     PEM_write_bio_X509(bio, sk_X509_value(sk, i));
1422             }
1423         }
1424
1425         BIO_printf(bio, "---\n");
1426         peer = SSL_get_peer_certificate(s);
1427         if (peer != NULL) {
1428             BIO_printf(bio, "Server certificate\n");
1429
1430             /* Redundant if we showed the whole chain */
1431             if (!(c_showcerts && got_a_chain))
1432                 PEM_write_bio_X509(bio, peer);
1433             X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof buf);
1434             BIO_printf(bio, "subject=%s\n", buf);
1435             X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof buf);
1436             BIO_printf(bio, "issuer=%s\n", buf);
1437         } else
1438             BIO_printf(bio, "no peer certificate available\n");
1439
1440         sk2 = SSL_get_client_CA_list(s);
1441         if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0)) {
1442             BIO_printf(bio, "---\nAcceptable client certificate CA names\n");
1443             for (i = 0; i < sk_X509_NAME_num(sk2); i++) {
1444                 xn = sk_X509_NAME_value(sk2, i);
1445                 X509_NAME_oneline(xn, buf, sizeof(buf));
1446                 BIO_write(bio, buf, strlen(buf));
1447                 BIO_write(bio, "\n", 1);
1448             }
1449         } else {
1450             BIO_printf(bio, "---\nNo client certificate CA names sent\n");
1451         }
1452         p = SSL_get_shared_ciphers(s, buf, sizeof buf);
1453         if (p != NULL) {
1454             /*
1455              * This works only for SSL 2.  In later protocol versions, the
1456              * client does not know what other ciphers (in addition to the
1457              * one to be used in the current connection) the server supports.
1458              */
1459
1460             BIO_printf(bio,
1461                        "---\nCiphers common between both SSL endpoints:\n");
1462             j = i = 0;
1463             while (*p) {
1464                 if (*p == ':') {
1465                     BIO_write(bio, space, 15 - j % 25);
1466                     i++;
1467                     j = 0;
1468                     BIO_write(bio, ((i % 3) ? " " : "\n"), 1);
1469                 } else {
1470                     BIO_write(bio, p, 1);
1471                     j++;
1472                 }
1473                 p++;
1474             }
1475             BIO_write(bio, "\n", 1);
1476         }
1477
1478         BIO_printf(bio,
1479                    "---\nSSL handshake has read %ld bytes and written %ld bytes\n",
1480                    BIO_number_read(SSL_get_rbio(s)),
1481                    BIO_number_written(SSL_get_wbio(s)));
1482     }
1483     BIO_printf(bio, ((s->hit) ? "---\nReused, " : "---\nNew, "));
1484     c = SSL_get_current_cipher(s);
1485     BIO_printf(bio, "%s, Cipher is %s\n",
1486                SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
1487     if (peer != NULL) {
1488         EVP_PKEY *pktmp;
1489         pktmp = X509_get_pubkey(peer);
1490         BIO_printf(bio, "Server public key is %d bit\n",
1491                    EVP_PKEY_bits(pktmp));
1492         EVP_PKEY_free(pktmp);
1493     }
1494     BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
1495                SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
1496 #ifndef OPENSSL_NO_COMP
1497     comp = SSL_get_current_compression(s);
1498     expansion = SSL_get_current_expansion(s);
1499     BIO_printf(bio, "Compression: %s\n",
1500                comp ? SSL_COMP_get_name(comp) : "NONE");
1501     BIO_printf(bio, "Expansion: %s\n",
1502                expansion ? SSL_COMP_get_name(expansion) : "NONE");
1503 #endif
1504     SSL_SESSION_print(bio, SSL_get_session(s));
1505     BIO_printf(bio, "---\n");
1506     if (peer != NULL)
1507         X509_free(peer);
1508     /* flush, or debugging output gets mixed with http response */
1509     (void)BIO_flush(bio);
1510 }
1511
1512 #ifndef OPENSSL_NO_TLSEXT
1513
1514 static int ocsp_resp_cb(SSL *s, void *arg)
1515 {
1516     const unsigned char *p;
1517     int len;
1518     OCSP_RESPONSE *rsp;
1519     len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1520     BIO_puts(arg, "OCSP response: ");
1521     if (!p) {
1522         BIO_puts(arg, "no response sent\n");
1523         return 1;
1524     }
1525     rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
1526     if (!rsp) {
1527         BIO_puts(arg, "response parse error\n");
1528         BIO_dump_indent(arg, (char *)p, len, 4);
1529         return 0;
1530     }
1531     BIO_puts(arg, "\n======================================\n");
1532     OCSP_RESPONSE_print(arg, rsp, 0);
1533     BIO_puts(arg, "======================================\n");
1534     OCSP_RESPONSE_free(rsp);
1535     return 1;
1536 }
1537 #endif                          /* ndef OPENSSL_NO_TLSEXT */