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