LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/apps - s_client.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 0 1058 0.0 %
Date: 2014-08-02 Functions: 0 11 0.0 %
Branches: 0 816 0.0 %

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

Generated by: LCOV version 1.9