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