Home | History | Annotate | Line # | Download | only in apps
s_server.c revision 1.11.2.2
      1 /* apps/s_server.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 /* ====================================================================
    112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    113  * ECC cipher suite support in OpenSSL originally developed by
    114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
    115  */
    116 /* ====================================================================
    117  * Copyright 2005 Nokia. All rights reserved.
    118  *
    119  * The portions of the attached software ("Contribution") is developed by
    120  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
    121  * license.
    122  *
    123  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
    124  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
    125  * support (see RFC 4279) to OpenSSL.
    126  *
    127  * No patent licenses or other rights except those expressly stated in
    128  * the OpenSSL open source license shall be deemed granted or received
    129  * expressly, by implication, estoppel, or otherwise.
    130  *
    131  * No assurances are provided by Nokia that the Contribution does not
    132  * infringe the patent or other intellectual property rights of any third
    133  * party or that the license provides you with all the necessary rights
    134  * to make use of the Contribution.
    135  *
    136  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
    137  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
    138  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
    139  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
    140  * OTHERWISE.
    141  */
    142 
    143 /*
    144  * Until the key-gen callbacks are modified to use newer prototypes, we allow
    145  * deprecated functions for openssl-internal code
    146  */
    147 #ifdef OPENSSL_NO_DEPRECATED
    148 # undef OPENSSL_NO_DEPRECATED
    149 #endif
    150 
    151 #include <assert.h>
    152 #include <ctype.h>
    153 #include <stdio.h>
    154 #include <stdlib.h>
    155 #include <string.h>
    156 
    157 #include <openssl/e_os2.h>
    158 #ifdef OPENSSL_NO_STDIO
    159 # define APPS_WIN16
    160 #endif
    161 
    162 /* conflicts with winsock2 stuff on netware */
    163 #if !defined(OPENSSL_SYS_NETWARE)
    164 # include <sys/types.h>
    165 #endif
    166 
    167 /*
    168  * With IPv6, it looks like Digital has mixed up the proper order of
    169  * recursive header file inclusion, resulting in the compiler complaining
    170  * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
    171  * needed to have fileno() declared correctly...  So let's define u_int
    172  */
    173 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
    174 # define __U_INT
    175 typedef unsigned int u_int;
    176 #endif
    177 
    178 #include <openssl/lhash.h>
    179 #include <openssl/bn.h>
    180 #define USE_SOCKETS
    181 #include "apps.h"
    182 #include <openssl/err.h>
    183 #include <openssl/pem.h>
    184 #include <openssl/x509.h>
    185 #include <openssl/ssl.h>
    186 #include <openssl/rand.h>
    187 #include <openssl/ocsp.h>
    188 #ifndef OPENSSL_NO_DH
    189 # include <openssl/dh.h>
    190 #endif
    191 #ifndef OPENSSL_NO_RSA
    192 # include <openssl/rsa.h>
    193 #endif
    194 #ifndef OPENSSL_NO_SRP
    195 # include <openssl/srp.h>
    196 #endif
    197 #include "s_apps.h"
    198 #include "timeouts.h"
    199 
    200 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
    201 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
    202 # undef FIONBIO
    203 #endif
    204 
    205 #if defined(OPENSSL_SYS_BEOS_R5)
    206 # include <fcntl.h>
    207 #endif
    208 
    209 #ifndef OPENSSL_NO_RSA
    210 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
    211 #endif
    212 static int sv_body(char *hostname, int s, int stype, unsigned char *context);
    213 static int www_body(char *hostname, int s, int stype, unsigned char *context);
    214 static int rev_body(char *hostname, int s, int stype, unsigned char *context);
    215 static void close_accept_socket(void);
    216 static void sv_usage(void);
    217 static int init_ssl_connection(SSL *s);
    218 static void print_stats(BIO *bp, SSL_CTX *ctx);
    219 static int generate_session_id(const SSL *ssl, unsigned char *id,
    220                                unsigned int *id_len);
    221 static void init_session_cache_ctx(SSL_CTX *sctx);
    222 static void free_sessions(void);
    223 #ifndef OPENSSL_NO_DH
    224 static DH *load_dh_param(const char *dhfile);
    225 static DH *get_dh2048(void);
    226 #endif
    227 
    228 #ifdef MONOLITH
    229 static void s_server_init(void);
    230 #endif
    231 
    232 #ifndef OPENSSL_NO_DH
    233 static unsigned char dh2048_p[] = {
    234     0xF6,0x42,0x57,0xB7,0x08,0x7F,0x08,0x17,0x72,0xA2,0xBA,0xD6,
    235     0xA9,0x42,0xF3,0x05,0xE8,0xF9,0x53,0x11,0x39,0x4F,0xB6,0xF1,
    236     0x6E,0xB9,0x4B,0x38,0x20,0xDA,0x01,0xA7,0x56,0xA3,0x14,0xE9,
    237     0x8F,0x40,0x55,0xF3,0xD0,0x07,0xC6,0xCB,0x43,0xA9,0x94,0xAD,
    238     0xF7,0x4C,0x64,0x86,0x49,0xF8,0x0C,0x83,0xBD,0x65,0xE9,0x17,
    239     0xD4,0xA1,0xD3,0x50,0xF8,0xF5,0x59,0x5F,0xDC,0x76,0x52,0x4F,
    240     0x3D,0x3D,0x8D,0xDB,0xCE,0x99,0xE1,0x57,0x92,0x59,0xCD,0xFD,
    241     0xB8,0xAE,0x74,0x4F,0xC5,0xFC,0x76,0xBC,0x83,0xC5,0x47,0x30,
    242     0x61,0xCE,0x7C,0xC9,0x66,0xFF,0x15,0xF9,0xBB,0xFD,0x91,0x5E,
    243     0xC7,0x01,0xAA,0xD3,0x5B,0x9E,0x8D,0xA0,0xA5,0x72,0x3A,0xD4,
    244     0x1A,0xF0,0xBF,0x46,0x00,0x58,0x2B,0xE5,0xF4,0x88,0xFD,0x58,
    245     0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,0x91,0x07,0x36,0x6B,
    246     0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,0x88,0xB3,0x1C,0x7C,
    247     0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,0x43,0xF0,0xA5,0x5B,
    248     0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,0x38,0xD3,0x34,0xFD,
    249     0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,0xDE,0x33,0x21,0x2C,
    250     0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C,
    251     0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29,
    252     0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B,
    253     0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C,
    254     0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55,
    255     0xE9,0x32,0x0B,0x3B,
    256 };
    257 
    258 static unsigned char dh2048_g[] = {
    259     0x02,
    260 };
    261 
    262 DH *get_dh2048()
    263 {
    264     DH *dh;
    265 
    266     if ((dh = DH_new()) == NULL)
    267         return NULL;
    268     dh->p=BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
    269     dh->g=BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
    270     if (dh->p == NULL || dh->g == NULL) {
    271         DH_free(dh);
    272         return NULL;
    273     }
    274     return dh;
    275 }
    276 #endif
    277 
    278 /* static int load_CA(SSL_CTX *ctx, char *file);*/
    279 
    280 #undef BUFSIZZ
    281 #define BUFSIZZ 16*1024
    282 static int bufsize = BUFSIZZ;
    283 static int accept_socket = -1;
    284 
    285 #define TEST_CERT       "server.pem"
    286 #ifndef OPENSSL_NO_TLSEXT
    287 # define TEST_CERT2      "server2.pem"
    288 #endif
    289 #undef PROG
    290 #define PROG            s_server_main
    291 
    292 extern int verify_depth, verify_return_error, verify_quiet;
    293 
    294 static int s_server_verify = SSL_VERIFY_NONE;
    295 static int s_server_session_id_context = 1; /* anything will do */
    296 static const char *s_cert_file = TEST_CERT, *s_key_file =
    297     NULL, *s_chain_file = NULL;
    298 #ifndef OPENSSL_NO_TLSEXT
    299 static const char *s_cert_file2 = TEST_CERT2, *s_key_file2 = NULL;
    300 #endif
    301 static char *s_dcert_file = NULL, *s_dkey_file = NULL, *s_dchain_file = NULL;
    302 #ifdef FIONBIO
    303 static int s_nbio = 0;
    304 #endif
    305 static int s_nbio_test = 0;
    306 int s_crlf = 0;
    307 static SSL_CTX *ctx = NULL;
    308 #ifndef OPENSSL_NO_TLSEXT
    309 static SSL_CTX *ctx2 = NULL;
    310 #endif
    311 static int www = 0;
    312 
    313 static BIO *bio_s_out = NULL;
    314 static BIO *bio_s_msg = NULL;
    315 static int s_debug = 0;
    316 #ifndef OPENSSL_NO_TLSEXT
    317 static int s_tlsextdebug = 0;
    318 static int s_tlsextstatus = 0;
    319 static int cert_status_cb(SSL *s, void *arg);
    320 #endif
    321 static int no_resume_ephemeral = 0;
    322 static int s_msg = 0;
    323 static int s_quiet = 0;
    324 static int s_ign_eof = 0;
    325 static int s_brief = 0;
    326 
    327 static char *keymatexportlabel = NULL;
    328 static int keymatexportlen = 20;
    329 
    330 static int hack = 0;
    331 static char *engine_id = NULL;
    332 static const char *session_id_prefix = NULL;
    333 
    334 static int enable_timeouts = 0;
    335 static long socket_mtu;
    336 #ifndef OPENSSL_NO_DTLS1
    337 static int cert_chain = 0;
    338 #endif
    339 
    340 #ifndef OPENSSL_NO_TLSEXT
    341 static BIO *serverinfo_in = NULL;
    342 static const char *s_serverinfo_file = NULL;
    343 
    344 #endif
    345 
    346 #ifndef OPENSSL_NO_PSK
    347 static char *psk_identity = "Client_identity";
    348 char *psk_key = NULL;           /* by default PSK is not used */
    349 
    350 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
    351                                   unsigned char *psk,
    352                                   unsigned int max_psk_len)
    353 {
    354     long key_len = 0;
    355     unsigned char *key;
    356 
    357     if (s_debug)
    358         BIO_printf(bio_s_out, "psk_server_cb\n");
    359     if (!identity) {
    360         BIO_printf(bio_err, "Error: client did not send PSK identity\n");
    361         goto out_err;
    362     }
    363     if (s_debug)
    364         BIO_printf(bio_s_out, "identity_len=%d identity=%s\n",
    365                    (int)strlen(identity), identity);
    366 
    367     /* here we could lookup the given identity e.g. from a database */
    368     if (strcmp(identity, psk_identity) != 0) {
    369         BIO_printf(bio_s_out, "PSK error: client identity not found"
    370                    " (got '%s' expected '%s')\n", identity, psk_identity);
    371         goto out_err;
    372     }
    373     if (s_debug)
    374         BIO_printf(bio_s_out, "PSK client identity found\n");
    375 
    376     /* convert the PSK key to binary */
    377     key = string_to_hex(psk_key, &key_len);
    378     if (key == NULL) {
    379         BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n",
    380                    psk_key);
    381         return 0;
    382     }
    383     if (key_len > (int)max_psk_len) {
    384         BIO_printf(bio_err,
    385                    "psk buffer of callback is too small (%d) for key (%ld)\n",
    386                    max_psk_len, key_len);
    387         OPENSSL_free(key);
    388         return 0;
    389     }
    390 
    391     memcpy(psk, key, key_len);
    392     OPENSSL_free(key);
    393 
    394     if (s_debug)
    395         BIO_printf(bio_s_out, "fetched PSK len=%ld\n", key_len);
    396     return key_len;
    397  out_err:
    398     if (s_debug)
    399         BIO_printf(bio_err, "Error in PSK server callback\n");
    400     return 0;
    401 }
    402 #endif
    403 
    404 #ifndef OPENSSL_NO_SRP
    405 /* This is a context that we pass to callbacks */
    406 typedef struct srpsrvparm_st {
    407     char *login;
    408     SRP_VBASE *vb;
    409     SRP_user_pwd *user;
    410 } srpsrvparm;
    411 
    412 /*
    413  * This callback pretends to require some asynchronous logic in order to
    414  * obtain a verifier. When the callback is called for a new connection we
    415  * return with a negative value. This will provoke the accept etc to return
    416  * with an LOOKUP_X509. The main logic of the reinvokes the suspended call
    417  * (which would normally occur after a worker has finished) and we set the
    418  * user parameters.
    419  */
    420 static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
    421 {
    422     srpsrvparm *p = (srpsrvparm *) arg;
    423     int ret = SSL3_AL_FATAL;
    424 
    425     if (p->login == NULL && p->user == NULL) {
    426         p->login = SSL_get_srp_username(s);
    427         BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login);
    428         return (-1);
    429     }
    430 
    431     if (p->user == NULL) {
    432         BIO_printf(bio_err, "User %s doesn't exist\n", p->login);
    433         goto err;
    434     }
    435 
    436     if (SSL_set_srp_server_param
    437         (s, p->user->N, p->user->g, p->user->s, p->user->v,
    438          p->user->info) < 0) {
    439         *ad = SSL_AD_INTERNAL_ERROR;
    440         goto err;
    441     }
    442     BIO_printf(bio_err,
    443                "SRP parameters set: username = \"%s\" info=\"%s\" \n",
    444                p->login, p->user->info);
    445     ret = SSL_ERROR_NONE;
    446 
    447 err:
    448     SRP_user_pwd_free(p->user);
    449     p->user = NULL;
    450     p->login = NULL;
    451     return ret;
    452 }
    453 
    454 #endif
    455 
    456 #ifdef MONOLITH
    457 static void s_server_init(void)
    458 {
    459     accept_socket = -1;
    460     s_server_verify = SSL_VERIFY_NONE;
    461     s_dcert_file = NULL;
    462     s_dkey_file = NULL;
    463     s_dchain_file = NULL;
    464     s_cert_file = TEST_CERT;
    465     s_key_file = NULL;
    466     s_chain_file = NULL;
    467 # ifndef OPENSSL_NO_TLSEXT
    468     s_cert_file2 = TEST_CERT2;
    469     s_key_file2 = NULL;
    470     ctx2 = NULL;
    471 # endif
    472 # ifdef FIONBIO
    473     s_nbio = 0;
    474 # endif
    475     s_nbio_test = 0;
    476     ctx = NULL;
    477     www = 0;
    478 
    479     bio_s_out = NULL;
    480     s_debug = 0;
    481     s_msg = 0;
    482     s_quiet = 0;
    483     s_brief = 0;
    484     hack = 0;
    485     engine_id = NULL;
    486 }
    487 #endif
    488 
    489 static void sv_usage(void)
    490 {
    491     BIO_printf(bio_err, "usage: s_server [args ...]\n");
    492     BIO_printf(bio_err, "\n");
    493     BIO_printf(bio_err,
    494                " -accept arg   - port to accept on (default is %d)\n", PORT);
    495     BIO_printf(bio_err,
    496                " -verify_hostname host - check peer certificate matches \"host\"\n");
    497     BIO_printf(bio_err,
    498                " -verify_email email - check peer certificate matches \"email\"\n");
    499     BIO_printf(bio_err,
    500                " -verify_ip ipaddr - check peer certificate matches \"ipaddr\"\n");
    501     BIO_printf(bio_err, " -context arg  - set session ID context\n");
    502     BIO_printf(bio_err,
    503                " -verify arg   - turn on peer certificate verification\n");
    504     BIO_printf(bio_err,
    505                " -Verify arg   - turn on peer certificate verification, must have a cert.\n");
    506     BIO_printf(bio_err,
    507                " -verify_return_error - return verification errors\n");
    508     BIO_printf(bio_err, " -cert arg     - certificate file to use\n");
    509     BIO_printf(bio_err, "                 (default is %s)\n", TEST_CERT);
    510 #ifndef OPENSSL_NO_TLSEXT
    511     BIO_printf(bio_err,
    512                " -serverinfo arg - PEM serverinfo file for certificate\n");
    513     BIO_printf(bio_err,
    514                " -auth               - send and receive RFC 5878 TLS auth extensions and supplemental data\n");
    515     BIO_printf(bio_err,
    516                " -auth_require_reneg - Do not send TLS auth extensions until renegotiation\n");
    517 #endif
    518     BIO_printf(bio_err,
    519                " -no_resumption_on_reneg - set SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION flag\n");
    520     BIO_printf(bio_err,
    521                " -crl_check    - check the peer certificate has not been revoked by its CA.\n"
    522                "                 The CRL(s) are appended to the certificate file\n");
    523     BIO_printf(bio_err,
    524                " -crl_check_all - check the peer certificate has not been revoked by its CA\n"
    525                "                 or any other CRL in the CA chain. CRL(s) are appened to the\n"
    526                "                 the certificate file.\n");
    527     BIO_printf(bio_err,
    528                " -certform arg - certificate format (PEM or DER) PEM default\n");
    529     BIO_printf(bio_err,
    530                " -key arg      - Private Key file to use, in cert file if\n");
    531     BIO_printf(bio_err, "                 not specified (default is %s)\n",
    532                TEST_CERT);
    533     BIO_printf(bio_err,
    534                " -keyform arg  - key format (PEM, DER or ENGINE) PEM default\n");
    535     BIO_printf(bio_err,
    536                " -pass arg     - private key file pass phrase source\n");
    537     BIO_printf(bio_err,
    538                " -dcert arg    - second certificate file to use (usually for DSA)\n");
    539     BIO_printf(bio_err,
    540                " -dcertform x  - second certificate format (PEM or DER) PEM default\n");
    541     BIO_printf(bio_err,
    542                " -dkey arg     - second private key file to use (usually for DSA)\n");
    543     BIO_printf(bio_err,
    544                " -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
    545     BIO_printf(bio_err,
    546                " -dpass arg    - second private key file pass phrase source\n");
    547     BIO_printf(bio_err,
    548                " -dhparam arg  - DH parameter file to use, in cert file if not specified\n");
    549     BIO_printf(bio_err,
    550                "                 or a default set of parameters is used\n");
    551 #ifndef OPENSSL_NO_ECDH
    552     BIO_printf(bio_err,
    553                " -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n"
    554                "                 Use \"openssl ecparam -list_curves\" for all names\n"
    555                "                 (default is nistp256).\n");
    556 #endif
    557 #ifdef FIONBIO
    558     BIO_printf(bio_err, " -nbio         - Run with non-blocking IO\n");
    559 #endif
    560     BIO_printf(bio_err,
    561                " -nbio_test    - test with the non-blocking test bio\n");
    562     BIO_printf(bio_err,
    563                " -crlf         - convert LF from terminal into CRLF\n");
    564     BIO_printf(bio_err, " -debug        - Print more output\n");
    565     BIO_printf(bio_err, " -msg          - Show protocol messages\n");
    566     BIO_printf(bio_err, " -state        - Print the SSL states\n");
    567     BIO_printf(bio_err, " -CApath arg   - PEM format directory of CA's\n");
    568     BIO_printf(bio_err, " -CAfile arg   - PEM format file of CA's\n");
    569     BIO_printf(bio_err,
    570                " -no_alt_chains - only ever use the first certificate chain found\n");
    571     BIO_printf(bio_err,
    572                " -nocert       - Don't use any certificates (Anon-DH)\n");
    573     BIO_printf(bio_err,
    574                " -cipher arg   - play with 'openssl ciphers' to see what goes here\n");
    575     BIO_printf(bio_err, " -serverpref   - Use server's cipher preferences\n");
    576     BIO_printf(bio_err, " -quiet        - No server output\n");
    577     BIO_printf(bio_err, " -no_tmp_rsa   - Do not generate a tmp RSA key\n");
    578 #ifndef OPENSSL_NO_PSK
    579     BIO_printf(bio_err, " -psk_hint arg - PSK identity hint to use\n");
    580     BIO_printf(bio_err, " -psk arg      - PSK in hex (without 0x)\n");
    581 # ifndef OPENSSL_NO_JPAKE
    582     BIO_printf(bio_err, " -jpake arg    - JPAKE secret to use\n");
    583 # endif
    584 #endif
    585 #ifndef OPENSSL_NO_SRP
    586     BIO_printf(bio_err, " -srpvfile file      - The verifier file for SRP\n");
    587     BIO_printf(bio_err,
    588                " -srpuserseed string - A seed string for a default user salt.\n");
    589 #endif
    590     BIO_printf(bio_err, " -ssl2         - Just talk SSLv2\n");
    591 #ifndef OPENSSL_NO_SSL3_METHOD
    592     BIO_printf(bio_err, " -ssl3         - Just talk SSLv3\n");
    593 #endif
    594     BIO_printf(bio_err, " -tls1_2       - Just talk TLSv1.2\n");
    595     BIO_printf(bio_err, " -tls1_1       - Just talk TLSv1.1\n");
    596     BIO_printf(bio_err, " -tls1         - Just talk TLSv1\n");
    597     BIO_printf(bio_err, " -dtls1        - Just talk DTLSv1\n");
    598     BIO_printf(bio_err, " -dtls1_2      - Just talk DTLSv1.2\n");
    599     BIO_printf(bio_err, " -timeout      - Enable timeouts\n");
    600     BIO_printf(bio_err, " -mtu          - Set link layer MTU\n");
    601     BIO_printf(bio_err, " -chain        - Read a certificate chain\n");
    602     BIO_printf(bio_err, " -no_ssl2      - Just disable SSLv2\n");
    603     BIO_printf(bio_err, " -no_ssl3      - Just disable SSLv3\n");
    604     BIO_printf(bio_err, " -no_tls1      - Just disable TLSv1\n");
    605     BIO_printf(bio_err, " -no_tls1_1    - Just disable TLSv1.1\n");
    606     BIO_printf(bio_err, " -no_tls1_2    - Just disable TLSv1.2\n");
    607 #ifndef OPENSSL_NO_DH
    608     BIO_printf(bio_err, " -no_dhe       - Disable ephemeral DH\n");
    609 #endif
    610 #ifndef OPENSSL_NO_ECDH
    611     BIO_printf(bio_err, " -no_ecdhe     - Disable ephemeral ECDH\n");
    612 #endif
    613     BIO_printf(bio_err, " -bugs         - Turn on SSL bug compatibility\n");
    614     BIO_printf(bio_err,
    615                " -hack         - workaround for early Netscape code\n");
    616     BIO_printf(bio_err,
    617                " -www          - Respond to a 'GET /' with a status page\n");
    618     BIO_printf(bio_err,
    619                " -WWW          - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
    620     BIO_printf(bio_err,
    621                " -HTTP         - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
    622     BIO_printf(bio_err,
    623                "                 with the assumption it contains a complete HTTP response.\n");
    624 #ifndef OPENSSL_NO_ENGINE
    625     BIO_printf(bio_err,
    626                " -engine id    - Initialise and use the specified engine\n");
    627 #endif
    628     BIO_printf(bio_err,
    629                " -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
    630     BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
    631                LIST_SEPARATOR_CHAR);
    632 #ifndef OPENSSL_NO_TLSEXT
    633     BIO_printf(bio_err,
    634                " -servername host - servername for HostName TLS extension\n");
    635     BIO_printf(bio_err,
    636                " -servername_fatal - on mismatch send fatal alert (default warning alert)\n");
    637     BIO_printf(bio_err,
    638                " -cert2 arg    - certificate file to use for servername\n");
    639     BIO_printf(bio_err, "                 (default is %s)\n", TEST_CERT2);
    640     BIO_printf(bio_err,
    641                " -key2 arg     - Private Key file to use for servername, in cert file if\n");
    642     BIO_printf(bio_err, "                 not specified (default is %s)\n",
    643                TEST_CERT2);
    644     BIO_printf(bio_err,
    645                " -tlsextdebug  - hex dump of all TLS extensions received\n");
    646     BIO_printf(bio_err,
    647                " -no_ticket    - disable use of RFC4507bis session tickets\n");
    648     BIO_printf(bio_err,
    649                " -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
    650     BIO_printf(bio_err,
    651                " -sigalgs arg      - Signature algorithms to support (colon-separated list)\n");
    652     BIO_printf(bio_err,
    653                " -client_sigalgs arg  - Signature algorithms to support for client \n");
    654     BIO_printf(bio_err,
    655                "                        certificate authentication (colon-separated list)\n");
    656 # ifndef OPENSSL_NO_NEXTPROTONEG
    657     BIO_printf(bio_err,
    658                " -nextprotoneg arg - set the advertised protocols for the NPN extension (comma-separated list)\n");
    659 # endif
    660 # ifndef OPENSSL_NO_SRTP
    661     BIO_printf(bio_err,
    662                " -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
    663 # endif
    664     BIO_printf(bio_err,
    665                " -alpn arg  - set the advertised protocols for the ALPN extension (comma-separated list)\n");
    666 #endif
    667     BIO_printf(bio_err,
    668                " -keymatexport label   - Export keying material using label\n");
    669     BIO_printf(bio_err,
    670                " -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
    671     BIO_printf(bio_err,
    672                " -status           - respond to certificate status requests\n");
    673     BIO_printf(bio_err,
    674                " -status_verbose   - enable status request verbose printout\n");
    675     BIO_printf(bio_err,
    676                " -status_timeout n - status request responder timeout\n");
    677     BIO_printf(bio_err, " -status_url URL   - status request fallback URL\n");
    678 }
    679 
    680 static int local_argc = 0;
    681 static char **local_argv;
    682 
    683 #ifdef CHARSET_EBCDIC
    684 static int ebcdic_new(BIO *bi);
    685 static int ebcdic_free(BIO *a);
    686 static int ebcdic_read(BIO *b, char *out, int outl);
    687 static int ebcdic_write(BIO *b, const char *in, int inl);
    688 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
    689 static int ebcdic_gets(BIO *bp, char *buf, int size);
    690 static int ebcdic_puts(BIO *bp, const char *str);
    691 
    692 # define BIO_TYPE_EBCDIC_FILTER  (18|0x0200)
    693 static BIO_METHOD methods_ebcdic = {
    694     BIO_TYPE_EBCDIC_FILTER,
    695     "EBCDIC/ASCII filter",
    696     ebcdic_write,
    697     ebcdic_read,
    698     ebcdic_puts,
    699     ebcdic_gets,
    700     ebcdic_ctrl,
    701     ebcdic_new,
    702     ebcdic_free,
    703 };
    704 
    705 typedef struct {
    706     size_t alloced;
    707     char buff[1];
    708 } EBCDIC_OUTBUFF;
    709 
    710 BIO_METHOD *BIO_f_ebcdic_filter()
    711 {
    712     return (&methods_ebcdic);
    713 }
    714 
    715 static int ebcdic_new(BIO *bi)
    716 {
    717     EBCDIC_OUTBUFF *wbuf;
    718 
    719     wbuf = (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
    720     if (!wbuf)
    721         return 0;
    722     wbuf->alloced = 1024;
    723     wbuf->buff[0] = '\0';
    724 
    725     bi->ptr = (char *)wbuf;
    726     bi->init = 1;
    727     bi->flags = 0;
    728     return (1);
    729 }
    730 
    731 static int ebcdic_free(BIO *a)
    732 {
    733     if (a == NULL)
    734         return (0);
    735     if (a->ptr != NULL)
    736         OPENSSL_free(a->ptr);
    737     a->ptr = NULL;
    738     a->init = 0;
    739     a->flags = 0;
    740     return (1);
    741 }
    742 
    743 static int ebcdic_read(BIO *b, char *out, int outl)
    744 {
    745     int ret = 0;
    746 
    747     if (out == NULL || outl == 0)
    748         return (0);
    749     if (b->next_bio == NULL)
    750         return (0);
    751 
    752     ret = BIO_read(b->next_bio, out, outl);
    753     if (ret > 0)
    754         ascii2ebcdic(out, out, ret);
    755     return (ret);
    756 }
    757 
    758 static int ebcdic_write(BIO *b, const char *in, int inl)
    759 {
    760     EBCDIC_OUTBUFF *wbuf;
    761     int ret = 0;
    762     int num;
    763     unsigned char n;
    764 
    765     if ((in == NULL) || (inl <= 0))
    766         return (0);
    767     if (b->next_bio == NULL)
    768         return (0);
    769 
    770     wbuf = (EBCDIC_OUTBUFF *) b->ptr;
    771 
    772     if (inl > (num = wbuf->alloced)) {
    773         num = num + num;        /* double the size */
    774         if (num < inl)
    775             num = inl;
    776         wbuf =
    777             (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
    778         if (!wbuf)
    779             return 0;
    780         OPENSSL_free(b->ptr);
    781 
    782         wbuf->alloced = num;
    783         wbuf->buff[0] = '\0';
    784 
    785         b->ptr = (char *)wbuf;
    786     }
    787 
    788     ebcdic2ascii(wbuf->buff, in, inl);
    789 
    790     ret = BIO_write(b->next_bio, wbuf->buff, inl);
    791 
    792     return (ret);
    793 }
    794 
    795 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
    796 {
    797     long ret;
    798 
    799     if (b->next_bio == NULL)
    800         return (0);
    801     switch (cmd) {
    802     case BIO_CTRL_DUP:
    803         ret = 0L;
    804         break;
    805     default:
    806         ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
    807         break;
    808     }
    809     return (ret);
    810 }
    811 
    812 static int ebcdic_gets(BIO *bp, char *buf, int size)
    813 {
    814     int i, ret = 0;
    815     if (bp->next_bio == NULL)
    816         return (0);
    817 /*      return(BIO_gets(bp->next_bio,buf,size));*/
    818     for (i = 0; i < size - 1; ++i) {
    819         ret = ebcdic_read(bp, &buf[i], 1);
    820         if (ret <= 0)
    821             break;
    822         else if (buf[i] == '\n') {
    823             ++i;
    824             break;
    825         }
    826     }
    827     if (i < size)
    828         buf[i] = '\0';
    829     return (ret < 0 && i == 0) ? ret : i;
    830 }
    831 
    832 static int ebcdic_puts(BIO *bp, const char *str)
    833 {
    834     if (bp->next_bio == NULL)
    835         return (0);
    836     return ebcdic_write(bp, str, strlen(str));
    837 }
    838 #endif
    839 
    840 #ifndef OPENSSL_NO_TLSEXT
    841 
    842 /* This is a context that we pass to callbacks */
    843 typedef struct tlsextctx_st {
    844     char *servername;
    845     BIO *biodebug;
    846     int extension_error;
    847 } tlsextctx;
    848 
    849 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
    850 {
    851     tlsextctx *p = (tlsextctx *) arg;
    852     const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
    853     if (servername && p->biodebug)
    854         BIO_printf(p->biodebug, "Hostname in TLS extension: \"%s\"\n",
    855                    servername);
    856 
    857     if (!p->servername)
    858         return SSL_TLSEXT_ERR_NOACK;
    859 
    860     if (servername) {
    861         if (strcasecmp(servername, p->servername))
    862             return p->extension_error;
    863         if (ctx2) {
    864             BIO_printf(p->biodebug, "Switching server context.\n");
    865             SSL_set_SSL_CTX(s, ctx2);
    866         }
    867     }
    868     return SSL_TLSEXT_ERR_OK;
    869 }
    870 
    871 /* Structure passed to cert status callback */
    872 
    873 typedef struct tlsextstatusctx_st {
    874     /* Default responder to use */
    875     char *host, *path, *port;
    876     int use_ssl;
    877     int timeout;
    878     BIO *err;
    879     int verbose;
    880 } tlsextstatusctx;
    881 
    882 static tlsextstatusctx tlscstatp = { NULL, NULL, NULL, 0, -1, NULL, 0 };
    883 
    884 /*
    885  * Certificate Status callback. This is called when a client includes a
    886  * certificate status request extension. This is a simplified version. It
    887  * examines certificates each time and makes one OCSP responder query for
    888  * each request. A full version would store details such as the OCSP
    889  * certificate IDs and minimise the number of OCSP responses by caching them
    890  * until they were considered "expired".
    891  */
    892 
    893 static int cert_status_cb(SSL *s, void *arg)
    894 {
    895     tlsextstatusctx *srctx = arg;
    896     BIO *err = srctx->err;
    897     char *host, *port, *path;
    898     int use_ssl;
    899     unsigned char *rspder = NULL;
    900     int rspderlen;
    901     STACK_OF(OPENSSL_STRING) *aia = NULL;
    902     X509 *x = NULL;
    903     X509_STORE_CTX inctx;
    904     X509_OBJECT obj;
    905     OCSP_REQUEST *req = NULL;
    906     OCSP_RESPONSE *resp = NULL;
    907     OCSP_CERTID *id = NULL;
    908     STACK_OF(X509_EXTENSION) *exts;
    909     int ret = SSL_TLSEXT_ERR_NOACK;
    910     int i;
    911 # if 0
    912     STACK_OF(OCSP_RESPID) *ids;
    913     SSL_get_tlsext_status_ids(s, &ids);
    914     BIO_printf(err, "cert_status: received %d ids\n",
    915                sk_OCSP_RESPID_num(ids));
    916 # endif
    917     if (srctx->verbose)
    918         BIO_puts(err, "cert_status: callback called\n");
    919     /* Build up OCSP query from server certificate */
    920     x = SSL_get_certificate(s);
    921     aia = X509_get1_ocsp(x);
    922     if (aia) {
    923         if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0),
    924                             &host, &port, &path, &use_ssl)) {
    925             BIO_puts(err, "cert_status: can't parse AIA URL\n");
    926             goto err;
    927         }
    928         if (srctx->verbose)
    929             BIO_printf(err, "cert_status: AIA URL: %s\n",
    930                        sk_OPENSSL_STRING_value(aia, 0));
    931     } else {
    932         if (!srctx->host) {
    933             BIO_puts(srctx->err,
    934                      "cert_status: no AIA and no default responder URL\n");
    935             goto done;
    936         }
    937         host = srctx->host;
    938         path = srctx->path;
    939         port = srctx->port;
    940         use_ssl = srctx->use_ssl;
    941     }
    942 
    943     if (!X509_STORE_CTX_init(&inctx,
    944                              SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)),
    945                              NULL, NULL))
    946         goto err;
    947     if (X509_STORE_get_by_subject(&inctx, X509_LU_X509,
    948                                   X509_get_issuer_name(x), &obj) <= 0) {
    949         BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n");
    950         X509_STORE_CTX_cleanup(&inctx);
    951         goto done;
    952     }
    953     req = OCSP_REQUEST_new();
    954     if (!req)
    955         goto err;
    956     id = OCSP_cert_to_id(NULL, x, obj.data.x509);
    957     X509_free(obj.data.x509);
    958     X509_STORE_CTX_cleanup(&inctx);
    959     if (!id)
    960         goto err;
    961     if (!OCSP_request_add0_id(req, id))
    962         goto err;
    963     id = NULL;
    964     /* Add any extensions to the request */
    965     SSL_get_tlsext_status_exts(s, &exts);
    966     for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
    967         X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
    968         if (!OCSP_REQUEST_add_ext(req, ext, -1))
    969             goto err;
    970     }
    971     resp = process_responder(err, req, host, path, port, use_ssl, NULL,
    972                              srctx->timeout);
    973     if (!resp) {
    974         BIO_puts(err, "cert_status: error querying responder\n");
    975         goto done;
    976     }
    977     rspderlen = i2d_OCSP_RESPONSE(resp, &rspder);
    978     if (rspderlen <= 0)
    979         goto err;
    980     SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen);
    981     if (srctx->verbose) {
    982         BIO_puts(err, "cert_status: ocsp response sent:\n");
    983         OCSP_RESPONSE_print(err, resp, 2);
    984     }
    985     ret = SSL_TLSEXT_ERR_OK;
    986  done:
    987     if (ret != SSL_TLSEXT_ERR_OK)
    988         ERR_print_errors(err);
    989     if (aia) {
    990         OPENSSL_free(host);
    991         OPENSSL_free(path);
    992         OPENSSL_free(port);
    993         X509_email_free(aia);
    994     }
    995     if (id)
    996         OCSP_CERTID_free(id);
    997     if (req)
    998         OCSP_REQUEST_free(req);
    999     if (resp)
   1000         OCSP_RESPONSE_free(resp);
   1001     return ret;
   1002  err:
   1003     ret = SSL_TLSEXT_ERR_ALERT_FATAL;
   1004     goto done;
   1005 }
   1006 
   1007 # ifndef OPENSSL_NO_NEXTPROTONEG
   1008 /* This is the context that we pass to next_proto_cb */
   1009 typedef struct tlsextnextprotoctx_st {
   1010     unsigned char *data;
   1011     unsigned int len;
   1012 } tlsextnextprotoctx;
   1013 
   1014 static int next_proto_cb(SSL *s, const unsigned char **data,
   1015                          unsigned int *len, void *arg)
   1016 {
   1017     tlsextnextprotoctx *next_proto = arg;
   1018 
   1019     *data = next_proto->data;
   1020     *len = next_proto->len;
   1021 
   1022     return SSL_TLSEXT_ERR_OK;
   1023 }
   1024 # endif                         /* ndef OPENSSL_NO_NEXTPROTONEG */
   1025 
   1026 /* This the context that we pass to alpn_cb */
   1027 typedef struct tlsextalpnctx_st {
   1028     unsigned char *data;
   1029     unsigned short len;
   1030 } tlsextalpnctx;
   1031 
   1032 static int alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen,
   1033                    const unsigned char *in, unsigned int inlen, void *arg)
   1034 {
   1035     tlsextalpnctx *alpn_ctx = arg;
   1036 
   1037     if (!s_quiet) {
   1038         /* We can assume that |in| is syntactically valid. */
   1039         unsigned i;
   1040         BIO_printf(bio_s_out, "ALPN protocols advertised by the client: ");
   1041         for (i = 0; i < inlen;) {
   1042             if (i)
   1043                 BIO_write(bio_s_out, ", ", 2);
   1044             BIO_write(bio_s_out, &in[i + 1], in[i]);
   1045             i += in[i] + 1;
   1046         }
   1047         BIO_write(bio_s_out, "\n", 1);
   1048     }
   1049 
   1050     if (SSL_select_next_proto
   1051         ((unsigned char **)out, outlen, alpn_ctx->data, alpn_ctx->len, in,
   1052          inlen) != OPENSSL_NPN_NEGOTIATED) {
   1053         return SSL_TLSEXT_ERR_NOACK;
   1054     }
   1055 
   1056     if (!s_quiet) {
   1057         BIO_printf(bio_s_out, "ALPN protocols selected: ");
   1058         BIO_write(bio_s_out, *out, *outlen);
   1059         BIO_write(bio_s_out, "\n", 1);
   1060     }
   1061 
   1062     return SSL_TLSEXT_ERR_OK;
   1063 }
   1064 #endif                          /* ndef OPENSSL_NO_TLSEXT */
   1065 
   1066 int MAIN(int, char **);
   1067 
   1068 #ifndef OPENSSL_NO_JPAKE
   1069 static char *jpake_secret = NULL;
   1070 # define no_jpake !jpake_secret
   1071 #else
   1072 # define no_jpake 1
   1073 #endif
   1074 #ifndef OPENSSL_NO_SRP
   1075 static srpsrvparm srp_callback_parm;
   1076 #endif
   1077 #ifndef OPENSSL_NO_SRTP
   1078 static char *srtp_profiles = NULL;
   1079 #endif
   1080 
   1081 int MAIN(int argc, char *argv[])
   1082 {
   1083     X509_VERIFY_PARAM *vpm = NULL;
   1084     int badarg = 0;
   1085     short port = PORT;
   1086     char *CApath = NULL, *CAfile = NULL;
   1087     char *chCApath = NULL, *chCAfile = NULL;
   1088     char *vfyCApath = NULL, *vfyCAfile = NULL;
   1089     unsigned char *context = NULL;
   1090     char *dhfile = NULL;
   1091     int badop = 0;
   1092     int ret = 1;
   1093     int build_chain = 0;
   1094     int no_tmp_rsa = 0, no_dhe = 0, no_ecdhe = 0, nocert = 0;
   1095     int state = 0;
   1096     const SSL_METHOD *meth = NULL;
   1097     int socket_type = SOCK_STREAM;
   1098     ENGINE *e = NULL;
   1099     char *inrand = NULL;
   1100     int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
   1101     char *passarg = NULL, *pass = NULL;
   1102     char *dpassarg = NULL, *dpass = NULL;
   1103     int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
   1104     X509 *s_cert = NULL, *s_dcert = NULL;
   1105     STACK_OF(X509) *s_chain = NULL, *s_dchain = NULL;
   1106     EVP_PKEY *s_key = NULL, *s_dkey = NULL;
   1107     int no_cache = 0, ext_cache = 0;
   1108     int rev = 0, naccept = -1;
   1109 #ifndef OPENSSL_NO_TLSEXT
   1110     EVP_PKEY *s_key2 = NULL;
   1111     X509 *s_cert2 = NULL;
   1112     tlsextctx tlsextcbp = { NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING };
   1113 # ifndef OPENSSL_NO_NEXTPROTONEG
   1114     const char *next_proto_neg_in = NULL;
   1115     tlsextnextprotoctx next_proto = { NULL, 0 };
   1116 # endif
   1117     const char *alpn_in = NULL;
   1118     tlsextalpnctx alpn_ctx = { NULL, 0 };
   1119 #endif
   1120 #ifndef OPENSSL_NO_PSK
   1121     /* by default do not send a PSK identity hint */
   1122     static char *psk_identity_hint = NULL;
   1123 #endif
   1124 #ifndef OPENSSL_NO_SRP
   1125     char *srpuserseed = NULL;
   1126     char *srp_verifier_file = NULL;
   1127 #endif
   1128     SSL_EXCERT *exc = NULL;
   1129     SSL_CONF_CTX *cctx = NULL;
   1130     STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
   1131 
   1132     char *crl_file = NULL;
   1133     int crl_format = FORMAT_PEM;
   1134     int crl_download = 0;
   1135     STACK_OF(X509_CRL) *crls = NULL;
   1136     int prot_opt = 0, no_prot_opt = 0;
   1137 
   1138     meth = SSLv23_server_method();
   1139 
   1140     local_argc = argc;
   1141     local_argv = argv;
   1142 
   1143     apps_startup();
   1144 #ifdef MONOLITH
   1145     s_server_init();
   1146 #endif
   1147 
   1148     if (bio_err == NULL)
   1149         bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
   1150 
   1151     if (!load_config(bio_err, NULL))
   1152         goto end;
   1153 
   1154     cctx = SSL_CONF_CTX_new();
   1155     if (!cctx)
   1156         goto end;
   1157     SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SERVER);
   1158     SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
   1159 
   1160     verify_depth = 0;
   1161 #ifdef FIONBIO
   1162     s_nbio = 0;
   1163 #endif
   1164     s_nbio_test = 0;
   1165 
   1166     argc--;
   1167     argv++;
   1168 
   1169     while (argc >= 1) {
   1170         if ((strcmp(*argv, "-port") == 0) || (strcmp(*argv, "-accept") == 0)) {
   1171             if (--argc < 1)
   1172                 goto bad;
   1173             if (!extract_port(*(++argv), &port))
   1174                 goto bad;
   1175         } else if (strcmp(*argv, "-naccept") == 0) {
   1176             if (--argc < 1)
   1177                 goto bad;
   1178             naccept = atol(*(++argv));
   1179             if (naccept <= 0) {
   1180                 BIO_printf(bio_err, "bad accept value %s\n", *argv);
   1181                 goto bad;
   1182             }
   1183         } else if (strcmp(*argv, "-verify") == 0) {
   1184             s_server_verify = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
   1185             if (--argc < 1)
   1186                 goto bad;
   1187             verify_depth = atoi(*(++argv));
   1188             if (!s_quiet)
   1189                 BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
   1190         } else if (strcmp(*argv, "-Verify") == 0) {
   1191             s_server_verify =
   1192                 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT |
   1193                 SSL_VERIFY_CLIENT_ONCE;
   1194             if (--argc < 1)
   1195                 goto bad;
   1196             verify_depth = atoi(*(++argv));
   1197             if (!s_quiet)
   1198                 BIO_printf(bio_err,
   1199                            "verify depth is %d, must return a certificate\n",
   1200                            verify_depth);
   1201         } else if (strcmp(*argv, "-context") == 0) {
   1202             if (--argc < 1)
   1203                 goto bad;
   1204             context = (unsigned char *)*(++argv);
   1205         } else if (strcmp(*argv, "-cert") == 0) {
   1206             if (--argc < 1)
   1207                 goto bad;
   1208             s_cert_file = *(++argv);
   1209         } else if (strcmp(*argv, "-CRL") == 0) {
   1210             if (--argc < 1)
   1211                 goto bad;
   1212             crl_file = *(++argv);
   1213         } else if (strcmp(*argv, "-crl_download") == 0)
   1214             crl_download = 1;
   1215 #ifndef OPENSSL_NO_TLSEXT
   1216         else if (strcmp(*argv, "-serverinfo") == 0) {
   1217             if (--argc < 1)
   1218                 goto bad;
   1219             s_serverinfo_file = *(++argv);
   1220         }
   1221 #endif
   1222         else if (strcmp(*argv, "-certform") == 0) {
   1223             if (--argc < 1)
   1224                 goto bad;
   1225             s_cert_format = str2fmt(*(++argv));
   1226         } else if (strcmp(*argv, "-key") == 0) {
   1227             if (--argc < 1)
   1228                 goto bad;
   1229             s_key_file = *(++argv);
   1230         } else if (strcmp(*argv, "-keyform") == 0) {
   1231             if (--argc < 1)
   1232                 goto bad;
   1233             s_key_format = str2fmt(*(++argv));
   1234         } else if (strcmp(*argv, "-pass") == 0) {
   1235             if (--argc < 1)
   1236                 goto bad;
   1237             passarg = *(++argv);
   1238         } else if (strcmp(*argv, "-cert_chain") == 0) {
   1239             if (--argc < 1)
   1240                 goto bad;
   1241             s_chain_file = *(++argv);
   1242         } else if (strcmp(*argv, "-dhparam") == 0) {
   1243             if (--argc < 1)
   1244                 goto bad;
   1245             dhfile = *(++argv);
   1246         } else if (strcmp(*argv, "-dcertform") == 0) {
   1247             if (--argc < 1)
   1248                 goto bad;
   1249             s_dcert_format = str2fmt(*(++argv));
   1250         } else if (strcmp(*argv, "-dcert") == 0) {
   1251             if (--argc < 1)
   1252                 goto bad;
   1253             s_dcert_file = *(++argv);
   1254         } else if (strcmp(*argv, "-dkeyform") == 0) {
   1255             if (--argc < 1)
   1256                 goto bad;
   1257             s_dkey_format = str2fmt(*(++argv));
   1258         } else if (strcmp(*argv, "-dpass") == 0) {
   1259             if (--argc < 1)
   1260                 goto bad;
   1261             dpassarg = *(++argv);
   1262         } else if (strcmp(*argv, "-dkey") == 0) {
   1263             if (--argc < 1)
   1264                 goto bad;
   1265             s_dkey_file = *(++argv);
   1266         } else if (strcmp(*argv, "-dcert_chain") == 0) {
   1267             if (--argc < 1)
   1268                 goto bad;
   1269             s_dchain_file = *(++argv);
   1270         } else if (strcmp(*argv, "-nocert") == 0) {
   1271             nocert = 1;
   1272         } else if (strcmp(*argv, "-CApath") == 0) {
   1273             if (--argc < 1)
   1274                 goto bad;
   1275             CApath = *(++argv);
   1276         } else if (strcmp(*argv, "-chainCApath") == 0) {
   1277             if (--argc < 1)
   1278                 goto bad;
   1279             chCApath = *(++argv);
   1280         } else if (strcmp(*argv, "-verifyCApath") == 0) {
   1281             if (--argc < 1)
   1282                 goto bad;
   1283             vfyCApath = *(++argv);
   1284         } else if (strcmp(*argv, "-no_cache") == 0)
   1285             no_cache = 1;
   1286         else if (strcmp(*argv, "-ext_cache") == 0)
   1287             ext_cache = 1;
   1288         else if (strcmp(*argv, "-CRLform") == 0) {
   1289             if (--argc < 1)
   1290                 goto bad;
   1291             crl_format = str2fmt(*(++argv));
   1292         } else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm)) {
   1293             if (badarg)
   1294                 goto bad;
   1295             continue;
   1296         } else if (args_excert(&argv, &argc, &badarg, bio_err, &exc)) {
   1297             if (badarg)
   1298                 goto bad;
   1299             continue;
   1300         } else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args,
   1301                             &no_prot_opt)) {
   1302             if (badarg)
   1303                 goto bad;
   1304             continue;
   1305         } else if (strcmp(*argv, "-verify_return_error") == 0)
   1306             verify_return_error = 1;
   1307         else if (strcmp(*argv, "-verify_quiet") == 0)
   1308             verify_quiet = 1;
   1309         else if (strcmp(*argv, "-build_chain") == 0)
   1310             build_chain = 1;
   1311         else if (strcmp(*argv, "-CAfile") == 0) {
   1312             if (--argc < 1)
   1313                 goto bad;
   1314             CAfile = *(++argv);
   1315         } else if (strcmp(*argv, "-chainCAfile") == 0) {
   1316             if (--argc < 1)
   1317                 goto bad;
   1318             chCAfile = *(++argv);
   1319         } else if (strcmp(*argv, "-verifyCAfile") == 0) {
   1320             if (--argc < 1)
   1321                 goto bad;
   1322             vfyCAfile = *(++argv);
   1323         }
   1324 #ifdef FIONBIO
   1325         else if (strcmp(*argv, "-nbio") == 0) {
   1326             s_nbio = 1;
   1327         }
   1328 #endif
   1329         else if (strcmp(*argv, "-nbio_test") == 0) {
   1330 #ifdef FIONBIO
   1331             s_nbio = 1;
   1332 #endif
   1333             s_nbio_test = 1;
   1334         } else if (strcmp(*argv, "-ign_eof") == 0)
   1335             s_ign_eof = 1;
   1336         else if (strcmp(*argv, "-no_ign_eof") == 0)
   1337             s_ign_eof = 0;
   1338         else if (strcmp(*argv, "-debug") == 0) {
   1339             s_debug = 1;
   1340         }
   1341 #ifndef OPENSSL_NO_TLSEXT
   1342         else if (strcmp(*argv, "-tlsextdebug") == 0)
   1343             s_tlsextdebug = 1;
   1344         else if (strcmp(*argv, "-status") == 0)
   1345             s_tlsextstatus = 1;
   1346         else if (strcmp(*argv, "-status_verbose") == 0) {
   1347             s_tlsextstatus = 1;
   1348             tlscstatp.verbose = 1;
   1349         } else if (!strcmp(*argv, "-status_timeout")) {
   1350             s_tlsextstatus = 1;
   1351             if (--argc < 1)
   1352                 goto bad;
   1353             tlscstatp.timeout = atoi(*(++argv));
   1354         } else if (!strcmp(*argv, "-status_url")) {
   1355             s_tlsextstatus = 1;
   1356             if (--argc < 1)
   1357                 goto bad;
   1358             if (!OCSP_parse_url(*(++argv),
   1359                                 &tlscstatp.host,
   1360                                 &tlscstatp.port,
   1361                                 &tlscstatp.path, &tlscstatp.use_ssl)) {
   1362                 BIO_printf(bio_err, "Error parsing URL\n");
   1363                 goto bad;
   1364             }
   1365         }
   1366 #endif
   1367         else if (strcmp(*argv, "-msg") == 0) {
   1368             s_msg = 1;
   1369         } else if (strcmp(*argv, "-msgfile") == 0) {
   1370             if (--argc < 1)
   1371                 goto bad;
   1372             bio_s_msg = BIO_new_file(*(++argv), "w");
   1373         }
   1374 #ifndef OPENSSL_NO_SSL_TRACE
   1375         else if (strcmp(*argv, "-trace") == 0) {
   1376             s_msg = 2;
   1377         }
   1378 #endif
   1379         else if (strcmp(*argv, "-hack") == 0) {
   1380             hack = 1;
   1381         } else if (strcmp(*argv, "-state") == 0) {
   1382             state = 1;
   1383         } else if (strcmp(*argv, "-crlf") == 0) {
   1384             s_crlf = 1;
   1385         } else if (strcmp(*argv, "-quiet") == 0) {
   1386             s_quiet = 1;
   1387         } else if (strcmp(*argv, "-brief") == 0) {
   1388             s_quiet = 1;
   1389             s_brief = 1;
   1390             verify_quiet = 1;
   1391         } else if (strcmp(*argv, "-no_tmp_rsa") == 0) {
   1392             no_tmp_rsa = 1;
   1393         } else if (strcmp(*argv, "-no_dhe") == 0) {
   1394             no_dhe = 1;
   1395         } else if (strcmp(*argv, "-no_ecdhe") == 0) {
   1396             no_ecdhe = 1;
   1397         } else if (strcmp(*argv, "-no_resume_ephemeral") == 0) {
   1398             no_resume_ephemeral = 1;
   1399         }
   1400 #ifndef OPENSSL_NO_PSK
   1401         else if (strcmp(*argv, "-psk_hint") == 0) {
   1402             if (--argc < 1)
   1403                 goto bad;
   1404             psk_identity_hint = *(++argv);
   1405         } else if (strcmp(*argv, "-psk") == 0) {
   1406             size_t i;
   1407 
   1408             if (--argc < 1)
   1409                 goto bad;
   1410             psk_key = *(++argv);
   1411             for (i = 0; i < strlen(psk_key); i++) {
   1412                 if (isxdigit((unsigned char)psk_key[i]))
   1413                     continue;
   1414                 BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
   1415                 goto bad;
   1416             }
   1417         }
   1418 #endif
   1419 #ifndef OPENSSL_NO_SRP
   1420         else if (strcmp(*argv, "-srpvfile") == 0) {
   1421             if (--argc < 1)
   1422                 goto bad;
   1423             srp_verifier_file = *(++argv);
   1424             meth = TLSv1_server_method();
   1425         } else if (strcmp(*argv, "-srpuserseed") == 0) {
   1426             if (--argc < 1)
   1427                 goto bad;
   1428             srpuserseed = *(++argv);
   1429             meth = TLSv1_server_method();
   1430         }
   1431 #endif
   1432         else if (strcmp(*argv, "-rev") == 0) {
   1433             rev = 1;
   1434         } else if (strcmp(*argv, "-www") == 0) {
   1435             www = 1;
   1436         } else if (strcmp(*argv, "-WWW") == 0) {
   1437             www = 2;
   1438         } else if (strcmp(*argv, "-HTTP") == 0) {
   1439             www = 3;
   1440         }
   1441 #ifndef OPENSSL_NO_SSL2
   1442         else if (strcmp(*argv, "-ssl2") == 0) {
   1443             no_ecdhe = 1;
   1444             meth = SSLv2_server_method();
   1445             prot_opt++;
   1446         }
   1447 #endif
   1448 #ifndef OPENSSL_NO_SSL3_METHOD
   1449         else if (strcmp(*argv, "-ssl3") == 0) {
   1450             meth = SSLv3_server_method();
   1451             prot_opt++;
   1452         }
   1453 #endif
   1454 #ifndef OPENSSL_NO_TLS1
   1455         else if (strcmp(*argv, "-tls1") == 0) {
   1456             meth = TLSv1_server_method();
   1457             prot_opt++;
   1458         } else if (strcmp(*argv, "-tls1_1") == 0) {
   1459             meth = TLSv1_1_server_method();
   1460             prot_opt++;
   1461         } else if (strcmp(*argv, "-tls1_2") == 0) {
   1462             meth = TLSv1_2_server_method();
   1463             prot_opt++;
   1464         }
   1465 #endif
   1466 #ifndef OPENSSL_NO_DTLS1
   1467         else if (strcmp(*argv, "-dtls") == 0) {
   1468             meth = DTLS_server_method();
   1469             socket_type = SOCK_DGRAM;
   1470             prot_opt++;
   1471         } else if (strcmp(*argv, "-dtls1") == 0) {
   1472             meth = DTLSv1_server_method();
   1473             socket_type = SOCK_DGRAM;
   1474             prot_opt++;
   1475         } else if (strcmp(*argv, "-dtls1_2") == 0) {
   1476             meth = DTLSv1_2_server_method();
   1477             socket_type = SOCK_DGRAM;
   1478             prot_opt++;
   1479         } else if (strcmp(*argv, "-timeout") == 0)
   1480             enable_timeouts = 1;
   1481         else if (strcmp(*argv, "-mtu") == 0) {
   1482             if (--argc < 1)
   1483                 goto bad;
   1484             socket_mtu = atol(*(++argv));
   1485         } else if (strcmp(*argv, "-chain") == 0)
   1486             cert_chain = 1;
   1487 #endif
   1488         else if (strcmp(*argv, "-id_prefix") == 0) {
   1489             if (--argc < 1)
   1490                 goto bad;
   1491             session_id_prefix = *(++argv);
   1492         }
   1493 #ifndef OPENSSL_NO_ENGINE
   1494         else if (strcmp(*argv, "-engine") == 0) {
   1495             if (--argc < 1)
   1496                 goto bad;
   1497             engine_id = *(++argv);
   1498         }
   1499 #endif
   1500         else if (strcmp(*argv, "-rand") == 0) {
   1501             if (--argc < 1)
   1502                 goto bad;
   1503             inrand = *(++argv);
   1504         }
   1505 #ifndef OPENSSL_NO_TLSEXT
   1506         else if (strcmp(*argv, "-servername") == 0) {
   1507             if (--argc < 1)
   1508                 goto bad;
   1509             tlsextcbp.servername = *(++argv);
   1510         } else if (strcmp(*argv, "-servername_fatal") == 0) {
   1511             tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL;
   1512         } else if (strcmp(*argv, "-cert2") == 0) {
   1513             if (--argc < 1)
   1514                 goto bad;
   1515             s_cert_file2 = *(++argv);
   1516         } else if (strcmp(*argv, "-key2") == 0) {
   1517             if (--argc < 1)
   1518                 goto bad;
   1519             s_key_file2 = *(++argv);
   1520         }
   1521 # ifndef OPENSSL_NO_NEXTPROTONEG
   1522         else if (strcmp(*argv, "-nextprotoneg") == 0) {
   1523             if (--argc < 1)
   1524                 goto bad;
   1525             next_proto_neg_in = *(++argv);
   1526         }
   1527 # endif
   1528         else if (strcmp(*argv, "-alpn") == 0) {
   1529             if (--argc < 1)
   1530                 goto bad;
   1531             alpn_in = *(++argv);
   1532         }
   1533 #endif
   1534 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
   1535         else if (strcmp(*argv, "-jpake") == 0) {
   1536             if (--argc < 1)
   1537                 goto bad;
   1538             jpake_secret = *(++argv);
   1539         }
   1540 #endif
   1541 #ifndef OPENSSL_NO_SRTP
   1542         else if (strcmp(*argv, "-use_srtp") == 0) {
   1543             if (--argc < 1)
   1544                 goto bad;
   1545             srtp_profiles = *(++argv);
   1546         }
   1547 #endif
   1548         else if (strcmp(*argv, "-keymatexport") == 0) {
   1549             if (--argc < 1)
   1550                 goto bad;
   1551             keymatexportlabel = *(++argv);
   1552         } else if (strcmp(*argv, "-keymatexportlen") == 0) {
   1553             if (--argc < 1)
   1554                 goto bad;
   1555             keymatexportlen = atoi(*(++argv));
   1556             if (keymatexportlen == 0)
   1557                 goto bad;
   1558         } else {
   1559             BIO_printf(bio_err, "unknown option %s\n", *argv);
   1560             badop = 1;
   1561             break;
   1562         }
   1563         argc--;
   1564         argv++;
   1565     }
   1566     if (badop) {
   1567  bad:
   1568         sv_usage();
   1569         goto end;
   1570     }
   1571 #ifndef OPENSSL_NO_DTLS1
   1572     if (www && socket_type == SOCK_DGRAM) {
   1573         BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n");
   1574         goto end;
   1575     }
   1576 #endif
   1577 
   1578 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
   1579     if (jpake_secret) {
   1580         if (psk_key) {
   1581             BIO_printf(bio_err, "Can't use JPAKE and PSK together\n");
   1582             goto end;
   1583         }
   1584         psk_identity = "JPAKE";
   1585     }
   1586 #endif
   1587 
   1588     if (prot_opt > 1) {
   1589         BIO_printf(bio_err, "Cannot supply multiple protocol flags\n");
   1590         goto end;
   1591     }
   1592 
   1593     if (prot_opt == 1 && no_prot_opt) {
   1594         BIO_printf(bio_err, "Cannot supply both a protocol flag and "
   1595                             "\"-no_<prot>\"\n");
   1596         goto end;
   1597     }
   1598 
   1599     SSL_load_error_strings();
   1600     OpenSSL_add_ssl_algorithms();
   1601 
   1602     e = setup_engine(bio_err, engine_id, 1);
   1603 
   1604     if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass)) {
   1605         BIO_printf(bio_err, "Error getting password\n");
   1606         goto end;
   1607     }
   1608 
   1609     if (s_key_file == NULL)
   1610         s_key_file = s_cert_file;
   1611 #ifndef OPENSSL_NO_TLSEXT
   1612     if (s_key_file2 == NULL)
   1613         s_key_file2 = s_cert_file2;
   1614 #endif
   1615 
   1616     if (!load_excert(&exc, bio_err))
   1617         goto end;
   1618 
   1619     if (nocert == 0) {
   1620         s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
   1621                          "server certificate private key file");
   1622         if (!s_key) {
   1623             ERR_print_errors(bio_err);
   1624             goto end;
   1625         }
   1626 
   1627         s_cert = load_cert(bio_err, s_cert_file, s_cert_format,
   1628                            NULL, e, "server certificate file");
   1629 
   1630         if (!s_cert) {
   1631             ERR_print_errors(bio_err);
   1632             goto end;
   1633         }
   1634         if (s_chain_file) {
   1635             s_chain = load_certs(bio_err, s_chain_file, FORMAT_PEM,
   1636                                  NULL, e, "server certificate chain");
   1637             if (!s_chain)
   1638                 goto end;
   1639         }
   1640 #ifndef OPENSSL_NO_TLSEXT
   1641         if (tlsextcbp.servername) {
   1642             s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
   1643                               "second server certificate private key file");
   1644             if (!s_key2) {
   1645                 ERR_print_errors(bio_err);
   1646                 goto end;
   1647             }
   1648 
   1649             s_cert2 = load_cert(bio_err, s_cert_file2, s_cert_format,
   1650                                 NULL, e, "second server certificate file");
   1651 
   1652             if (!s_cert2) {
   1653                 ERR_print_errors(bio_err);
   1654                 goto end;
   1655             }
   1656         }
   1657 #endif                          /* OPENSSL_NO_TLSEXT */
   1658     }
   1659 #if !defined(OPENSSL_NO_TLSEXT)
   1660 # if !defined(OPENSSL_NO_NEXTPROTONEG)
   1661     if (next_proto_neg_in) {
   1662         unsigned short len;
   1663         next_proto.data = next_protos_parse(&len, next_proto_neg_in);
   1664         if (next_proto.data == NULL)
   1665             goto end;
   1666         next_proto.len = len;
   1667     } else {
   1668         next_proto.data = NULL;
   1669     }
   1670 # endif
   1671     alpn_ctx.data = NULL;
   1672     if (alpn_in) {
   1673         unsigned short len;
   1674         alpn_ctx.data = next_protos_parse(&len, alpn_in);
   1675         if (alpn_ctx.data == NULL)
   1676             goto end;
   1677         alpn_ctx.len = len;
   1678     }
   1679 #endif
   1680 
   1681     if (crl_file) {
   1682         X509_CRL *crl;
   1683         crl = load_crl(crl_file, crl_format);
   1684         if (!crl) {
   1685             BIO_puts(bio_err, "Error loading CRL\n");
   1686             ERR_print_errors(bio_err);
   1687             goto end;
   1688         }
   1689         crls = sk_X509_CRL_new_null();
   1690         if (!crls || !sk_X509_CRL_push(crls, crl)) {
   1691             BIO_puts(bio_err, "Error adding CRL\n");
   1692             ERR_print_errors(bio_err);
   1693             X509_CRL_free(crl);
   1694             goto end;
   1695         }
   1696     }
   1697 
   1698     if (s_dcert_file) {
   1699 
   1700         if (s_dkey_file == NULL)
   1701             s_dkey_file = s_dcert_file;
   1702 
   1703         s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
   1704                           0, dpass, e, "second certificate private key file");
   1705         if (!s_dkey) {
   1706             ERR_print_errors(bio_err);
   1707             goto end;
   1708         }
   1709 
   1710         s_dcert = load_cert(bio_err, s_dcert_file, s_dcert_format,
   1711                             NULL, e, "second server certificate file");
   1712 
   1713         if (!s_dcert) {
   1714             ERR_print_errors(bio_err);
   1715             goto end;
   1716         }
   1717         if (s_dchain_file) {
   1718             s_dchain = load_certs(bio_err, s_dchain_file, FORMAT_PEM,
   1719                                   NULL, e, "second server certificate chain");
   1720             if (!s_dchain)
   1721                 goto end;
   1722         }
   1723 
   1724     }
   1725 
   1726     if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
   1727         && !RAND_status()) {
   1728         BIO_printf(bio_err,
   1729                    "warning, not much extra random data, consider using the -rand option\n");
   1730     }
   1731     if (inrand != NULL)
   1732         BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
   1733                    app_RAND_load_files(inrand));
   1734 
   1735     if (bio_s_out == NULL) {
   1736         if (s_quiet && !s_debug) {
   1737             bio_s_out = BIO_new(BIO_s_null());
   1738             if (s_msg && !bio_s_msg)
   1739                 bio_s_msg = BIO_new_fp(stdout, BIO_NOCLOSE);
   1740         } else {
   1741             if (bio_s_out == NULL)
   1742                 bio_s_out = BIO_new_fp(stdout, BIO_NOCLOSE);
   1743         }
   1744     }
   1745 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
   1746     if (nocert)
   1747 #endif
   1748     {
   1749         s_cert_file = NULL;
   1750         s_key_file = NULL;
   1751         s_dcert_file = NULL;
   1752         s_dkey_file = NULL;
   1753 #ifndef OPENSSL_NO_TLSEXT
   1754         s_cert_file2 = NULL;
   1755         s_key_file2 = NULL;
   1756 #endif
   1757     }
   1758 
   1759     ctx = SSL_CTX_new(meth);
   1760     if (ctx == NULL) {
   1761         ERR_print_errors(bio_err);
   1762         goto end;
   1763     }
   1764     if (session_id_prefix) {
   1765         if (strlen(session_id_prefix) >= 32)
   1766             BIO_printf(bio_err,
   1767                        "warning: id_prefix is too long, only one new session will be possible\n");
   1768         else if (strlen(session_id_prefix) >= 16)
   1769             BIO_printf(bio_err,
   1770                        "warning: id_prefix is too long if you use SSLv2\n");
   1771         if (!SSL_CTX_set_generate_session_id(ctx, generate_session_id)) {
   1772             BIO_printf(bio_err, "error setting 'id_prefix'\n");
   1773             ERR_print_errors(bio_err);
   1774             goto end;
   1775         }
   1776         BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
   1777     }
   1778     SSL_CTX_set_quiet_shutdown(ctx, 1);
   1779     if (hack)
   1780         SSL_CTX_set_options(ctx, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
   1781     if (exc)
   1782         ssl_ctx_set_excert(ctx, exc);
   1783 
   1784     if (state)
   1785         SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
   1786     if (no_cache)
   1787         SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
   1788     else if (ext_cache)
   1789         init_session_cache_ctx(ctx);
   1790     else
   1791         SSL_CTX_sess_set_cache_size(ctx, 128);
   1792 
   1793 #ifndef OPENSSL_NO_SRTP
   1794     if (srtp_profiles != NULL)
   1795         SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
   1796 #endif
   1797 
   1798 #if 0
   1799     if (cipher == NULL)
   1800         cipher = getenv("SSL_CIPHER");
   1801 #endif
   1802 
   1803 #if 0
   1804     if (s_cert_file == NULL) {
   1805         BIO_printf(bio_err,
   1806                    "You must specify a certificate file for the server to use\n");
   1807         goto end;
   1808     }
   1809 #endif
   1810 
   1811     if ((!SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) ||
   1812         (!SSL_CTX_set_default_verify_paths(ctx))) {
   1813         /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
   1814         ERR_print_errors(bio_err);
   1815         /* goto end; */
   1816     }
   1817     if (vpm)
   1818         SSL_CTX_set1_param(ctx, vpm);
   1819 
   1820     ssl_ctx_add_crls(ctx, crls, 0);
   1821 
   1822     if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
   1823         goto end;
   1824 
   1825     if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
   1826                          crls, crl_download)) {
   1827         BIO_printf(bio_err, "Error loading store locations\n");
   1828         ERR_print_errors(bio_err);
   1829         goto end;
   1830     }
   1831 #ifndef OPENSSL_NO_TLSEXT
   1832     if (s_cert2) {
   1833         ctx2 = SSL_CTX_new(meth);
   1834         if (ctx2 == NULL) {
   1835             ERR_print_errors(bio_err);
   1836             goto end;
   1837         }
   1838     }
   1839 
   1840     if (ctx2) {
   1841         BIO_printf(bio_s_out, "Setting secondary ctx parameters\n");
   1842 
   1843         if (session_id_prefix) {
   1844             if (strlen(session_id_prefix) >= 32)
   1845                 BIO_printf(bio_err,
   1846                            "warning: id_prefix is too long, only one new session will be possible\n");
   1847             else if (strlen(session_id_prefix) >= 16)
   1848                 BIO_printf(bio_err,
   1849                            "warning: id_prefix is too long if you use SSLv2\n");
   1850             if (!SSL_CTX_set_generate_session_id(ctx2, generate_session_id)) {
   1851                 BIO_printf(bio_err, "error setting 'id_prefix'\n");
   1852                 ERR_print_errors(bio_err);
   1853                 goto end;
   1854             }
   1855             BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
   1856         }
   1857         SSL_CTX_set_quiet_shutdown(ctx2, 1);
   1858         if (hack)
   1859             SSL_CTX_set_options(ctx2, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
   1860         if (exc)
   1861             ssl_ctx_set_excert(ctx2, exc);
   1862 
   1863         if (state)
   1864             SSL_CTX_set_info_callback(ctx2, apps_ssl_info_callback);
   1865 
   1866         if (no_cache)
   1867             SSL_CTX_set_session_cache_mode(ctx2, SSL_SESS_CACHE_OFF);
   1868         else if (ext_cache)
   1869             init_session_cache_ctx(ctx2);
   1870         else
   1871             SSL_CTX_sess_set_cache_size(ctx2, 128);
   1872 
   1873         if ((!SSL_CTX_load_verify_locations(ctx2, CAfile, CApath)) ||
   1874             (!SSL_CTX_set_default_verify_paths(ctx2))) {
   1875             ERR_print_errors(bio_err);
   1876         }
   1877         if (vpm)
   1878             SSL_CTX_set1_param(ctx2, vpm);
   1879 
   1880         ssl_ctx_add_crls(ctx2, crls, 0);
   1881 
   1882         if (!args_ssl_call(ctx2, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
   1883             goto end;
   1884 
   1885     }
   1886 # ifndef OPENSSL_NO_NEXTPROTONEG
   1887     if (next_proto.data)
   1888         SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb,
   1889                                               &next_proto);
   1890 # endif
   1891     if (alpn_ctx.data)
   1892         SSL_CTX_set_alpn_select_cb(ctx, alpn_cb, &alpn_ctx);
   1893 #endif
   1894 
   1895 #ifndef OPENSSL_NO_DH
   1896     if (!no_dhe) {
   1897         DH *dh = NULL;
   1898 
   1899         if (dhfile)
   1900             dh = load_dh_param(dhfile);
   1901         else if (s_cert_file)
   1902             dh = load_dh_param(s_cert_file);
   1903 
   1904         if (dh != NULL) {
   1905             BIO_printf(bio_s_out, "Setting temp DH parameters\n");
   1906         } else {
   1907             BIO_printf(bio_s_out, "Using default temp DH parameters\n");
   1908             dh = get_dh2048();
   1909             if (dh == NULL) {
   1910                 ERR_print_errors(bio_err);
   1911                 goto end;
   1912             }
   1913         }
   1914         (void)BIO_flush(bio_s_out);
   1915 
   1916         SSL_CTX_set_tmp_dh(ctx, dh);
   1917 # ifndef OPENSSL_NO_TLSEXT
   1918         if (ctx2) {
   1919             if (!dhfile) {
   1920                 DH *dh2 = load_dh_param(s_cert_file2);
   1921                 if (dh2 != NULL) {
   1922                     BIO_printf(bio_s_out, "Setting temp DH parameters\n");
   1923                     (void)BIO_flush(bio_s_out);
   1924 
   1925                     DH_free(dh);
   1926                     dh = dh2;
   1927                 }
   1928             }
   1929             SSL_CTX_set_tmp_dh(ctx2, dh);
   1930         }
   1931 # endif
   1932         DH_free(dh);
   1933     }
   1934 #endif
   1935 
   1936     if (!set_cert_key_stuff(ctx, s_cert, s_key, s_chain, build_chain))
   1937         goto end;
   1938 #ifndef OPENSSL_NO_TLSEXT
   1939     if (s_serverinfo_file != NULL
   1940         && !SSL_CTX_use_serverinfo_file(ctx, s_serverinfo_file)) {
   1941         ERR_print_errors(bio_err);
   1942         goto end;
   1943     }
   1944 #endif
   1945 #ifndef OPENSSL_NO_TLSEXT
   1946     if (ctx2 && !set_cert_key_stuff(ctx2, s_cert2, s_key2, NULL, build_chain))
   1947         goto end;
   1948 #endif
   1949     if (s_dcert != NULL) {
   1950         if (!set_cert_key_stuff(ctx, s_dcert, s_dkey, s_dchain, build_chain))
   1951             goto end;
   1952     }
   1953 #ifndef OPENSSL_NO_RSA
   1954 # if 1
   1955     if (!no_tmp_rsa) {
   1956         SSL_CTX_set_tmp_rsa_callback(ctx, tmp_rsa_cb);
   1957 #  ifndef OPENSSL_NO_TLSEXT
   1958         if (ctx2)
   1959             SSL_CTX_set_tmp_rsa_callback(ctx2, tmp_rsa_cb);
   1960 #  endif
   1961     }
   1962 # else
   1963     if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx)) {
   1964         RSA *rsa;
   1965 
   1966         BIO_printf(bio_s_out, "Generating temp (512 bit) RSA key...");
   1967         BIO_flush(bio_s_out);
   1968 
   1969         rsa = RSA_generate_key(512, RSA_F4, NULL);
   1970 
   1971         if (!SSL_CTX_set_tmp_rsa(ctx, rsa)) {
   1972             ERR_print_errors(bio_err);
   1973             goto end;
   1974         }
   1975 #  ifndef OPENSSL_NO_TLSEXT
   1976         if (ctx2) {
   1977             if (!SSL_CTX_set_tmp_rsa(ctx2, rsa)) {
   1978                 ERR_print_errors(bio_err);
   1979                 goto end;
   1980             }
   1981         }
   1982 #  endif
   1983         RSA_free(rsa);
   1984         BIO_printf(bio_s_out, "\n");
   1985     }
   1986 # endif
   1987 #endif
   1988 
   1989 #ifndef OPENSSL_NO_PSK
   1990 # ifdef OPENSSL_NO_JPAKE
   1991     if (psk_key != NULL)
   1992 # else
   1993     if (psk_key != NULL || jpake_secret)
   1994 # endif
   1995     {
   1996         if (s_debug)
   1997             BIO_printf(bio_s_out,
   1998                        "PSK key given or JPAKE in use, setting server callback\n");
   1999         SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
   2000     }
   2001 
   2002     if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint)) {
   2003         BIO_printf(bio_err, "error setting PSK identity hint to context\n");
   2004         ERR_print_errors(bio_err);
   2005         goto end;
   2006     }
   2007 #endif
   2008 
   2009     SSL_CTX_set_verify(ctx, s_server_verify, verify_callback);
   2010     SSL_CTX_set_session_id_context(ctx, (void *)&s_server_session_id_context,
   2011                                    sizeof s_server_session_id_context);
   2012 
   2013     /* Set DTLS cookie generation and verification callbacks */
   2014     SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback);
   2015     SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback);
   2016 
   2017 #ifndef OPENSSL_NO_TLSEXT
   2018     if (ctx2) {
   2019         SSL_CTX_set_verify(ctx2, s_server_verify, verify_callback);
   2020         SSL_CTX_set_session_id_context(ctx2,
   2021                                        (void *)&s_server_session_id_context,
   2022                                        sizeof s_server_session_id_context);
   2023 
   2024         tlsextcbp.biodebug = bio_s_out;
   2025         SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
   2026         SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
   2027         SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
   2028         SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
   2029     }
   2030 #endif
   2031 
   2032 #ifndef OPENSSL_NO_SRP
   2033     if (srp_verifier_file != NULL) {
   2034         srp_callback_parm.vb = SRP_VBASE_new(srpuserseed);
   2035         srp_callback_parm.user = NULL;
   2036         srp_callback_parm.login = NULL;
   2037         if ((ret =
   2038              SRP_VBASE_init(srp_callback_parm.vb,
   2039                             srp_verifier_file)) != SRP_NO_ERROR) {
   2040             BIO_printf(bio_err,
   2041                        "Cannot initialize SRP verifier file \"%s\":ret=%d\n",
   2042                        srp_verifier_file, ret);
   2043             goto end;
   2044         }
   2045         SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, verify_callback);
   2046         SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm);
   2047         SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb);
   2048     } else
   2049 #endif
   2050     if (CAfile != NULL) {
   2051         SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile));
   2052 #ifndef OPENSSL_NO_TLSEXT
   2053         if (ctx2)
   2054             SSL_CTX_set_client_CA_list(ctx2, SSL_load_client_CA_file(CAfile));
   2055 #endif
   2056     }
   2057 
   2058     BIO_printf(bio_s_out, "ACCEPT\n");
   2059     (void)BIO_flush(bio_s_out);
   2060     if (rev)
   2061         do_server(port, socket_type, &accept_socket, rev_body, context,
   2062                   naccept);
   2063     else if (www)
   2064         do_server(port, socket_type, &accept_socket, www_body, context,
   2065                   naccept);
   2066     else
   2067         do_server(port, socket_type, &accept_socket, sv_body, context,
   2068                   naccept);
   2069     print_stats(bio_s_out, ctx);
   2070     ret = 0;
   2071  end:
   2072     if (ctx != NULL)
   2073         SSL_CTX_free(ctx);
   2074     if (s_cert)
   2075         X509_free(s_cert);
   2076     if (crls)
   2077         sk_X509_CRL_pop_free(crls, X509_CRL_free);
   2078     if (s_dcert)
   2079         X509_free(s_dcert);
   2080     if (s_key)
   2081         EVP_PKEY_free(s_key);
   2082     if (s_dkey)
   2083         EVP_PKEY_free(s_dkey);
   2084     if (s_chain)
   2085         sk_X509_pop_free(s_chain, X509_free);
   2086     if (s_dchain)
   2087         sk_X509_pop_free(s_dchain, X509_free);
   2088     if (pass)
   2089         OPENSSL_free(pass);
   2090     if (dpass)
   2091         OPENSSL_free(dpass);
   2092     if (vpm)
   2093         X509_VERIFY_PARAM_free(vpm);
   2094     free_sessions();
   2095 #ifndef OPENSSL_NO_TLSEXT
   2096     if (tlscstatp.host)
   2097         OPENSSL_free(tlscstatp.host);
   2098     if (tlscstatp.port)
   2099         OPENSSL_free(tlscstatp.port);
   2100     if (tlscstatp.path)
   2101         OPENSSL_free(tlscstatp.path);
   2102     if (ctx2 != NULL)
   2103         SSL_CTX_free(ctx2);
   2104     if (s_cert2)
   2105         X509_free(s_cert2);
   2106     if (s_key2)
   2107         EVP_PKEY_free(s_key2);
   2108     if (serverinfo_in != NULL)
   2109         BIO_free(serverinfo_in);
   2110 # ifndef OPENSSL_NO_NEXTPROTONEG
   2111     if (next_proto.data)
   2112         OPENSSL_free(next_proto.data);
   2113 # endif
   2114     if (alpn_ctx.data)
   2115         OPENSSL_free(alpn_ctx.data);
   2116 #endif
   2117     ssl_excert_free(exc);
   2118     if (ssl_args)
   2119         sk_OPENSSL_STRING_free(ssl_args);
   2120     if (cctx)
   2121         SSL_CONF_CTX_free(cctx);
   2122 #ifndef OPENSSL_NO_JPAKE
   2123     if (jpake_secret && psk_key)
   2124         OPENSSL_free(psk_key);
   2125 #endif
   2126     release_engine(e);
   2127     if (bio_s_out != NULL) {
   2128         BIO_free(bio_s_out);
   2129         bio_s_out = NULL;
   2130     }
   2131     if (bio_s_msg != NULL) {
   2132         BIO_free(bio_s_msg);
   2133         bio_s_msg = NULL;
   2134     }
   2135     apps_shutdown();
   2136     OPENSSL_EXIT(ret);
   2137 }
   2138 
   2139 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
   2140 {
   2141     BIO_printf(bio, "%4ld items in the session cache\n",
   2142                SSL_CTX_sess_number(ssl_ctx));
   2143     BIO_printf(bio, "%4ld client connects (SSL_connect())\n",
   2144                SSL_CTX_sess_connect(ssl_ctx));
   2145     BIO_printf(bio, "%4ld client renegotiates (SSL_connect())\n",
   2146                SSL_CTX_sess_connect_renegotiate(ssl_ctx));
   2147     BIO_printf(bio, "%4ld client connects that finished\n",
   2148                SSL_CTX_sess_connect_good(ssl_ctx));
   2149     BIO_printf(bio, "%4ld server accepts (SSL_accept())\n",
   2150                SSL_CTX_sess_accept(ssl_ctx));
   2151     BIO_printf(bio, "%4ld server renegotiates (SSL_accept())\n",
   2152                SSL_CTX_sess_accept_renegotiate(ssl_ctx));
   2153     BIO_printf(bio, "%4ld server accepts that finished\n",
   2154                SSL_CTX_sess_accept_good(ssl_ctx));
   2155     BIO_printf(bio, "%4ld session cache hits\n", SSL_CTX_sess_hits(ssl_ctx));
   2156     BIO_printf(bio, "%4ld session cache misses\n",
   2157                SSL_CTX_sess_misses(ssl_ctx));
   2158     BIO_printf(bio, "%4ld session cache timeouts\n",
   2159                SSL_CTX_sess_timeouts(ssl_ctx));
   2160     BIO_printf(bio, "%4ld callback cache hits\n",
   2161                SSL_CTX_sess_cb_hits(ssl_ctx));
   2162     BIO_printf(bio, "%4ld cache full overflows (%ld allowed)\n",
   2163                SSL_CTX_sess_cache_full(ssl_ctx),
   2164                SSL_CTX_sess_get_cache_size(ssl_ctx));
   2165 }
   2166 
   2167 static int sv_body(char *hostname, int s, int stype, unsigned char *context)
   2168 {
   2169     char *buf = NULL;
   2170     fd_set readfds;
   2171     int ret = 1, width;
   2172     int k, i, fdin;
   2173     unsigned long l;
   2174     SSL *con = NULL;
   2175     BIO *sbio;
   2176 #ifndef OPENSSL_NO_KRB5
   2177     KSSL_CTX *kctx;
   2178 #endif
   2179     struct timeval timeout;
   2180 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
   2181     struct timeval tv;
   2182 #else
   2183     struct timeval *timeoutp;
   2184 #endif
   2185 
   2186     if ((buf = OPENSSL_malloc(bufsize)) == NULL) {
   2187         BIO_printf(bio_err, "out of memory\n");
   2188         goto err;
   2189     }
   2190 #ifdef FIONBIO
   2191     if (s_nbio) {
   2192         unsigned long sl = 1;
   2193 
   2194         if (!s_quiet)
   2195             BIO_printf(bio_err, "turning on non blocking io\n");
   2196         if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
   2197             ERR_print_errors(bio_err);
   2198     }
   2199 #endif
   2200 
   2201     if (con == NULL) {
   2202         con = SSL_new(ctx);
   2203 #ifndef OPENSSL_NO_TLSEXT
   2204         if (s_tlsextdebug) {
   2205             SSL_set_tlsext_debug_callback(con, tlsext_cb);
   2206             SSL_set_tlsext_debug_arg(con, bio_s_out);
   2207         }
   2208         if (s_tlsextstatus) {
   2209             SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb);
   2210             tlscstatp.err = bio_err;
   2211             SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp);
   2212         }
   2213 #endif
   2214 #ifndef OPENSSL_NO_KRB5
   2215         if ((kctx = kssl_ctx_new()) != NULL) {
   2216             SSL_set0_kssl_ctx(con, kctx);
   2217             kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
   2218             kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
   2219         }
   2220 #endif                          /* OPENSSL_NO_KRB5 */
   2221         if (context)
   2222             SSL_set_session_id_context(con, context, strlen((char *)context));
   2223     }
   2224     SSL_clear(con);
   2225 #if 0
   2226 # ifdef TLSEXT_TYPE_opaque_prf_input
   2227     SSL_set_tlsext_opaque_prf_input(con, "Test server", 11);
   2228 # endif
   2229 #endif
   2230 
   2231     if (stype == SOCK_DGRAM) {
   2232 
   2233         sbio = BIO_new_dgram(s, BIO_NOCLOSE);
   2234 
   2235         if (enable_timeouts) {
   2236             timeout.tv_sec = 0;
   2237             timeout.tv_usec = DGRAM_RCV_TIMEOUT;
   2238             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
   2239 
   2240             timeout.tv_sec = 0;
   2241             timeout.tv_usec = DGRAM_SND_TIMEOUT;
   2242             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
   2243         }
   2244 
   2245         if (socket_mtu) {
   2246             if (socket_mtu < DTLS_get_link_min_mtu(con)) {
   2247                 BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
   2248                            DTLS_get_link_min_mtu(con));
   2249                 ret = -1;
   2250                 BIO_free(sbio);
   2251                 goto err;
   2252             }
   2253             SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
   2254             if (!DTLS_set_link_mtu(con, socket_mtu)) {
   2255                 BIO_printf(bio_err, "Failed to set MTU\n");
   2256                 ret = -1;
   2257                 BIO_free(sbio);
   2258                 goto err;
   2259             }
   2260         } else
   2261             /* want to do MTU discovery */
   2262             BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
   2263 
   2264         /* turn on cookie exchange */
   2265         SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
   2266     } else
   2267         sbio = BIO_new_socket(s, BIO_NOCLOSE);
   2268 
   2269     if (s_nbio_test) {
   2270         BIO *test;
   2271 
   2272         test = BIO_new(BIO_f_nbio_test());
   2273         sbio = BIO_push(test, sbio);
   2274     }
   2275 #ifndef OPENSSL_NO_JPAKE
   2276     if (jpake_secret)
   2277         jpake_server_auth(bio_s_out, sbio, jpake_secret);
   2278 #endif
   2279 
   2280     SSL_set_bio(con, sbio, sbio);
   2281     SSL_set_accept_state(con);
   2282     /* SSL_set_fd(con,s); */
   2283 
   2284     if (s_debug) {
   2285         SSL_set_debug(con, 1);
   2286         BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
   2287         BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
   2288     }
   2289     if (s_msg) {
   2290 #ifndef OPENSSL_NO_SSL_TRACE
   2291         if (s_msg == 2)
   2292             SSL_set_msg_callback(con, SSL_trace);
   2293         else
   2294 #endif
   2295             SSL_set_msg_callback(con, msg_cb);
   2296         SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
   2297     }
   2298 #ifndef OPENSSL_NO_TLSEXT
   2299     if (s_tlsextdebug) {
   2300         SSL_set_tlsext_debug_callback(con, tlsext_cb);
   2301         SSL_set_tlsext_debug_arg(con, bio_s_out);
   2302     }
   2303 #endif
   2304 
   2305     if (fileno_stdin() > s)
   2306         width = fileno_stdin() + 1;
   2307     else
   2308         width = s + 1;
   2309     for (;;) {
   2310         int read_from_terminal;
   2311         int read_from_sslcon;
   2312 
   2313         read_from_terminal = 0;
   2314         read_from_sslcon = SSL_pending(con);
   2315 
   2316         if (!read_from_sslcon) {
   2317             fdin = fileno_stdin();
   2318             if (fdin < 0) {
   2319                 BIO_printf(bio_err,"Bad fileno for stdin\n");
   2320                 goto err;
   2321             }
   2322             FD_ZERO(&readfds);
   2323 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
   2324             openssl_fdset(fdin, &readfds);
   2325 #endif
   2326             openssl_fdset(s, &readfds);
   2327             /*
   2328              * Note: under VMS with SOCKETSHR the second parameter is
   2329              * currently of type (int *) whereas under other systems it is
   2330              * (void *) if you don't have a cast it will choke the compiler:
   2331              * if you do have a cast then you can either go for (int *) or
   2332              * (void *).
   2333              */
   2334 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
   2335             /*
   2336              * Under DOS (non-djgpp) and Windows we can't select on stdin:
   2337              * only on sockets. As a workaround we timeout the select every
   2338              * second and check for any keypress. In a proper Windows
   2339              * application we wouldn't do this because it is inefficient.
   2340              */
   2341             tv.tv_sec = 1;
   2342             tv.tv_usec = 0;
   2343             i = select(width, (void *)&readfds, NULL, NULL, &tv);
   2344             if ((i < 0) || (!i && !_kbhit()))
   2345                 continue;
   2346             if (_kbhit())
   2347                 read_from_terminal = 1;
   2348 #elif defined(OPENSSL_SYS_BEOS_R5)
   2349             /* Under BeOS-R5 the situation is similar to DOS */
   2350             tv.tv_sec = 1;
   2351             tv.tv_usec = 0;
   2352             (void)fcntl(fdin, F_SETFL, O_NONBLOCK);
   2353             i = select(width, (void *)&readfds, NULL, NULL, &tv);
   2354             if ((i < 0) || (!i && read(fdin, buf, 0) < 0))
   2355                 continue;
   2356             if (read(fdin, buf, 0) >= 0)
   2357                 read_from_terminal = 1;
   2358             (void)fcntl(fdin, F_SETFL, 0);
   2359 #else
   2360             if ((SSL_version(con) == DTLS1_VERSION) &&
   2361                 DTLSv1_get_timeout(con, &timeout))
   2362                 timeoutp = &timeout;
   2363             else
   2364                 timeoutp = NULL;
   2365 
   2366             i = select(width, (void *)&readfds, NULL, NULL, timeoutp);
   2367 
   2368             if ((SSL_version(con) == DTLS1_VERSION)
   2369                 && DTLSv1_handle_timeout(con) > 0) {
   2370                 BIO_printf(bio_err, "TIMEOUT occured\n");
   2371             }
   2372 
   2373             if (i <= 0)
   2374                 continue;
   2375             if (FD_ISSET(fdin, &readfds))
   2376                 read_from_terminal = 1;
   2377 #endif
   2378             if (FD_ISSET(s, &readfds))
   2379                 read_from_sslcon = 1;
   2380         }
   2381         if (read_from_terminal) {
   2382             if (s_crlf) {
   2383                 int j, lf_num;
   2384 
   2385                 i = raw_read_stdin(buf, bufsize / 2);
   2386                 lf_num = 0;
   2387                 /* both loops are skipped when i <= 0 */
   2388                 for (j = 0; j < i; j++)
   2389                     if (buf[j] == '\n')
   2390                         lf_num++;
   2391                 for (j = i - 1; j >= 0; j--) {
   2392                     buf[j + lf_num] = buf[j];
   2393                     if (buf[j] == '\n') {
   2394                         lf_num--;
   2395                         i++;
   2396                         buf[j + lf_num] = '\r';
   2397                     }
   2398                 }
   2399                 assert(lf_num == 0);
   2400             } else
   2401                 i = raw_read_stdin(buf, bufsize);
   2402 
   2403             if (!s_quiet && !s_brief) {
   2404                 if ((i <= 0) || (buf[0] == 'Q')) {
   2405                     BIO_printf(bio_s_out, "DONE\n");
   2406                     SHUTDOWN(s);
   2407                     close_accept_socket();
   2408                     ret = -11;
   2409                     goto err;
   2410                 }
   2411                 if ((i <= 0) || (buf[0] == 'q')) {
   2412                     BIO_printf(bio_s_out, "DONE\n");
   2413                     if (SSL_version(con) != DTLS1_VERSION)
   2414                         SHUTDOWN(s);
   2415                     /*
   2416                      * close_accept_socket(); ret= -11;
   2417                      */
   2418                     goto err;
   2419                 }
   2420 #ifndef OPENSSL_NO_HEARTBEATS
   2421                 if ((buf[0] == 'B') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
   2422                     BIO_printf(bio_err, "HEARTBEATING\n");
   2423                     SSL_heartbeat(con);
   2424                     i = 0;
   2425                     continue;
   2426                 }
   2427 #endif
   2428                 if ((buf[0] == 'r') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
   2429                     SSL_renegotiate(con);
   2430                     i = SSL_do_handshake(con);
   2431                     printf("SSL_do_handshake -> %d\n", i);
   2432                     i = 0;      /* 13; */
   2433                     continue;
   2434                     /*
   2435                      * strcpy(buf,"server side RE-NEGOTIATE\n");
   2436                      */
   2437                 }
   2438                 if ((buf[0] == 'R') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
   2439                     SSL_set_verify(con,
   2440                                    SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE,
   2441                                    NULL);
   2442                     SSL_renegotiate(con);
   2443                     i = SSL_do_handshake(con);
   2444                     printf("SSL_do_handshake -> %d\n", i);
   2445                     i = 0;      /* 13; */
   2446                     continue;
   2447                     /*
   2448                      * strcpy(buf,"server side RE-NEGOTIATE asking for client
   2449                      * cert\n");
   2450                      */
   2451                 }
   2452                 if (buf[0] == 'P') {
   2453                     static const char *str = "Lets print some clear text\n";
   2454                     BIO_write(SSL_get_wbio(con), str, strlen(str));
   2455                 }
   2456                 if (buf[0] == 'S') {
   2457                     print_stats(bio_s_out, SSL_get_SSL_CTX(con));
   2458                 }
   2459             }
   2460 #ifdef CHARSET_EBCDIC
   2461             ebcdic2ascii(buf, buf, i);
   2462 #endif
   2463             l = k = 0;
   2464             for (;;) {
   2465                 /* should do a select for the write */
   2466 #ifdef RENEG
   2467                 {
   2468                     static count = 0;
   2469                     if (++count == 100) {
   2470                         count = 0;
   2471                         SSL_renegotiate(con);
   2472                     }
   2473                 }
   2474 #endif
   2475                 k = SSL_write(con, &(buf[l]), (unsigned int)i);
   2476 #ifndef OPENSSL_NO_SRP
   2477                 while (SSL_get_error(con, k) == SSL_ERROR_WANT_X509_LOOKUP) {
   2478                     BIO_printf(bio_s_out, "LOOKUP renego during write\n");
   2479                     SRP_user_pwd_free(srp_callback_parm.user);
   2480                     srp_callback_parm.user =
   2481                         SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   2482                                                srp_callback_parm.login);
   2483                     if (srp_callback_parm.user)
   2484                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
   2485                                    srp_callback_parm.user->info);
   2486                     else
   2487                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
   2488                     k = SSL_write(con, &(buf[l]), (unsigned int)i);
   2489                 }
   2490 #endif
   2491                 switch (SSL_get_error(con, k)) {
   2492                 case SSL_ERROR_NONE:
   2493                     break;
   2494                 case SSL_ERROR_WANT_WRITE:
   2495                 case SSL_ERROR_WANT_READ:
   2496                 case SSL_ERROR_WANT_X509_LOOKUP:
   2497                     BIO_printf(bio_s_out, "Write BLOCK\n");
   2498                     break;
   2499                 case SSL_ERROR_SYSCALL:
   2500                 case SSL_ERROR_SSL:
   2501                     BIO_printf(bio_s_out, "ERROR\n");
   2502                     ERR_print_errors(bio_err);
   2503                     ret = 1;
   2504                     goto err;
   2505                     /* break; */
   2506                 case SSL_ERROR_ZERO_RETURN:
   2507                     BIO_printf(bio_s_out, "DONE\n");
   2508                     ret = 1;
   2509                     goto err;
   2510                 }
   2511                 if (k > 0) {
   2512                     l += k;
   2513                     i -= k;
   2514                 }
   2515                 if (i <= 0)
   2516                     break;
   2517             }
   2518         }
   2519         if (read_from_sslcon) {
   2520             if (!SSL_is_init_finished(con)) {
   2521                 i = init_ssl_connection(con);
   2522 
   2523                 if (i < 0) {
   2524                     ret = 0;
   2525                     goto err;
   2526                 } else if (i == 0) {
   2527                     ret = 1;
   2528                     goto err;
   2529                 }
   2530             } else {
   2531  again:
   2532                 i = SSL_read(con, (char *)buf, bufsize);
   2533 #ifndef OPENSSL_NO_SRP
   2534                 while (SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
   2535                     BIO_printf(bio_s_out, "LOOKUP renego during read\n");
   2536                     SRP_user_pwd_free(srp_callback_parm.user);
   2537                     srp_callback_parm.user =
   2538                         SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   2539                                                srp_callback_parm.login);
   2540                     if (srp_callback_parm.user)
   2541                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
   2542                                    srp_callback_parm.user->info);
   2543                     else
   2544                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
   2545                     i = SSL_read(con, (char *)buf, bufsize);
   2546                 }
   2547 #endif
   2548                 switch (SSL_get_error(con, i)) {
   2549                 case SSL_ERROR_NONE:
   2550 #ifdef CHARSET_EBCDIC
   2551                     ascii2ebcdic(buf, buf, i);
   2552 #endif
   2553                     raw_write_stdout(buf, (unsigned int)i);
   2554                     if (SSL_pending(con))
   2555                         goto again;
   2556                     break;
   2557                 case SSL_ERROR_WANT_WRITE:
   2558                 case SSL_ERROR_WANT_READ:
   2559                     BIO_printf(bio_s_out, "Read BLOCK\n");
   2560                     break;
   2561                 case SSL_ERROR_SYSCALL:
   2562                 case SSL_ERROR_SSL:
   2563                     BIO_printf(bio_s_out, "ERROR\n");
   2564                     ERR_print_errors(bio_err);
   2565                     ret = 1;
   2566                     goto err;
   2567                 case SSL_ERROR_ZERO_RETURN:
   2568                     BIO_printf(bio_s_out, "DONE\n");
   2569                     ret = 1;
   2570                     goto err;
   2571                 }
   2572             }
   2573         }
   2574     }
   2575  err:
   2576     if (con != NULL) {
   2577         BIO_printf(bio_s_out, "shutting down SSL\n");
   2578 #if 1
   2579         SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
   2580 #else
   2581         SSL_shutdown(con);
   2582 #endif
   2583         SSL_free(con);
   2584     }
   2585     BIO_printf(bio_s_out, "CONNECTION CLOSED\n");
   2586     if (buf != NULL) {
   2587         OPENSSL_cleanse(buf, bufsize);
   2588         OPENSSL_free(buf);
   2589     }
   2590     if (ret >= 0)
   2591         BIO_printf(bio_s_out, "ACCEPT\n");
   2592     return (ret);
   2593 }
   2594 
   2595 static void close_accept_socket(void)
   2596 {
   2597     BIO_printf(bio_err, "shutdown accept socket\n");
   2598     if (accept_socket >= 0) {
   2599         SHUTDOWN2(accept_socket);
   2600     }
   2601 }
   2602 
   2603 static int init_ssl_connection(SSL *con)
   2604 {
   2605     int i;
   2606     const char *str;
   2607     X509 *peer;
   2608     long verify_error;
   2609     MS_STATIC char buf[BUFSIZ];
   2610 #ifndef OPENSSL_NO_KRB5
   2611     char *client_princ;
   2612 #endif
   2613 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   2614     const unsigned char *next_proto_neg;
   2615     unsigned next_proto_neg_len;
   2616 #endif
   2617     unsigned char *exportedkeymat;
   2618 
   2619     i = SSL_accept(con);
   2620 #ifdef CERT_CB_TEST_RETRY
   2621     {
   2622         while (i <= 0 && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP
   2623                && SSL_state(con) == SSL3_ST_SR_CLNT_HELLO_C) {
   2624             fprintf(stderr,
   2625                     "LOOKUP from certificate callback during accept\n");
   2626             i = SSL_accept(con);
   2627         }
   2628     }
   2629 #endif
   2630 #ifndef OPENSSL_NO_SRP
   2631     while (i <= 0 && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
   2632         BIO_printf(bio_s_out, "LOOKUP during accept %s\n",
   2633                    srp_callback_parm.login);
   2634         SRP_user_pwd_free(srp_callback_parm.user);
   2635         srp_callback_parm.user =
   2636             SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   2637                                    srp_callback_parm.login);
   2638         if (srp_callback_parm.user)
   2639             BIO_printf(bio_s_out, "LOOKUP done %s\n",
   2640                        srp_callback_parm.user->info);
   2641         else
   2642             BIO_printf(bio_s_out, "LOOKUP not successful\n");
   2643         i = SSL_accept(con);
   2644     }
   2645 #endif
   2646 
   2647     if (i <= 0) {
   2648         if (BIO_sock_should_retry(i)) {
   2649             BIO_printf(bio_s_out, "DELAY\n");
   2650             return (1);
   2651         }
   2652 
   2653         BIO_printf(bio_err, "ERROR\n");
   2654         verify_error = SSL_get_verify_result(con);
   2655         if (verify_error != X509_V_OK) {
   2656             BIO_printf(bio_err, "verify error:%s\n",
   2657                        X509_verify_cert_error_string(verify_error));
   2658         }
   2659         /* Always print any error messages */
   2660         ERR_print_errors(bio_err);
   2661         return (0);
   2662     }
   2663 
   2664     if (s_brief)
   2665         print_ssl_summary(bio_err, con);
   2666 
   2667     PEM_write_bio_SSL_SESSION(bio_s_out, SSL_get_session(con));
   2668 
   2669     peer = SSL_get_peer_certificate(con);
   2670     if (peer != NULL) {
   2671         BIO_printf(bio_s_out, "Client certificate\n");
   2672         PEM_write_bio_X509(bio_s_out, peer);
   2673         X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof buf);
   2674         BIO_printf(bio_s_out, "subject=%s\n", buf);
   2675         X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof buf);
   2676         BIO_printf(bio_s_out, "issuer=%s\n", buf);
   2677         X509_free(peer);
   2678     }
   2679 
   2680     if (SSL_get_shared_ciphers(con, buf, sizeof buf) != NULL)
   2681         BIO_printf(bio_s_out, "Shared ciphers:%s\n", buf);
   2682     str = SSL_CIPHER_get_name(SSL_get_current_cipher(con));
   2683     ssl_print_sigalgs(bio_s_out, con);
   2684 #ifndef OPENSSL_NO_EC
   2685     ssl_print_point_formats(bio_s_out, con);
   2686     ssl_print_curves(bio_s_out, con, 0);
   2687 #endif
   2688     BIO_printf(bio_s_out, "CIPHER is %s\n", (str != NULL) ? str : "(NONE)");
   2689 
   2690 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
   2691     SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len);
   2692     if (next_proto_neg) {
   2693         BIO_printf(bio_s_out, "NEXTPROTO is ");
   2694         BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len);
   2695         BIO_printf(bio_s_out, "\n");
   2696     }
   2697 #endif
   2698 #ifndef OPENSSL_NO_SRTP
   2699     {
   2700         SRTP_PROTECTION_PROFILE *srtp_profile
   2701             = SSL_get_selected_srtp_profile(con);
   2702 
   2703         if (srtp_profile)
   2704             BIO_printf(bio_s_out, "SRTP Extension negotiated, profile=%s\n",
   2705                        srtp_profile->name);
   2706     }
   2707 #endif
   2708     if (SSL_cache_hit(con))
   2709         BIO_printf(bio_s_out, "Reused session-id\n");
   2710     if (SSL_ctrl(con, SSL_CTRL_GET_FLAGS, 0, NULL) &
   2711         TLS1_FLAGS_TLS_PADDING_BUG)
   2712         BIO_printf(bio_s_out, "Peer has incorrect TLSv1 block padding\n");
   2713 #ifndef OPENSSL_NO_KRB5
   2714     client_princ = kssl_ctx_get0_client_princ(SSL_get0_kssl_ctx(con));
   2715     if (client_princ != NULL) {
   2716         BIO_printf(bio_s_out, "Kerberos peer principal is %s\n",
   2717                    client_princ);
   2718     }
   2719 #endif                          /* OPENSSL_NO_KRB5 */
   2720     BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n",
   2721                SSL_get_secure_renegotiation_support(con) ? "" : " NOT");
   2722     if (keymatexportlabel != NULL) {
   2723         BIO_printf(bio_s_out, "Keying material exporter:\n");
   2724         BIO_printf(bio_s_out, "    Label: '%s'\n", keymatexportlabel);
   2725         BIO_printf(bio_s_out, "    Length: %i bytes\n", keymatexportlen);
   2726         exportedkeymat = OPENSSL_malloc(keymatexportlen);
   2727         if (exportedkeymat != NULL) {
   2728             if (!SSL_export_keying_material(con, exportedkeymat,
   2729                                             keymatexportlen,
   2730                                             keymatexportlabel,
   2731                                             strlen(keymatexportlabel),
   2732                                             NULL, 0, 0)) {
   2733                 BIO_printf(bio_s_out, "    Error\n");
   2734             } else {
   2735                 BIO_printf(bio_s_out, "    Keying material: ");
   2736                 for (i = 0; i < keymatexportlen; i++)
   2737                     BIO_printf(bio_s_out, "%02X", exportedkeymat[i]);
   2738                 BIO_printf(bio_s_out, "\n");
   2739             }
   2740             OPENSSL_free(exportedkeymat);
   2741         }
   2742     }
   2743 
   2744     return (1);
   2745 }
   2746 
   2747 #ifndef OPENSSL_NO_DH
   2748 static DH *load_dh_param(const char *dhfile)
   2749 {
   2750     DH *ret = NULL;
   2751     BIO *bio;
   2752 
   2753     if ((bio = BIO_new_file(dhfile, "r")) == NULL)
   2754         goto err;
   2755     ret = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
   2756  err:
   2757     if (bio != NULL)
   2758         BIO_free(bio);
   2759     return (ret);
   2760 }
   2761 #endif
   2762 #ifndef OPENSSL_NO_KRB5
   2763 char *client_princ;
   2764 #endif
   2765 
   2766 #if 0
   2767 static int load_CA(SSL_CTX *ctx, char *file)
   2768 {
   2769     FILE *in;
   2770     X509 *x = NULL;
   2771 
   2772     if ((in = fopen(file, "r")) == NULL)
   2773         return (0);
   2774 
   2775     for (;;) {
   2776         if (PEM_read_X509(in, &x, NULL) == NULL)
   2777             break;
   2778         SSL_CTX_add_client_CA(ctx, x);
   2779     }
   2780     if (x != NULL)
   2781         X509_free(x);
   2782     fclose(in);
   2783     return (1);
   2784 }
   2785 #endif
   2786 
   2787 static int www_body(char *hostname, int s, int stype, unsigned char *context)
   2788 {
   2789     char *buf = NULL;
   2790     int ret = 1;
   2791     int i, j, k, dot;
   2792     SSL *con;
   2793     const SSL_CIPHER *c;
   2794     BIO *io, *ssl_bio, *sbio;
   2795 #ifndef OPENSSL_NO_KRB5
   2796     KSSL_CTX *kctx;
   2797 #endif
   2798 
   2799     buf = OPENSSL_malloc(bufsize);
   2800     if (buf == NULL)
   2801         return (0);
   2802     io = BIO_new(BIO_f_buffer());
   2803     ssl_bio = BIO_new(BIO_f_ssl());
   2804     if ((io == NULL) || (ssl_bio == NULL))
   2805         goto err;
   2806 
   2807 #ifdef FIONBIO
   2808     if (s_nbio) {
   2809         unsigned long sl = 1;
   2810 
   2811         if (!s_quiet)
   2812             BIO_printf(bio_err, "turning on non blocking io\n");
   2813         if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
   2814             ERR_print_errors(bio_err);
   2815     }
   2816 #endif
   2817 
   2818     /* lets make the output buffer a reasonable size */
   2819     if (!BIO_set_write_buffer_size(io, bufsize))
   2820         goto err;
   2821 
   2822     if ((con = SSL_new(ctx)) == NULL)
   2823         goto err;
   2824 #ifndef OPENSSL_NO_TLSEXT
   2825     if (s_tlsextdebug) {
   2826         SSL_set_tlsext_debug_callback(con, tlsext_cb);
   2827         SSL_set_tlsext_debug_arg(con, bio_s_out);
   2828     }
   2829 #endif
   2830 #ifndef OPENSSL_NO_KRB5
   2831     if ((kctx = kssl_ctx_new()) != NULL) {
   2832         kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
   2833         kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
   2834     }
   2835 #endif                          /* OPENSSL_NO_KRB5 */
   2836     if (context)
   2837         SSL_set_session_id_context(con, context, strlen((char *)context));
   2838 
   2839     sbio = BIO_new_socket(s, BIO_NOCLOSE);
   2840     if (s_nbio_test) {
   2841         BIO *test;
   2842 
   2843         test = BIO_new(BIO_f_nbio_test());
   2844         sbio = BIO_push(test, sbio);
   2845     }
   2846     SSL_set_bio(con, sbio, sbio);
   2847     SSL_set_accept_state(con);
   2848 
   2849     /* SSL_set_fd(con,s); */
   2850     BIO_set_ssl(ssl_bio, con, BIO_CLOSE);
   2851     BIO_push(io, ssl_bio);
   2852 #ifdef CHARSET_EBCDIC
   2853     io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io);
   2854 #endif
   2855 
   2856     if (s_debug) {
   2857         SSL_set_debug(con, 1);
   2858         BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
   2859         BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
   2860     }
   2861     if (s_msg) {
   2862 #ifndef OPENSSL_NO_SSL_TRACE
   2863         if (s_msg == 2)
   2864             SSL_set_msg_callback(con, SSL_trace);
   2865         else
   2866 #endif
   2867             SSL_set_msg_callback(con, msg_cb);
   2868         SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
   2869     }
   2870 
   2871     for (;;) {
   2872         if (hack) {
   2873             i = SSL_accept(con);
   2874 #ifndef OPENSSL_NO_SRP
   2875             while (i <= 0
   2876                    && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
   2877                 BIO_printf(bio_s_out, "LOOKUP during accept %s\n",
   2878                            srp_callback_parm.login);
   2879                 SRP_user_pwd_free(srp_callback_parm.user);
   2880                 srp_callback_parm.user =
   2881                     SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   2882                                            srp_callback_parm.login);
   2883                 if (srp_callback_parm.user)
   2884                     BIO_printf(bio_s_out, "LOOKUP done %s\n",
   2885                                srp_callback_parm.user->info);
   2886                 else
   2887                     BIO_printf(bio_s_out, "LOOKUP not successful\n");
   2888                 i = SSL_accept(con);
   2889             }
   2890 #endif
   2891             switch (SSL_get_error(con, i)) {
   2892             case SSL_ERROR_NONE:
   2893                 break;
   2894             case SSL_ERROR_WANT_WRITE:
   2895             case SSL_ERROR_WANT_READ:
   2896             case SSL_ERROR_WANT_X509_LOOKUP:
   2897                 continue;
   2898             case SSL_ERROR_SYSCALL:
   2899             case SSL_ERROR_SSL:
   2900             case SSL_ERROR_ZERO_RETURN:
   2901                 ret = 1;
   2902                 goto err;
   2903                 /* break; */
   2904             }
   2905 
   2906             SSL_renegotiate(con);
   2907             SSL_write(con, NULL, 0);
   2908         }
   2909 
   2910         i = BIO_gets(io, buf, bufsize - 1);
   2911         if (i < 0) {            /* error */
   2912             if (!BIO_should_retry(io)) {
   2913                 if (!s_quiet)
   2914                     ERR_print_errors(bio_err);
   2915                 goto err;
   2916             } else {
   2917                 BIO_printf(bio_s_out, "read R BLOCK\n");
   2918 #ifndef OPENSSL_NO_SRP
   2919                 if (BIO_should_io_special(io)
   2920                     && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) {
   2921                     BIO_printf(bio_s_out, "LOOKUP renego during read\n");
   2922                     SRP_user_pwd_free(srp_callback_parm.user);
   2923                     srp_callback_parm.user =
   2924                         SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   2925                                                srp_callback_parm.login);
   2926                     if (srp_callback_parm.user)
   2927                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
   2928                                    srp_callback_parm.user->info);
   2929                     else
   2930                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
   2931                     continue;
   2932                 }
   2933 #endif
   2934 #if defined(OPENSSL_SYS_NETWARE)
   2935                 delay(1000);
   2936 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
   2937                 sleep(1);
   2938 #endif
   2939                 continue;
   2940             }
   2941         } else if (i == 0) {    /* end of input */
   2942             ret = 1;
   2943             goto end;
   2944         }
   2945 
   2946         /* else we have data */
   2947         if (((www == 1) && (strncmp("GET ", buf, 4) == 0)) ||
   2948             ((www == 2) && (strncmp("GET /stats ", buf, 11) == 0))) {
   2949             char *p;
   2950             X509 *peer;
   2951             STACK_OF(SSL_CIPHER) *sk;
   2952             static const char *space = "                          ";
   2953 
   2954             BIO_puts(io,
   2955                      "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
   2956             BIO_puts(io, "<HTML><BODY BGCOLOR=\"#ffffff\">\n");
   2957             BIO_puts(io, "<pre>\n");
   2958 /*                      BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
   2959             BIO_puts(io, "\n");
   2960             for (i = 0; i < local_argc; i++) {
   2961                 BIO_puts(io, local_argv[i]);
   2962                 BIO_write(io, " ", 1);
   2963             }
   2964             BIO_puts(io, "\n");
   2965 
   2966             BIO_printf(io,
   2967                        "Secure Renegotiation IS%s supported\n",
   2968                        SSL_get_secure_renegotiation_support(con) ?
   2969                        "" : " NOT");
   2970 
   2971             /*
   2972              * The following is evil and should not really be done
   2973              */
   2974             BIO_printf(io, "Ciphers supported in s_server binary\n");
   2975             sk = SSL_get_ciphers(con);
   2976             j = sk_SSL_CIPHER_num(sk);
   2977             for (i = 0; i < j; i++) {
   2978                 c = sk_SSL_CIPHER_value(sk, i);
   2979                 BIO_printf(io, "%-11s:%-25s",
   2980                            SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
   2981                 if ((((i + 1) % 2) == 0) && (i + 1 != j))
   2982                     BIO_puts(io, "\n");
   2983             }
   2984             BIO_puts(io, "\n");
   2985             p = SSL_get_shared_ciphers(con, buf, bufsize);
   2986             if (p != NULL) {
   2987                 BIO_printf(io,
   2988                            "---\nCiphers common between both SSL end points:\n");
   2989                 j = i = 0;
   2990                 while (*p) {
   2991                     if (*p == ':') {
   2992                         BIO_write(io, space, 26 - j);
   2993                         i++;
   2994                         j = 0;
   2995                         BIO_write(io, ((i % 3) ? " " : "\n"), 1);
   2996                     } else {
   2997                         BIO_write(io, p, 1);
   2998                         j++;
   2999                     }
   3000                     p++;
   3001                 }
   3002                 BIO_puts(io, "\n");
   3003             }
   3004             ssl_print_sigalgs(io, con);
   3005 #ifndef OPENSSL_NO_EC
   3006             ssl_print_curves(io, con, 0);
   3007 #endif
   3008             BIO_printf(io, (SSL_cache_hit(con)
   3009                             ? "---\nReused, " : "---\nNew, "));
   3010             c = SSL_get_current_cipher(con);
   3011             BIO_printf(io, "%s, Cipher is %s\n",
   3012                        SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
   3013             SSL_SESSION_print(io, SSL_get_session(con));
   3014             BIO_printf(io, "---\n");
   3015             print_stats(io, SSL_get_SSL_CTX(con));
   3016             BIO_printf(io, "---\n");
   3017             peer = SSL_get_peer_certificate(con);
   3018             if (peer != NULL) {
   3019                 BIO_printf(io, "Client certificate\n");
   3020                 X509_print(io, peer);
   3021                 PEM_write_bio_X509(io, peer);
   3022             } else
   3023                 BIO_puts(io, "no client certificate available\n");
   3024             BIO_puts(io, "</BODY></HTML>\r\n\r\n");
   3025             break;
   3026         } else if ((www == 2 || www == 3)
   3027                    && (strncmp("GET /", buf, 5) == 0)) {
   3028             BIO *file;
   3029             char *p, *e;
   3030             static const char *text =
   3031                 "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
   3032 
   3033             /* skip the '/' */
   3034             p = &(buf[5]);
   3035 
   3036             dot = 1;
   3037             for (e = p; *e != '\0'; e++) {
   3038                 if (e[0] == ' ')
   3039                     break;
   3040 
   3041                 switch (dot) {
   3042                 case 1:
   3043                     dot = (e[0] == '.') ? 2 : 0;
   3044                     break;
   3045                 case 2:
   3046                     dot = (e[0] == '.') ? 3 : 0;
   3047                     break;
   3048                 case 3:
   3049                     dot = (e[0] == '/') ? -1 : 0;
   3050                     break;
   3051                 }
   3052                 if (dot == 0)
   3053                     dot = (e[0] == '/') ? 1 : 0;
   3054             }
   3055             dot = (dot == 3) || (dot == -1); /* filename contains ".."
   3056                                               * component */
   3057 
   3058             if (*e == '\0') {
   3059                 BIO_puts(io, text);
   3060                 BIO_printf(io, "'%s' is an invalid file name\r\n", p);
   3061                 break;
   3062             }
   3063             *e = '\0';
   3064 
   3065             if (dot) {
   3066                 BIO_puts(io, text);
   3067                 BIO_printf(io, "'%s' contains '..' reference\r\n", p);
   3068                 break;
   3069             }
   3070 
   3071             if (*p == '/') {
   3072                 BIO_puts(io, text);
   3073                 BIO_printf(io, "'%s' is an invalid path\r\n", p);
   3074                 break;
   3075             }
   3076 #if 0
   3077             /* append if a directory lookup */
   3078             if (e[-1] == '/')
   3079                 strcat(p, "index.html");
   3080 #endif
   3081 
   3082             /* if a directory, do the index thang */
   3083             if (app_isdir(p) > 0) {
   3084 #if 0                           /* must check buffer size */
   3085                 strcat(p, "/index.html");
   3086 #else
   3087                 BIO_puts(io, text);
   3088                 BIO_printf(io, "'%s' is a directory\r\n", p);
   3089                 break;
   3090 #endif
   3091             }
   3092 
   3093             if ((file = BIO_new_file(p, "r")) == NULL) {
   3094                 BIO_puts(io, text);
   3095                 BIO_printf(io, "Error opening '%s'\r\n", p);
   3096                 ERR_print_errors(io);
   3097                 break;
   3098             }
   3099 
   3100             if (!s_quiet)
   3101                 BIO_printf(bio_err, "FILE:%s\n", p);
   3102 
   3103             if (www == 2) {
   3104                 i = strlen(p);
   3105                 if (((i > 5) && (strcmp(&(p[i - 5]), ".html") == 0)) ||
   3106                     ((i > 4) && (strcmp(&(p[i - 4]), ".php") == 0)) ||
   3107                     ((i > 4) && (strcmp(&(p[i - 4]), ".htm") == 0)))
   3108                     BIO_puts(io,
   3109                              "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
   3110                 else
   3111                     BIO_puts(io,
   3112                              "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
   3113             }
   3114             /* send the file */
   3115             for (;;) {
   3116                 i = BIO_read(file, buf, bufsize);
   3117                 if (i <= 0)
   3118                     break;
   3119 
   3120 #ifdef RENEG
   3121                 total_bytes += i;
   3122                 fprintf(stderr, "%d\n", i);
   3123                 if (total_bytes > 3 * 1024) {
   3124                     total_bytes = 0;
   3125                     fprintf(stderr, "RENEGOTIATE\n");
   3126                     SSL_renegotiate(con);
   3127                 }
   3128 #endif
   3129 
   3130                 for (j = 0; j < i;) {
   3131 #ifdef RENEG
   3132                     {
   3133                         static count = 0;
   3134                         if (++count == 13) {
   3135                             SSL_renegotiate(con);
   3136                         }
   3137                     }
   3138 #endif
   3139                     k = BIO_write(io, &(buf[j]), i - j);
   3140                     if (k <= 0) {
   3141                         if (!BIO_should_retry(io))
   3142                             goto write_error;
   3143                         else {
   3144                             BIO_printf(bio_s_out, "rwrite W BLOCK\n");
   3145                         }
   3146                     } else {
   3147                         j += k;
   3148                     }
   3149                 }
   3150             }
   3151  write_error:
   3152             BIO_free(file);
   3153             break;
   3154         }
   3155     }
   3156 
   3157     for (;;) {
   3158         i = (int)BIO_flush(io);
   3159         if (i <= 0) {
   3160             if (!BIO_should_retry(io))
   3161                 break;
   3162         } else
   3163             break;
   3164     }
   3165  end:
   3166 #if 1
   3167     /* make sure we re-use sessions */
   3168     SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
   3169 #else
   3170     /* This kills performance */
   3171     /*
   3172      * SSL_shutdown(con); A shutdown gets sent in the BIO_free_all(io)
   3173      * procession
   3174      */
   3175 #endif
   3176 
   3177  err:
   3178 
   3179     if (ret >= 0)
   3180         BIO_printf(bio_s_out, "ACCEPT\n");
   3181 
   3182     if (buf != NULL)
   3183         OPENSSL_free(buf);
   3184     if (io != NULL)
   3185         BIO_free_all(io);
   3186 /*      if (ssl_bio != NULL) BIO_free(ssl_bio);*/
   3187     return (ret);
   3188 }
   3189 
   3190 static int rev_body(char *hostname, int s, int stype, unsigned char *context)
   3191 {
   3192     char *buf = NULL;
   3193     int i;
   3194     int ret = 1;
   3195     SSL *con;
   3196     BIO *io, *ssl_bio, *sbio;
   3197 #ifndef OPENSSL_NO_KRB5
   3198     KSSL_CTX *kctx;
   3199 #endif
   3200 
   3201     buf = OPENSSL_malloc(bufsize);
   3202     if (buf == NULL)
   3203         return (0);
   3204     io = BIO_new(BIO_f_buffer());
   3205     ssl_bio = BIO_new(BIO_f_ssl());
   3206     if ((io == NULL) || (ssl_bio == NULL))
   3207         goto err;
   3208 
   3209     /* lets make the output buffer a reasonable size */
   3210     if (!BIO_set_write_buffer_size(io, bufsize))
   3211         goto err;
   3212 
   3213     if ((con = SSL_new(ctx)) == NULL)
   3214         goto err;
   3215 #ifndef OPENSSL_NO_TLSEXT
   3216     if (s_tlsextdebug) {
   3217         SSL_set_tlsext_debug_callback(con, tlsext_cb);
   3218         SSL_set_tlsext_debug_arg(con, bio_s_out);
   3219     }
   3220 #endif
   3221 #ifndef OPENSSL_NO_KRB5
   3222     if ((kctx = kssl_ctx_new()) != NULL) {
   3223         kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
   3224         kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
   3225     }
   3226 #endif                          /* OPENSSL_NO_KRB5 */
   3227     if (context)
   3228         SSL_set_session_id_context(con, context, strlen((char *)context));
   3229 
   3230     sbio = BIO_new_socket(s, BIO_NOCLOSE);
   3231     SSL_set_bio(con, sbio, sbio);
   3232     SSL_set_accept_state(con);
   3233 
   3234     BIO_set_ssl(ssl_bio, con, BIO_CLOSE);
   3235     BIO_push(io, ssl_bio);
   3236 #ifdef CHARSET_EBCDIC
   3237     io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io);
   3238 #endif
   3239 
   3240     if (s_debug) {
   3241         SSL_set_debug(con, 1);
   3242         BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
   3243         BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
   3244     }
   3245     if (s_msg) {
   3246 #ifndef OPENSSL_NO_SSL_TRACE
   3247         if (s_msg == 2)
   3248             SSL_set_msg_callback(con, SSL_trace);
   3249         else
   3250 #endif
   3251             SSL_set_msg_callback(con, msg_cb);
   3252         SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
   3253     }
   3254 
   3255     for (;;) {
   3256         i = BIO_do_handshake(io);
   3257         if (i > 0)
   3258             break;
   3259         if (!BIO_should_retry(io)) {
   3260             BIO_puts(bio_err, "CONNECTION FAILURE\n");
   3261             ERR_print_errors(bio_err);
   3262             goto end;
   3263         }
   3264 #ifndef OPENSSL_NO_SRP
   3265         if (BIO_should_io_special(io)
   3266             && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) {
   3267             BIO_printf(bio_s_out, "LOOKUP renego during accept\n");
   3268             SRP_user_pwd_free(srp_callback_parm.user);
   3269             srp_callback_parm.user =
   3270                 SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   3271                                        srp_callback_parm.login);
   3272             if (srp_callback_parm.user)
   3273                 BIO_printf(bio_s_out, "LOOKUP done %s\n",
   3274                            srp_callback_parm.user->info);
   3275             else
   3276                 BIO_printf(bio_s_out, "LOOKUP not successful\n");
   3277             continue;
   3278         }
   3279 #endif
   3280     }
   3281     BIO_printf(bio_err, "CONNECTION ESTABLISHED\n");
   3282     print_ssl_summary(bio_err, con);
   3283 
   3284     for (;;) {
   3285         i = BIO_gets(io, buf, bufsize - 1);
   3286         if (i < 0) {            /* error */
   3287             if (!BIO_should_retry(io)) {
   3288                 if (!s_quiet)
   3289                     ERR_print_errors(bio_err);
   3290                 goto err;
   3291             } else {
   3292                 BIO_printf(bio_s_out, "read R BLOCK\n");
   3293 #ifndef OPENSSL_NO_SRP
   3294                 if (BIO_should_io_special(io)
   3295                     && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) {
   3296                     BIO_printf(bio_s_out, "LOOKUP renego during read\n");
   3297                     SRP_user_pwd_free(srp_callback_parm.user);
   3298                     srp_callback_parm.user =
   3299                         SRP_VBASE_get1_by_user(srp_callback_parm.vb,
   3300                                                srp_callback_parm.login);
   3301                     if (srp_callback_parm.user)
   3302                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
   3303                                    srp_callback_parm.user->info);
   3304                     else
   3305                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
   3306                     continue;
   3307                 }
   3308 #endif
   3309 #if defined(OPENSSL_SYS_NETWARE)
   3310                 delay(1000);
   3311 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
   3312                 sleep(1);
   3313 #endif
   3314                 continue;
   3315             }
   3316         } else if (i == 0) {    /* end of input */
   3317             ret = 1;
   3318             BIO_printf(bio_err, "CONNECTION CLOSED\n");
   3319             goto end;
   3320         } else {
   3321             char *p = buf + i - 1;
   3322             while (i && (*p == '\n' || *p == '\r')) {
   3323                 p--;
   3324                 i--;
   3325             }
   3326             if (!s_ign_eof && i == 5 && !strncmp(buf, "CLOSE", 5)) {
   3327                 ret = 1;
   3328                 BIO_printf(bio_err, "CONNECTION CLOSED\n");
   3329                 goto end;
   3330             }
   3331             BUF_reverse((unsigned char *)buf, NULL, i);
   3332             buf[i] = '\n';
   3333             BIO_write(io, buf, i + 1);
   3334             for (;;) {
   3335                 i = BIO_flush(io);
   3336                 if (i > 0)
   3337                     break;
   3338                 if (!BIO_should_retry(io))
   3339                     goto end;
   3340             }
   3341         }
   3342     }
   3343  end:
   3344     /* make sure we re-use sessions */
   3345     SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
   3346 
   3347  err:
   3348 
   3349     if (buf != NULL)
   3350         OPENSSL_free(buf);
   3351     if (io != NULL)
   3352         BIO_free_all(io);
   3353     return (ret);
   3354 }
   3355 
   3356 #ifndef OPENSSL_NO_RSA
   3357 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
   3358 {
   3359     BIGNUM *bn = NULL;
   3360     static RSA *rsa_tmp = NULL;
   3361 
   3362     if (!rsa_tmp && ((bn = BN_new()) == NULL))
   3363         BIO_printf(bio_err, "Allocation error in generating RSA key\n");
   3364     if (!rsa_tmp && bn) {
   3365         if (!s_quiet) {
   3366             BIO_printf(bio_err, "Generating temp (%d bit) RSA key...",
   3367                        keylength);
   3368             (void)BIO_flush(bio_err);
   3369         }
   3370         if (!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
   3371             !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL)) {
   3372             if (rsa_tmp)
   3373                 RSA_free(rsa_tmp);
   3374             rsa_tmp = NULL;
   3375         }
   3376         if (!s_quiet) {
   3377             BIO_printf(bio_err, "\n");
   3378             (void)BIO_flush(bio_err);
   3379         }
   3380         BN_free(bn);
   3381     }
   3382     return (rsa_tmp);
   3383 }
   3384 #endif
   3385 
   3386 #define MAX_SESSION_ID_ATTEMPTS 10
   3387 static int generate_session_id(const SSL *ssl, unsigned char *id,
   3388                                unsigned int *id_len)
   3389 {
   3390     unsigned int count = 0;
   3391     do {
   3392         if (RAND_bytes(id, *id_len) <= 0)
   3393             return 0;
   3394         /*
   3395          * Prefix the session_id with the required prefix. NB: If our prefix
   3396          * is too long, clip it - but there will be worse effects anyway, eg.
   3397          * the server could only possibly create 1 session ID (ie. the
   3398          * prefix!) so all future session negotiations will fail due to
   3399          * conflicts.
   3400          */
   3401         memcpy(id, session_id_prefix,
   3402                (strlen(session_id_prefix) < *id_len) ?
   3403                strlen(session_id_prefix) : *id_len);
   3404     }
   3405     while (SSL_has_matching_session_id(ssl, id, *id_len) &&
   3406            (++count < MAX_SESSION_ID_ATTEMPTS));
   3407     if (count >= MAX_SESSION_ID_ATTEMPTS)
   3408         return 0;
   3409     return 1;
   3410 }
   3411 
   3412 /*
   3413  * By default s_server uses an in-memory cache which caches SSL_SESSION
   3414  * structures without any serialisation. This hides some bugs which only
   3415  * become apparent in deployed servers. By implementing a basic external
   3416  * session cache some issues can be debugged using s_server.
   3417  */
   3418 
   3419 typedef struct simple_ssl_session_st {
   3420     unsigned char *id;
   3421     unsigned int idlen;
   3422     unsigned char *der;
   3423     int derlen;
   3424     struct simple_ssl_session_st *next;
   3425 } simple_ssl_session;
   3426 
   3427 static simple_ssl_session *first = NULL;
   3428 
   3429 static int add_session(SSL *ssl, SSL_SESSION *session)
   3430 {
   3431     simple_ssl_session *sess;
   3432     unsigned char *p;
   3433 
   3434     sess = OPENSSL_malloc(sizeof(simple_ssl_session));
   3435     if (!sess) {
   3436         BIO_printf(bio_err, "Out of memory adding session to external cache\n");
   3437         return 0;
   3438     }
   3439 
   3440     SSL_SESSION_get_id(session, &sess->idlen);
   3441     sess->derlen = i2d_SSL_SESSION(session, NULL);
   3442 
   3443     sess->id = BUF_memdup(SSL_SESSION_get_id(session, NULL), sess->idlen);
   3444 
   3445     sess->der = OPENSSL_malloc(sess->derlen);
   3446     if (!sess->id || !sess->der) {
   3447         BIO_printf(bio_err, "Out of memory adding session to external cache\n");
   3448 
   3449         if (sess->id)
   3450             OPENSSL_free(sess->id);
   3451         if (sess->der)
   3452             OPENSSL_free(sess->der);
   3453         OPENSSL_free(sess);
   3454         return 0;
   3455     }
   3456     p = sess->der;
   3457     i2d_SSL_SESSION(session, &p);
   3458 
   3459     sess->next = first;
   3460     first = sess;
   3461     BIO_printf(bio_err, "New session added to external cache\n");
   3462     return 0;
   3463 }
   3464 
   3465 static SSL_SESSION *get_session(SSL *ssl, unsigned char *id, int idlen,
   3466                                 int *do_copy)
   3467 {
   3468     simple_ssl_session *sess;
   3469     *do_copy = 0;
   3470     for (sess = first; sess; sess = sess->next) {
   3471         if (idlen == (int)sess->idlen && !memcmp(sess->id, id, idlen)) {
   3472             const unsigned char *p = sess->der;
   3473             BIO_printf(bio_err, "Lookup session: cache hit\n");
   3474             return d2i_SSL_SESSION(NULL, &p, sess->derlen);
   3475         }
   3476     }
   3477     BIO_printf(bio_err, "Lookup session: cache miss\n");
   3478     return NULL;
   3479 }
   3480 
   3481 static void del_session(SSL_CTX *sctx, SSL_SESSION *session)
   3482 {
   3483     simple_ssl_session *sess, *prev = NULL;
   3484     const unsigned char *id;
   3485     unsigned int idlen;
   3486     id = SSL_SESSION_get_id(session, &idlen);
   3487     for (sess = first; sess; sess = sess->next) {
   3488         if (idlen == sess->idlen && !memcmp(sess->id, id, idlen)) {
   3489             if (prev)
   3490                 prev->next = sess->next;
   3491             else
   3492                 first = sess->next;
   3493             OPENSSL_free(sess->id);
   3494             OPENSSL_free(sess->der);
   3495             OPENSSL_free(sess);
   3496             return;
   3497         }
   3498         prev = sess;
   3499     }
   3500 }
   3501 
   3502 static void init_session_cache_ctx(SSL_CTX *sctx)
   3503 {
   3504     SSL_CTX_set_session_cache_mode(sctx,
   3505                                    SSL_SESS_CACHE_NO_INTERNAL |
   3506                                    SSL_SESS_CACHE_SERVER);
   3507     SSL_CTX_sess_set_new_cb(sctx, add_session);
   3508     SSL_CTX_sess_set_get_cb(sctx, get_session);
   3509     SSL_CTX_sess_set_remove_cb(sctx, del_session);
   3510 }
   3511 
   3512 static void free_sessions(void)
   3513 {
   3514     simple_ssl_session *sess, *tsess;
   3515     for (sess = first; sess;) {
   3516         OPENSSL_free(sess->id);
   3517         OPENSSL_free(sess->der);
   3518         tsess = sess;
   3519         sess = sess->next;
   3520         OPENSSL_free(tsess);
   3521     }
   3522     first = NULL;
   3523 }
   3524