174664626SKris Kennaway /* apps/s_server.c */ 274664626SKris Kennaway /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 374664626SKris Kennaway * All rights reserved. 474664626SKris Kennaway * 574664626SKris Kennaway * This package is an SSL implementation written 674664626SKris Kennaway * by Eric Young (eay@cryptsoft.com). 774664626SKris Kennaway * The implementation was written so as to conform with Netscapes SSL. 874664626SKris Kennaway * 974664626SKris Kennaway * This library is free for commercial and non-commercial use as long as 1074664626SKris Kennaway * the following conditions are aheared to. The following conditions 1174664626SKris Kennaway * apply to all code found in this distribution, be it the RC4, RSA, 1274664626SKris Kennaway * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1374664626SKris Kennaway * included with this distribution is covered by the same copyright terms 1474664626SKris Kennaway * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1574664626SKris Kennaway * 1674664626SKris Kennaway * Copyright remains Eric Young's, and as such any Copyright notices in 1774664626SKris Kennaway * the code are not to be removed. 1874664626SKris Kennaway * If this package is used in a product, Eric Young should be given attribution 1974664626SKris Kennaway * as the author of the parts of the library used. 2074664626SKris Kennaway * This can be in the form of a textual message at program startup or 2174664626SKris Kennaway * in documentation (online or textual) provided with the package. 2274664626SKris Kennaway * 2374664626SKris Kennaway * Redistribution and use in source and binary forms, with or without 2474664626SKris Kennaway * modification, are permitted provided that the following conditions 2574664626SKris Kennaway * are met: 2674664626SKris Kennaway * 1. Redistributions of source code must retain the copyright 2774664626SKris Kennaway * notice, this list of conditions and the following disclaimer. 2874664626SKris Kennaway * 2. Redistributions in binary form must reproduce the above copyright 2974664626SKris Kennaway * notice, this list of conditions and the following disclaimer in the 3074664626SKris Kennaway * documentation and/or other materials provided with the distribution. 3174664626SKris Kennaway * 3. All advertising materials mentioning features or use of this software 3274664626SKris Kennaway * must display the following acknowledgement: 3374664626SKris Kennaway * "This product includes cryptographic software written by 3474664626SKris Kennaway * Eric Young (eay@cryptsoft.com)" 3574664626SKris Kennaway * The word 'cryptographic' can be left out if the rouines from the library 3674664626SKris Kennaway * being used are not cryptographic related :-). 3774664626SKris Kennaway * 4. If you include any Windows specific code (or a derivative thereof) from 3874664626SKris Kennaway * the apps directory (application code) you must include an acknowledgement: 3974664626SKris Kennaway * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4074664626SKris Kennaway * 4174664626SKris Kennaway * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4274664626SKris Kennaway * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4374664626SKris Kennaway * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4474664626SKris Kennaway * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4574664626SKris Kennaway * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4674664626SKris Kennaway * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4774664626SKris Kennaway * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4874664626SKris Kennaway * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4974664626SKris Kennaway * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5074664626SKris Kennaway * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5174664626SKris Kennaway * SUCH DAMAGE. 5274664626SKris Kennaway * 5374664626SKris Kennaway * The licence and distribution terms for any publically available version or 5474664626SKris Kennaway * derivative of this code cannot be changed. i.e. this code cannot simply be 5574664626SKris Kennaway * copied and put under another distribution licence 5674664626SKris Kennaway * [including the GNU Public Licence.] 5774664626SKris Kennaway */ 585c87c606SMark Murray /* ==================================================================== 595c87c606SMark Murray * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. 605c87c606SMark Murray * 615c87c606SMark Murray * Redistribution and use in source and binary forms, with or without 625c87c606SMark Murray * modification, are permitted provided that the following conditions 635c87c606SMark Murray * are met: 645c87c606SMark Murray * 655c87c606SMark Murray * 1. Redistributions of source code must retain the above copyright 665c87c606SMark Murray * notice, this list of conditions and the following disclaimer. 675c87c606SMark Murray * 685c87c606SMark Murray * 2. Redistributions in binary form must reproduce the above copyright 695c87c606SMark Murray * notice, this list of conditions and the following disclaimer in 705c87c606SMark Murray * the documentation and/or other materials provided with the 715c87c606SMark Murray * distribution. 725c87c606SMark Murray * 735c87c606SMark Murray * 3. All advertising materials mentioning features or use of this 745c87c606SMark Murray * software must display the following acknowledgment: 755c87c606SMark Murray * "This product includes software developed by the OpenSSL Project 765c87c606SMark Murray * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 775c87c606SMark Murray * 785c87c606SMark Murray * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 795c87c606SMark Murray * endorse or promote products derived from this software without 805c87c606SMark Murray * prior written permission. For written permission, please contact 815c87c606SMark Murray * openssl-core@openssl.org. 825c87c606SMark Murray * 835c87c606SMark Murray * 5. Products derived from this software may not be called "OpenSSL" 845c87c606SMark Murray * nor may "OpenSSL" appear in their names without prior written 855c87c606SMark Murray * permission of the OpenSSL Project. 865c87c606SMark Murray * 875c87c606SMark Murray * 6. Redistributions of any form whatsoever must retain the following 885c87c606SMark Murray * acknowledgment: 895c87c606SMark Murray * "This product includes software developed by the OpenSSL Project 905c87c606SMark Murray * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 915c87c606SMark Murray * 925c87c606SMark Murray * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 935c87c606SMark Murray * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 945c87c606SMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 955c87c606SMark Murray * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 965c87c606SMark Murray * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 975c87c606SMark Murray * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 985c87c606SMark Murray * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 995c87c606SMark Murray * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 1005c87c606SMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 1015c87c606SMark Murray * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1025c87c606SMark Murray * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 1035c87c606SMark Murray * OF THE POSSIBILITY OF SUCH DAMAGE. 1045c87c606SMark Murray * ==================================================================== 1055c87c606SMark Murray * 1065c87c606SMark Murray * This product includes cryptographic software written by Eric Young 1075c87c606SMark Murray * (eay@cryptsoft.com). This product includes software written by Tim 1085c87c606SMark Murray * Hudson (tjh@cryptsoft.com). 1095c87c606SMark Murray * 1105c87c606SMark Murray */ 1113b4e3dcbSSimon L. B. Nielsen /* ==================================================================== 1123b4e3dcbSSimon L. B. Nielsen * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 1133b4e3dcbSSimon L. B. Nielsen * ECC cipher suite support in OpenSSL originally developed by 1143b4e3dcbSSimon L. B. Nielsen * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. 1153b4e3dcbSSimon L. B. Nielsen */ 1163b4e3dcbSSimon L. B. Nielsen 1173b4e3dcbSSimon L. B. Nielsen /* Until the key-gen callbacks are modified to use newer prototypes, we allow 1183b4e3dcbSSimon L. B. Nielsen * deprecated functions for openssl-internal code */ 1193b4e3dcbSSimon L. B. Nielsen #ifdef OPENSSL_NO_DEPRECATED 1203b4e3dcbSSimon L. B. Nielsen #undef OPENSSL_NO_DEPRECATED 1213b4e3dcbSSimon L. B. Nielsen #endif 12274664626SKris Kennaway 12374664626SKris Kennaway #include <assert.h> 12474664626SKris Kennaway #include <stdio.h> 12574664626SKris Kennaway #include <stdlib.h> 12674664626SKris Kennaway #include <string.h> 1273b4e3dcbSSimon L. B. Nielsen 12874664626SKris Kennaway #include <sys/stat.h> 1295c87c606SMark Murray #include <openssl/e_os2.h> 1305c87c606SMark Murray #ifdef OPENSSL_NO_STDIO 13174664626SKris Kennaway #define APPS_WIN16 13274664626SKris Kennaway #endif 13374664626SKris Kennaway 1343b4e3dcbSSimon L. B. Nielsen #if !defined(OPENSSL_SYS_NETWARE) /* conflicts with winsock2 stuff on netware */ 1353b4e3dcbSSimon L. B. Nielsen #include <sys/types.h> 1363b4e3dcbSSimon L. B. Nielsen #endif 1373b4e3dcbSSimon L. B. Nielsen 13874664626SKris Kennaway /* With IPv6, it looks like Digital has mixed up the proper order of 13974664626SKris Kennaway recursive header file inclusion, resulting in the compiler complaining 14074664626SKris Kennaway that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which 14174664626SKris Kennaway is needed to have fileno() declared correctly... So let's define u_int */ 1425c87c606SMark Murray #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) 14374664626SKris Kennaway #define __U_INT 14474664626SKris Kennaway typedef unsigned int u_int; 14574664626SKris Kennaway #endif 14674664626SKris Kennaway 14774664626SKris Kennaway #include <openssl/lhash.h> 14874664626SKris Kennaway #include <openssl/bn.h> 14974664626SKris Kennaway #define USE_SOCKETS 15074664626SKris Kennaway #include "apps.h" 15174664626SKris Kennaway #include <openssl/err.h> 15274664626SKris Kennaway #include <openssl/pem.h> 15374664626SKris Kennaway #include <openssl/x509.h> 15474664626SKris Kennaway #include <openssl/ssl.h> 1555740a5e3SKris Kennaway #include <openssl/rand.h> 156db522d3aSSimon L. B. Nielsen #include <openssl/ocsp.h> 1573b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_DH 1583b4e3dcbSSimon L. B. Nielsen #include <openssl/dh.h> 1593b4e3dcbSSimon L. B. Nielsen #endif 1603b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_RSA 1613b4e3dcbSSimon L. B. Nielsen #include <openssl/rsa.h> 1623b4e3dcbSSimon L. B. Nielsen #endif 16374664626SKris Kennaway #include "s_apps.h" 1643b4e3dcbSSimon L. B. Nielsen #include "timeouts.h" 16574664626SKris Kennaway 1665c87c606SMark Murray #ifdef OPENSSL_SYS_WINCE 1675c87c606SMark Murray /* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */ 1685c87c606SMark Murray #ifdef fileno 1695c87c606SMark Murray #undef fileno 1705c87c606SMark Murray #endif 1715c87c606SMark Murray #define fileno(a) (int)_fileno(a) 1725c87c606SMark Murray #endif 1735c87c606SMark Murray 1745c87c606SMark Murray #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000) 17574664626SKris Kennaway /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */ 17674664626SKris Kennaway #undef FIONBIO 17774664626SKris Kennaway #endif 17874664626SKris Kennaway 1795c87c606SMark Murray #ifndef OPENSSL_NO_RSA 18074664626SKris Kennaway static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength); 18174664626SKris Kennaway #endif 18274664626SKris Kennaway static int sv_body(char *hostname, int s, unsigned char *context); 18374664626SKris Kennaway static int www_body(char *hostname, int s, unsigned char *context); 18474664626SKris Kennaway static void close_accept_socket(void ); 18574664626SKris Kennaway static void sv_usage(void); 18674664626SKris Kennaway static int init_ssl_connection(SSL *s); 18774664626SKris Kennaway static void print_stats(BIO *bp,SSL_CTX *ctx); 1885c87c606SMark Murray static int generate_session_id(const SSL *ssl, unsigned char *id, 1895c87c606SMark Murray unsigned int *id_len); 1905c87c606SMark Murray #ifndef OPENSSL_NO_DH 1913b4e3dcbSSimon L. B. Nielsen static DH *load_dh_param(const char *dhfile); 19274664626SKris Kennaway static DH *get_dh512(void); 19374664626SKris Kennaway #endif 1943b4e3dcbSSimon L. B. Nielsen 195f579bf8eSKris Kennaway #ifdef MONOLITH 196f579bf8eSKris Kennaway static void s_server_init(void); 197f579bf8eSKris Kennaway #endif 19874664626SKris Kennaway 19974664626SKris Kennaway #ifndef S_ISDIR 20074664626SKris Kennaway # if defined(_S_IFMT) && defined(_S_IFDIR) 20174664626SKris Kennaway # define S_ISDIR(a) (((a) & _S_IFMT) == _S_IFDIR) 20274664626SKris Kennaway # else 20374664626SKris Kennaway # define S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR) 20474664626SKris Kennaway # endif 20574664626SKris Kennaway #endif 20674664626SKris Kennaway 2075c87c606SMark Murray #ifndef OPENSSL_NO_DH 20874664626SKris Kennaway static unsigned char dh512_p[]={ 20974664626SKris Kennaway 0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75, 21074664626SKris Kennaway 0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F, 21174664626SKris Kennaway 0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3, 21274664626SKris Kennaway 0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12, 21374664626SKris Kennaway 0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C, 21474664626SKris Kennaway 0x47,0x74,0xE8,0x33, 21574664626SKris Kennaway }; 21674664626SKris Kennaway static unsigned char dh512_g[]={ 21774664626SKris Kennaway 0x02, 21874664626SKris Kennaway }; 21974664626SKris Kennaway 22074664626SKris Kennaway static DH *get_dh512(void) 22174664626SKris Kennaway { 22274664626SKris Kennaway DH *dh=NULL; 22374664626SKris Kennaway 22474664626SKris Kennaway if ((dh=DH_new()) == NULL) return(NULL); 22574664626SKris Kennaway dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL); 22674664626SKris Kennaway dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL); 22774664626SKris Kennaway if ((dh->p == NULL) || (dh->g == NULL)) 22874664626SKris Kennaway return(NULL); 22974664626SKris Kennaway return(dh); 23074664626SKris Kennaway } 23174664626SKris Kennaway #endif 23274664626SKris Kennaway 2333b4e3dcbSSimon L. B. Nielsen 23474664626SKris Kennaway /* static int load_CA(SSL_CTX *ctx, char *file);*/ 23574664626SKris Kennaway 23674664626SKris Kennaway #undef BUFSIZZ 23774664626SKris Kennaway #define BUFSIZZ 16*1024 238f579bf8eSKris Kennaway static int bufsize=BUFSIZZ; 23974664626SKris Kennaway static int accept_socket= -1; 24074664626SKris Kennaway 24174664626SKris Kennaway #define TEST_CERT "server.pem" 242db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 243db522d3aSSimon L. B. Nielsen #define TEST_CERT2 "server2.pem" 244db522d3aSSimon L. B. Nielsen #endif 24574664626SKris Kennaway #undef PROG 24674664626SKris Kennaway #define PROG s_server_main 24774664626SKris Kennaway 24874664626SKris Kennaway extern int verify_depth; 24974664626SKris Kennaway 25074664626SKris Kennaway static char *cipher=NULL; 25174664626SKris Kennaway static int s_server_verify=SSL_VERIFY_NONE; 25274664626SKris Kennaway static int s_server_session_id_context = 1; /* anything will do */ 2533b4e3dcbSSimon L. B. Nielsen static const char *s_cert_file=TEST_CERT,*s_key_file=NULL; 254db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 255db522d3aSSimon L. B. Nielsen static const char *s_cert_file2=TEST_CERT2,*s_key_file2=NULL; 256db522d3aSSimon L. B. Nielsen #endif 25774664626SKris Kennaway static char *s_dcert_file=NULL,*s_dkey_file=NULL; 25874664626SKris Kennaway #ifdef FIONBIO 25974664626SKris Kennaway static int s_nbio=0; 26074664626SKris Kennaway #endif 26174664626SKris Kennaway static int s_nbio_test=0; 26274664626SKris Kennaway int s_crlf=0; 26374664626SKris Kennaway static SSL_CTX *ctx=NULL; 264db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 265db522d3aSSimon L. B. Nielsen static SSL_CTX *ctx2=NULL; 266db522d3aSSimon L. B. Nielsen #endif 26774664626SKris Kennaway static int www=0; 26874664626SKris Kennaway 26974664626SKris Kennaway static BIO *bio_s_out=NULL; 27074664626SKris Kennaway static int s_debug=0; 271db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 272db522d3aSSimon L. B. Nielsen static int s_tlsextdebug=0; 273db522d3aSSimon L. B. Nielsen static int s_tlsextstatus=0; 274db522d3aSSimon L. B. Nielsen static int cert_status_cb(SSL *s, void *arg); 275db522d3aSSimon L. B. Nielsen #endif 2765c87c606SMark Murray static int s_msg=0; 27774664626SKris Kennaway static int s_quiet=0; 27874664626SKris Kennaway 279f579bf8eSKris Kennaway static int hack=0; 280fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE 2815c87c606SMark Murray static char *engine_id=NULL; 282fceca8a3SJacques Vidrine #endif 2835c87c606SMark Murray static const char *session_id_prefix=NULL; 284f579bf8eSKris Kennaway 2853b4e3dcbSSimon L. B. Nielsen static int enable_timeouts = 0; 2863b4e3dcbSSimon L. B. Nielsen #ifdef mtu 2873b4e3dcbSSimon L. B. Nielsen #undef mtu 2883b4e3dcbSSimon L. B. Nielsen #endif 2893b4e3dcbSSimon L. B. Nielsen static long mtu; 2903b4e3dcbSSimon L. B. Nielsen static int cert_chain = 0; 2913b4e3dcbSSimon L. B. Nielsen 2923b4e3dcbSSimon L. B. Nielsen 293f579bf8eSKris Kennaway #ifdef MONOLITH 29474664626SKris Kennaway static void s_server_init(void) 29574664626SKris Kennaway { 296f579bf8eSKris Kennaway accept_socket=-1; 29774664626SKris Kennaway cipher=NULL; 29874664626SKris Kennaway s_server_verify=SSL_VERIFY_NONE; 29974664626SKris Kennaway s_dcert_file=NULL; 30074664626SKris Kennaway s_dkey_file=NULL; 30174664626SKris Kennaway s_cert_file=TEST_CERT; 30274664626SKris Kennaway s_key_file=NULL; 303db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 304db522d3aSSimon L. B. Nielsen s_cert_file2=TEST_CERT2; 305db522d3aSSimon L. B. Nielsen s_key_file2=NULL; 306db522d3aSSimon L. B. Nielsen ctx2=NULL; 307db522d3aSSimon L. B. Nielsen #endif 30874664626SKris Kennaway #ifdef FIONBIO 30974664626SKris Kennaway s_nbio=0; 31074664626SKris Kennaway #endif 31174664626SKris Kennaway s_nbio_test=0; 31274664626SKris Kennaway ctx=NULL; 31374664626SKris Kennaway www=0; 31474664626SKris Kennaway 31574664626SKris Kennaway bio_s_out=NULL; 31674664626SKris Kennaway s_debug=0; 3175c87c606SMark Murray s_msg=0; 31874664626SKris Kennaway s_quiet=0; 319f579bf8eSKris Kennaway hack=0; 320fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE 3215c87c606SMark Murray engine_id=NULL; 322fceca8a3SJacques Vidrine #endif 32374664626SKris Kennaway } 32474664626SKris Kennaway #endif 32574664626SKris Kennaway 32674664626SKris Kennaway static void sv_usage(void) 32774664626SKris Kennaway { 32874664626SKris Kennaway BIO_printf(bio_err,"usage: s_server [args ...]\n"); 32974664626SKris Kennaway BIO_printf(bio_err,"\n"); 33074664626SKris Kennaway BIO_printf(bio_err," -accept arg - port to accept on (default is %d)\n",PORT); 33174664626SKris Kennaway BIO_printf(bio_err," -context arg - set session ID context\n"); 33274664626SKris Kennaway BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n"); 33374664626SKris Kennaway BIO_printf(bio_err," -Verify arg - turn on peer certificate verification, must have a cert.\n"); 3343b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -cert arg - certificate file to use\n"); 33574664626SKris Kennaway BIO_printf(bio_err," (default is %s)\n",TEST_CERT); 336db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -crl_check - check the peer certificate has not been revoked by its CA.\n" \ 337db522d3aSSimon L. B. Nielsen " The CRL(s) are appended to the certificate file\n"); 338db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -crl_check_all - check the peer certificate has not been revoked by its CA\n" \ 339db522d3aSSimon L. B. Nielsen " or any other CRL in the CA chain. CRL(s) are appened to the\n" \ 340db522d3aSSimon L. B. Nielsen " the certificate file.\n"); 3413b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n"); 3423b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -key arg - Private Key file to use, in cert file if\n"); 34374664626SKris Kennaway BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT); 3443b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -keyform arg - key format (PEM, DER or ENGINE) PEM default\n"); 3453b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -pass arg - private key file pass phrase source\n"); 34674664626SKris Kennaway BIO_printf(bio_err," -dcert arg - second certificate file to use (usually for DSA)\n"); 3473b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -dcertform x - second certificate format (PEM or DER) PEM default\n"); 34874664626SKris Kennaway BIO_printf(bio_err," -dkey arg - second private key file to use (usually for DSA)\n"); 3493b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n"); 3503b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -dpass arg - second private key file pass phrase source\n"); 351f579bf8eSKris Kennaway BIO_printf(bio_err," -dhparam arg - DH parameter file to use, in cert file if not specified\n"); 352f579bf8eSKris Kennaway BIO_printf(bio_err," or a default set of parameters is used\n"); 3533b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_ECDH 3543b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \ 3553b4e3dcbSSimon L. B. Nielsen " Use \"openssl ecparam -list_curves\" for all names\n" \ 3563b4e3dcbSSimon L. B. Nielsen " (default is sect163r2).\n"); 3573b4e3dcbSSimon L. B. Nielsen #endif 35874664626SKris Kennaway #ifdef FIONBIO 35974664626SKris Kennaway BIO_printf(bio_err," -nbio - Run with non-blocking IO\n"); 36074664626SKris Kennaway #endif 36174664626SKris Kennaway BIO_printf(bio_err," -nbio_test - test with the non-blocking test bio\n"); 36274664626SKris Kennaway BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n"); 36374664626SKris Kennaway BIO_printf(bio_err," -debug - Print more output\n"); 3645c87c606SMark Murray BIO_printf(bio_err," -msg - Show protocol messages\n"); 36574664626SKris Kennaway BIO_printf(bio_err," -state - Print the SSL states\n"); 36674664626SKris Kennaway BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n"); 36774664626SKris Kennaway BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n"); 36874664626SKris Kennaway BIO_printf(bio_err," -nocert - Don't use any certificates (Anon-DH)\n"); 36974664626SKris Kennaway BIO_printf(bio_err," -cipher arg - play with 'openssl ciphers' to see what goes here\n"); 3705c87c606SMark Murray BIO_printf(bio_err," -serverpref - Use server's cipher preferences\n"); 37174664626SKris Kennaway BIO_printf(bio_err," -quiet - No server output\n"); 37274664626SKris Kennaway BIO_printf(bio_err," -no_tmp_rsa - Do not generate a tmp RSA key\n"); 37374664626SKris Kennaway BIO_printf(bio_err," -ssl2 - Just talk SSLv2\n"); 37474664626SKris Kennaway BIO_printf(bio_err," -ssl3 - Just talk SSLv3\n"); 37574664626SKris Kennaway BIO_printf(bio_err," -tls1 - Just talk TLSv1\n"); 3763b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -dtls1 - Just talk DTLSv1\n"); 3773b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -timeout - Enable timeouts\n"); 3783b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -mtu - Set MTU\n"); 3793b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -chain - Read a certificate chain\n"); 38074664626SKris Kennaway BIO_printf(bio_err," -no_ssl2 - Just disable SSLv2\n"); 38174664626SKris Kennaway BIO_printf(bio_err," -no_ssl3 - Just disable SSLv3\n"); 38274664626SKris Kennaway BIO_printf(bio_err," -no_tls1 - Just disable TLSv1\n"); 3835c87c606SMark Murray #ifndef OPENSSL_NO_DH 38474664626SKris Kennaway BIO_printf(bio_err," -no_dhe - Disable ephemeral DH\n"); 38574664626SKris Kennaway #endif 3863b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_ECDH 3873b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err," -no_ecdhe - Disable ephemeral ECDH\n"); 3883b4e3dcbSSimon L. B. Nielsen #endif 389f579bf8eSKris Kennaway BIO_printf(bio_err," -bugs - Turn on SSL bug compatibility\n"); 39074664626SKris Kennaway BIO_printf(bio_err," -www - Respond to a 'GET /' with a status page\n"); 39174664626SKris Kennaway BIO_printf(bio_err," -WWW - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n"); 3925c87c606SMark Murray BIO_printf(bio_err," -HTTP - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n"); 3935c87c606SMark Murray BIO_printf(bio_err," with the assumption it contains a complete HTTP response.\n"); 394fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE 3955c87c606SMark Murray BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n"); 396fceca8a3SJacques Vidrine #endif 3975c87c606SMark Murray BIO_printf(bio_err," -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n"); 3985740a5e3SKris Kennaway BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); 399db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 400db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -servername host - servername for HostName TLS extension\n"); 401db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -servername_fatal - on mismatch send fatal alert (default warning alert)\n"); 402db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -cert2 arg - certificate file to use for servername\n"); 403db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," (default is %s)\n",TEST_CERT2); 404db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -key2 arg - Private Key file to use for servername, in cert file if\n"); 405db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT2); 406db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n"); 407db522d3aSSimon L. B. Nielsen BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n"); 408db522d3aSSimon L. B. Nielsen #endif 40974664626SKris Kennaway } 41074664626SKris Kennaway 41174664626SKris Kennaway static int local_argc=0; 41274664626SKris Kennaway static char **local_argv; 41374664626SKris Kennaway 41474664626SKris Kennaway #ifdef CHARSET_EBCDIC 41574664626SKris Kennaway static int ebcdic_new(BIO *bi); 41674664626SKris Kennaway static int ebcdic_free(BIO *a); 41774664626SKris Kennaway static int ebcdic_read(BIO *b, char *out, int outl); 4185c87c606SMark Murray static int ebcdic_write(BIO *b, const char *in, int inl); 4195c87c606SMark Murray static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr); 42074664626SKris Kennaway static int ebcdic_gets(BIO *bp, char *buf, int size); 4215c87c606SMark Murray static int ebcdic_puts(BIO *bp, const char *str); 42274664626SKris Kennaway 42374664626SKris Kennaway #define BIO_TYPE_EBCDIC_FILTER (18|0x0200) 42474664626SKris Kennaway static BIO_METHOD methods_ebcdic= 42574664626SKris Kennaway { 42674664626SKris Kennaway BIO_TYPE_EBCDIC_FILTER, 42774664626SKris Kennaway "EBCDIC/ASCII filter", 42874664626SKris Kennaway ebcdic_write, 42974664626SKris Kennaway ebcdic_read, 43074664626SKris Kennaway ebcdic_puts, 43174664626SKris Kennaway ebcdic_gets, 43274664626SKris Kennaway ebcdic_ctrl, 43374664626SKris Kennaway ebcdic_new, 43474664626SKris Kennaway ebcdic_free, 43574664626SKris Kennaway }; 43674664626SKris Kennaway 43774664626SKris Kennaway typedef struct 43874664626SKris Kennaway { 43974664626SKris Kennaway size_t alloced; 44074664626SKris Kennaway char buff[1]; 44174664626SKris Kennaway } EBCDIC_OUTBUFF; 44274664626SKris Kennaway 44374664626SKris Kennaway BIO_METHOD *BIO_f_ebcdic_filter() 44474664626SKris Kennaway { 44574664626SKris Kennaway return(&methods_ebcdic); 44674664626SKris Kennaway } 44774664626SKris Kennaway 44874664626SKris Kennaway static int ebcdic_new(BIO *bi) 44974664626SKris Kennaway { 45074664626SKris Kennaway EBCDIC_OUTBUFF *wbuf; 45174664626SKris Kennaway 452ddd58736SKris Kennaway wbuf = (EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024); 45374664626SKris Kennaway wbuf->alloced = 1024; 45474664626SKris Kennaway wbuf->buff[0] = '\0'; 45574664626SKris Kennaway 45674664626SKris Kennaway bi->ptr=(char *)wbuf; 45774664626SKris Kennaway bi->init=1; 45874664626SKris Kennaway bi->flags=0; 45974664626SKris Kennaway return(1); 46074664626SKris Kennaway } 46174664626SKris Kennaway 46274664626SKris Kennaway static int ebcdic_free(BIO *a) 46374664626SKris Kennaway { 46474664626SKris Kennaway if (a == NULL) return(0); 46574664626SKris Kennaway if (a->ptr != NULL) 466ddd58736SKris Kennaway OPENSSL_free(a->ptr); 46774664626SKris Kennaway a->ptr=NULL; 46874664626SKris Kennaway a->init=0; 46974664626SKris Kennaway a->flags=0; 47074664626SKris Kennaway return(1); 47174664626SKris Kennaway } 47274664626SKris Kennaway 47374664626SKris Kennaway static int ebcdic_read(BIO *b, char *out, int outl) 47474664626SKris Kennaway { 47574664626SKris Kennaway int ret=0; 47674664626SKris Kennaway 47774664626SKris Kennaway if (out == NULL || outl == 0) return(0); 47874664626SKris Kennaway if (b->next_bio == NULL) return(0); 47974664626SKris Kennaway 48074664626SKris Kennaway ret=BIO_read(b->next_bio,out,outl); 48174664626SKris Kennaway if (ret > 0) 48274664626SKris Kennaway ascii2ebcdic(out,out,ret); 48374664626SKris Kennaway return(ret); 48474664626SKris Kennaway } 48574664626SKris Kennaway 4865c87c606SMark Murray static int ebcdic_write(BIO *b, const char *in, int inl) 48774664626SKris Kennaway { 48874664626SKris Kennaway EBCDIC_OUTBUFF *wbuf; 48974664626SKris Kennaway int ret=0; 49074664626SKris Kennaway int num; 49174664626SKris Kennaway unsigned char n; 49274664626SKris Kennaway 49374664626SKris Kennaway if ((in == NULL) || (inl <= 0)) return(0); 49474664626SKris Kennaway if (b->next_bio == NULL) return(0); 49574664626SKris Kennaway 49674664626SKris Kennaway wbuf=(EBCDIC_OUTBUFF *)b->ptr; 49774664626SKris Kennaway 49874664626SKris Kennaway if (inl > (num = wbuf->alloced)) 49974664626SKris Kennaway { 50074664626SKris Kennaway num = num + num; /* double the size */ 50174664626SKris Kennaway if (num < inl) 50274664626SKris Kennaway num = inl; 503ddd58736SKris Kennaway OPENSSL_free(wbuf); 504ddd58736SKris Kennaway wbuf=(EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num); 50574664626SKris Kennaway 50674664626SKris Kennaway wbuf->alloced = num; 50774664626SKris Kennaway wbuf->buff[0] = '\0'; 50874664626SKris Kennaway 50974664626SKris Kennaway b->ptr=(char *)wbuf; 51074664626SKris Kennaway } 51174664626SKris Kennaway 51274664626SKris Kennaway ebcdic2ascii(wbuf->buff, in, inl); 51374664626SKris Kennaway 51474664626SKris Kennaway ret=BIO_write(b->next_bio, wbuf->buff, inl); 51574664626SKris Kennaway 51674664626SKris Kennaway return(ret); 51774664626SKris Kennaway } 51874664626SKris Kennaway 5195c87c606SMark Murray static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr) 52074664626SKris Kennaway { 52174664626SKris Kennaway long ret; 52274664626SKris Kennaway 52374664626SKris Kennaway if (b->next_bio == NULL) return(0); 52474664626SKris Kennaway switch (cmd) 52574664626SKris Kennaway { 52674664626SKris Kennaway case BIO_CTRL_DUP: 52774664626SKris Kennaway ret=0L; 52874664626SKris Kennaway break; 52974664626SKris Kennaway default: 53074664626SKris Kennaway ret=BIO_ctrl(b->next_bio,cmd,num,ptr); 53174664626SKris Kennaway break; 53274664626SKris Kennaway } 53374664626SKris Kennaway return(ret); 53474664626SKris Kennaway } 53574664626SKris Kennaway 53674664626SKris Kennaway static int ebcdic_gets(BIO *bp, char *buf, int size) 53774664626SKris Kennaway { 5385c87c606SMark Murray int i, ret=0; 53974664626SKris Kennaway if (bp->next_bio == NULL) return(0); 54074664626SKris Kennaway /* return(BIO_gets(bp->next_bio,buf,size));*/ 54174664626SKris Kennaway for (i=0; i<size-1; ++i) 54274664626SKris Kennaway { 54374664626SKris Kennaway ret = ebcdic_read(bp,&buf[i],1); 54474664626SKris Kennaway if (ret <= 0) 54574664626SKris Kennaway break; 54674664626SKris Kennaway else if (buf[i] == '\n') 54774664626SKris Kennaway { 54874664626SKris Kennaway ++i; 54974664626SKris Kennaway break; 55074664626SKris Kennaway } 55174664626SKris Kennaway } 55274664626SKris Kennaway if (i < size) 55374664626SKris Kennaway buf[i] = '\0'; 55474664626SKris Kennaway return (ret < 0 && i == 0) ? ret : i; 55574664626SKris Kennaway } 55674664626SKris Kennaway 5575c87c606SMark Murray static int ebcdic_puts(BIO *bp, const char *str) 55874664626SKris Kennaway { 55974664626SKris Kennaway if (bp->next_bio == NULL) return(0); 56074664626SKris Kennaway return ebcdic_write(bp, str, strlen(str)); 56174664626SKris Kennaway } 56274664626SKris Kennaway #endif 56374664626SKris Kennaway 564db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 565db522d3aSSimon L. B. Nielsen 566db522d3aSSimon L. B. Nielsen /* This is a context that we pass to callbacks */ 567db522d3aSSimon L. B. Nielsen typedef struct tlsextctx_st { 568db522d3aSSimon L. B. Nielsen char * servername; 569db522d3aSSimon L. B. Nielsen BIO * biodebug; 570db522d3aSSimon L. B. Nielsen int extension_error; 571db522d3aSSimon L. B. Nielsen } tlsextctx; 572db522d3aSSimon L. B. Nielsen 573db522d3aSSimon L. B. Nielsen 574db522d3aSSimon L. B. Nielsen static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg) 575db522d3aSSimon L. B. Nielsen { 576db522d3aSSimon L. B. Nielsen tlsextctx * p = (tlsextctx *) arg; 577db522d3aSSimon L. B. Nielsen const char * servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name); 578db522d3aSSimon L. B. Nielsen if (servername && p->biodebug) 579db522d3aSSimon L. B. Nielsen BIO_printf(p->biodebug,"Hostname in TLS extension: \"%s\"\n",servername); 580db522d3aSSimon L. B. Nielsen 581db522d3aSSimon L. B. Nielsen if (!p->servername) 582db522d3aSSimon L. B. Nielsen return SSL_TLSEXT_ERR_NOACK; 583db522d3aSSimon L. B. Nielsen 584db522d3aSSimon L. B. Nielsen if (servername) 585db522d3aSSimon L. B. Nielsen { 586db522d3aSSimon L. B. Nielsen if (strcmp(servername,p->servername)) 587db522d3aSSimon L. B. Nielsen return p->extension_error; 588db522d3aSSimon L. B. Nielsen if (ctx2) 589db522d3aSSimon L. B. Nielsen { 590db522d3aSSimon L. B. Nielsen BIO_printf(p->biodebug,"Swiching server context.\n"); 591db522d3aSSimon L. B. Nielsen SSL_set_SSL_CTX(s,ctx2); 592db522d3aSSimon L. B. Nielsen } 593db522d3aSSimon L. B. Nielsen } 594db522d3aSSimon L. B. Nielsen return SSL_TLSEXT_ERR_OK; 595db522d3aSSimon L. B. Nielsen } 596db522d3aSSimon L. B. Nielsen 597db522d3aSSimon L. B. Nielsen /* Structure passed to cert status callback */ 598db522d3aSSimon L. B. Nielsen 599db522d3aSSimon L. B. Nielsen typedef struct tlsextstatusctx_st { 600db522d3aSSimon L. B. Nielsen /* Default responder to use */ 601db522d3aSSimon L. B. Nielsen char *host, *path, *port; 602db522d3aSSimon L. B. Nielsen int use_ssl; 603db522d3aSSimon L. B. Nielsen int timeout; 604db522d3aSSimon L. B. Nielsen BIO *err; 605db522d3aSSimon L. B. Nielsen int verbose; 606db522d3aSSimon L. B. Nielsen } tlsextstatusctx; 607db522d3aSSimon L. B. Nielsen 608db522d3aSSimon L. B. Nielsen static tlsextstatusctx tlscstatp = {NULL, NULL, NULL, 0, -1, NULL, 0}; 609db522d3aSSimon L. B. Nielsen 610db522d3aSSimon L. B. Nielsen /* Certificate Status callback. This is called when a client includes a 611db522d3aSSimon L. B. Nielsen * certificate status request extension. 612db522d3aSSimon L. B. Nielsen * 613db522d3aSSimon L. B. Nielsen * This is a simplified version. It examines certificates each time and 614db522d3aSSimon L. B. Nielsen * makes one OCSP responder query for each request. 615db522d3aSSimon L. B. Nielsen * 616db522d3aSSimon L. B. Nielsen * A full version would store details such as the OCSP certificate IDs and 617db522d3aSSimon L. B. Nielsen * minimise the number of OCSP responses by caching them until they were 618db522d3aSSimon L. B. Nielsen * considered "expired". 619db522d3aSSimon L. B. Nielsen */ 620db522d3aSSimon L. B. Nielsen 621db522d3aSSimon L. B. Nielsen static int cert_status_cb(SSL *s, void *arg) 622db522d3aSSimon L. B. Nielsen { 623db522d3aSSimon L. B. Nielsen tlsextstatusctx *srctx = arg; 624db522d3aSSimon L. B. Nielsen BIO *err = srctx->err; 625db522d3aSSimon L. B. Nielsen char *host, *port, *path; 626db522d3aSSimon L. B. Nielsen int use_ssl; 627db522d3aSSimon L. B. Nielsen unsigned char *rspder = NULL; 628db522d3aSSimon L. B. Nielsen int rspderlen; 629db522d3aSSimon L. B. Nielsen STACK *aia = NULL; 630db522d3aSSimon L. B. Nielsen X509 *x = NULL; 631db522d3aSSimon L. B. Nielsen X509_STORE_CTX inctx; 632db522d3aSSimon L. B. Nielsen X509_OBJECT obj; 633db522d3aSSimon L. B. Nielsen OCSP_REQUEST *req = NULL; 634db522d3aSSimon L. B. Nielsen OCSP_RESPONSE *resp = NULL; 635db522d3aSSimon L. B. Nielsen OCSP_CERTID *id = NULL; 636db522d3aSSimon L. B. Nielsen STACK_OF(X509_EXTENSION) *exts; 637db522d3aSSimon L. B. Nielsen int ret = SSL_TLSEXT_ERR_NOACK; 638db522d3aSSimon L. B. Nielsen int i; 639db522d3aSSimon L. B. Nielsen #if 0 640db522d3aSSimon L. B. Nielsen STACK_OF(OCSP_RESPID) *ids; 641db522d3aSSimon L. B. Nielsen SSL_get_tlsext_status_ids(s, &ids); 642db522d3aSSimon L. B. Nielsen BIO_printf(err, "cert_status: received %d ids\n", sk_OCSP_RESPID_num(ids)); 643db522d3aSSimon L. B. Nielsen #endif 644db522d3aSSimon L. B. Nielsen if (srctx->verbose) 645db522d3aSSimon L. B. Nielsen BIO_puts(err, "cert_status: callback called\n"); 646db522d3aSSimon L. B. Nielsen /* Build up OCSP query from server certificate */ 647db522d3aSSimon L. B. Nielsen x = SSL_get_certificate(s); 648db522d3aSSimon L. B. Nielsen aia = X509_get1_ocsp(x); 649db522d3aSSimon L. B. Nielsen if (aia) 650db522d3aSSimon L. B. Nielsen { 651db522d3aSSimon L. B. Nielsen if (!OCSP_parse_url(sk_value(aia, 0), 652db522d3aSSimon L. B. Nielsen &host, &port, &path, &use_ssl)) 653db522d3aSSimon L. B. Nielsen { 654db522d3aSSimon L. B. Nielsen BIO_puts(err, "cert_status: can't parse AIA URL\n"); 655db522d3aSSimon L. B. Nielsen goto err; 656db522d3aSSimon L. B. Nielsen } 657db522d3aSSimon L. B. Nielsen if (srctx->verbose) 658db522d3aSSimon L. B. Nielsen BIO_printf(err, "cert_status: AIA URL: %s\n", 659db522d3aSSimon L. B. Nielsen sk_value(aia, 0)); 660db522d3aSSimon L. B. Nielsen } 661db522d3aSSimon L. B. Nielsen else 662db522d3aSSimon L. B. Nielsen { 663db522d3aSSimon L. B. Nielsen if (!srctx->host) 664db522d3aSSimon L. B. Nielsen { 665db522d3aSSimon L. B. Nielsen BIO_puts(srctx->err, "cert_status: no AIA and no default responder URL\n"); 666db522d3aSSimon L. B. Nielsen goto done; 667db522d3aSSimon L. B. Nielsen } 668db522d3aSSimon L. B. Nielsen host = srctx->host; 669db522d3aSSimon L. B. Nielsen path = srctx->path; 670db522d3aSSimon L. B. Nielsen port = srctx->port; 671db522d3aSSimon L. B. Nielsen use_ssl = srctx->use_ssl; 672db522d3aSSimon L. B. Nielsen } 673db522d3aSSimon L. B. Nielsen 674db522d3aSSimon L. B. Nielsen if (!X509_STORE_CTX_init(&inctx, 675db522d3aSSimon L. B. Nielsen SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)), 676db522d3aSSimon L. B. Nielsen NULL, NULL)) 677db522d3aSSimon L. B. Nielsen goto err; 678db522d3aSSimon L. B. Nielsen if (X509_STORE_get_by_subject(&inctx,X509_LU_X509, 679db522d3aSSimon L. B. Nielsen X509_get_issuer_name(x),&obj) <= 0) 680db522d3aSSimon L. B. Nielsen { 681db522d3aSSimon L. B. Nielsen BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n"); 682db522d3aSSimon L. B. Nielsen X509_STORE_CTX_cleanup(&inctx); 683db522d3aSSimon L. B. Nielsen goto done; 684db522d3aSSimon L. B. Nielsen } 685db522d3aSSimon L. B. Nielsen req = OCSP_REQUEST_new(); 686db522d3aSSimon L. B. Nielsen if (!req) 687db522d3aSSimon L. B. Nielsen goto err; 688db522d3aSSimon L. B. Nielsen id = OCSP_cert_to_id(NULL, x, obj.data.x509); 689db522d3aSSimon L. B. Nielsen X509_free(obj.data.x509); 690db522d3aSSimon L. B. Nielsen X509_STORE_CTX_cleanup(&inctx); 691db522d3aSSimon L. B. Nielsen if (!id) 692db522d3aSSimon L. B. Nielsen goto err; 693db522d3aSSimon L. B. Nielsen if (!OCSP_request_add0_id(req, id)) 694db522d3aSSimon L. B. Nielsen goto err; 695db522d3aSSimon L. B. Nielsen id = NULL; 696db522d3aSSimon L. B. Nielsen /* Add any extensions to the request */ 697db522d3aSSimon L. B. Nielsen SSL_get_tlsext_status_exts(s, &exts); 698db522d3aSSimon L. B. Nielsen for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) 699db522d3aSSimon L. B. Nielsen { 700db522d3aSSimon L. B. Nielsen X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i); 701db522d3aSSimon L. B. Nielsen if (!OCSP_REQUEST_add_ext(req, ext, -1)) 702db522d3aSSimon L. B. Nielsen goto err; 703db522d3aSSimon L. B. Nielsen } 704db522d3aSSimon L. B. Nielsen resp = process_responder(err, req, host, path, port, use_ssl, 705db522d3aSSimon L. B. Nielsen srctx->timeout); 706db522d3aSSimon L. B. Nielsen if (!resp) 707db522d3aSSimon L. B. Nielsen { 708db522d3aSSimon L. B. Nielsen BIO_puts(err, "cert_status: error querying responder\n"); 709db522d3aSSimon L. B. Nielsen goto done; 710db522d3aSSimon L. B. Nielsen } 711db522d3aSSimon L. B. Nielsen rspderlen = i2d_OCSP_RESPONSE(resp, &rspder); 712db522d3aSSimon L. B. Nielsen if (rspderlen <= 0) 713db522d3aSSimon L. B. Nielsen goto err; 714db522d3aSSimon L. B. Nielsen SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen); 715db522d3aSSimon L. B. Nielsen if (srctx->verbose) 716db522d3aSSimon L. B. Nielsen { 717db522d3aSSimon L. B. Nielsen BIO_puts(err, "cert_status: ocsp response sent:\n"); 718db522d3aSSimon L. B. Nielsen OCSP_RESPONSE_print(err, resp, 2); 719db522d3aSSimon L. B. Nielsen } 720db522d3aSSimon L. B. Nielsen ret = SSL_TLSEXT_ERR_OK; 721db522d3aSSimon L. B. Nielsen done: 722db522d3aSSimon L. B. Nielsen if (ret != SSL_TLSEXT_ERR_OK) 723db522d3aSSimon L. B. Nielsen ERR_print_errors(err); 724db522d3aSSimon L. B. Nielsen if (aia) 725db522d3aSSimon L. B. Nielsen { 726db522d3aSSimon L. B. Nielsen OPENSSL_free(host); 727db522d3aSSimon L. B. Nielsen OPENSSL_free(path); 728db522d3aSSimon L. B. Nielsen OPENSSL_free(port); 729db522d3aSSimon L. B. Nielsen X509_email_free(aia); 730db522d3aSSimon L. B. Nielsen } 731db522d3aSSimon L. B. Nielsen if (id) 732db522d3aSSimon L. B. Nielsen OCSP_CERTID_free(id); 733db522d3aSSimon L. B. Nielsen if (req) 734db522d3aSSimon L. B. Nielsen OCSP_REQUEST_free(req); 735db522d3aSSimon L. B. Nielsen if (resp) 736db522d3aSSimon L. B. Nielsen OCSP_RESPONSE_free(resp); 737db522d3aSSimon L. B. Nielsen return ret; 738db522d3aSSimon L. B. Nielsen err: 739db522d3aSSimon L. B. Nielsen ret = SSL_TLSEXT_ERR_ALERT_FATAL; 740db522d3aSSimon L. B. Nielsen goto done; 741db522d3aSSimon L. B. Nielsen } 742db522d3aSSimon L. B. Nielsen #endif 743f579bf8eSKris Kennaway int MAIN(int, char **); 744f579bf8eSKris Kennaway 745db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE 746db522d3aSSimon L. B. Nielsen static char *jpake_secret = NULL; 747db522d3aSSimon L. B. Nielsen #endif 748db522d3aSSimon L. B. Nielsen 74974664626SKris Kennaway int MAIN(int argc, char *argv[]) 75074664626SKris Kennaway { 7515c87c606SMark Murray X509_STORE *store = NULL; 7525c87c606SMark Murray int vflags = 0; 75374664626SKris Kennaway short port=PORT; 75474664626SKris Kennaway char *CApath=NULL,*CAfile=NULL; 7553b4e3dcbSSimon L. B. Nielsen unsigned char *context = NULL; 756f579bf8eSKris Kennaway char *dhfile = NULL; 7573b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_ECDH 7583b4e3dcbSSimon L. B. Nielsen char *named_curve = NULL; 7593b4e3dcbSSimon L. B. Nielsen #endif 76074664626SKris Kennaway int badop=0,bugs=0; 76174664626SKris Kennaway int ret=1; 76274664626SKris Kennaway int off=0; 7633b4e3dcbSSimon L. B. Nielsen int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0; 76474664626SKris Kennaway int state=0; 76574664626SKris Kennaway SSL_METHOD *meth=NULL; 766db522d3aSSimon L. B. Nielsen int socket_type=SOCK_STREAM; 7675c87c606SMark Murray ENGINE *e=NULL; 7685740a5e3SKris Kennaway char *inrand=NULL; 7693b4e3dcbSSimon L. B. Nielsen int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM; 7703b4e3dcbSSimon L. B. Nielsen char *passarg = NULL, *pass = NULL; 7713b4e3dcbSSimon L. B. Nielsen char *dpassarg = NULL, *dpass = NULL; 7723b4e3dcbSSimon L. B. Nielsen int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM; 7733b4e3dcbSSimon L. B. Nielsen X509 *s_cert = NULL, *s_dcert = NULL; 7743b4e3dcbSSimon L. B. Nielsen EVP_PKEY *s_key = NULL, *s_dkey = NULL; 775db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 776db522d3aSSimon L. B. Nielsen EVP_PKEY *s_key2 = NULL; 777db522d3aSSimon L. B. Nielsen X509 *s_cert2 = NULL; 778db522d3aSSimon L. B. Nielsen #endif 779db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 780db522d3aSSimon L. B. Nielsen tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING}; 781db522d3aSSimon L. B. Nielsen #endif 78274664626SKris Kennaway 7835c87c606SMark Murray #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) 78474664626SKris Kennaway meth=SSLv23_server_method(); 7855c87c606SMark Murray #elif !defined(OPENSSL_NO_SSL3) 78674664626SKris Kennaway meth=SSLv3_server_method(); 7875c87c606SMark Murray #elif !defined(OPENSSL_NO_SSL2) 78874664626SKris Kennaway meth=SSLv2_server_method(); 78974664626SKris Kennaway #endif 79074664626SKris Kennaway 79174664626SKris Kennaway local_argc=argc; 79274664626SKris Kennaway local_argv=argv; 79374664626SKris Kennaway 79474664626SKris Kennaway apps_startup(); 795f579bf8eSKris Kennaway #ifdef MONOLITH 796f579bf8eSKris Kennaway s_server_init(); 797f579bf8eSKris Kennaway #endif 79874664626SKris Kennaway 79974664626SKris Kennaway if (bio_err == NULL) 80074664626SKris Kennaway bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); 80174664626SKris Kennaway 8025c87c606SMark Murray if (!load_config(bio_err, NULL)) 8035c87c606SMark Murray goto end; 8045c87c606SMark Murray 80574664626SKris Kennaway verify_depth=0; 80674664626SKris Kennaway #ifdef FIONBIO 80774664626SKris Kennaway s_nbio=0; 80874664626SKris Kennaway #endif 80974664626SKris Kennaway s_nbio_test=0; 81074664626SKris Kennaway 81174664626SKris Kennaway argc--; 81274664626SKris Kennaway argv++; 81374664626SKris Kennaway 81474664626SKris Kennaway while (argc >= 1) 81574664626SKris Kennaway { 81674664626SKris Kennaway if ((strcmp(*argv,"-port") == 0) || 81774664626SKris Kennaway (strcmp(*argv,"-accept") == 0)) 81874664626SKris Kennaway { 81974664626SKris Kennaway if (--argc < 1) goto bad; 82074664626SKris Kennaway if (!extract_port(*(++argv),&port)) 82174664626SKris Kennaway goto bad; 82274664626SKris Kennaway } 82374664626SKris Kennaway else if (strcmp(*argv,"-verify") == 0) 82474664626SKris Kennaway { 82574664626SKris Kennaway s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE; 82674664626SKris Kennaway if (--argc < 1) goto bad; 82774664626SKris Kennaway verify_depth=atoi(*(++argv)); 82874664626SKris Kennaway BIO_printf(bio_err,"verify depth is %d\n",verify_depth); 82974664626SKris Kennaway } 83074664626SKris Kennaway else if (strcmp(*argv,"-Verify") == 0) 83174664626SKris Kennaway { 83274664626SKris Kennaway s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT| 83374664626SKris Kennaway SSL_VERIFY_CLIENT_ONCE; 83474664626SKris Kennaway if (--argc < 1) goto bad; 83574664626SKris Kennaway verify_depth=atoi(*(++argv)); 83674664626SKris Kennaway BIO_printf(bio_err,"verify depth is %d, must return a certificate\n",verify_depth); 83774664626SKris Kennaway } 83874664626SKris Kennaway else if (strcmp(*argv,"-context") == 0) 83974664626SKris Kennaway { 84074664626SKris Kennaway if (--argc < 1) goto bad; 8413b4e3dcbSSimon L. B. Nielsen context= (unsigned char *)*(++argv); 84274664626SKris Kennaway } 84374664626SKris Kennaway else if (strcmp(*argv,"-cert") == 0) 84474664626SKris Kennaway { 84574664626SKris Kennaway if (--argc < 1) goto bad; 84674664626SKris Kennaway s_cert_file= *(++argv); 84774664626SKris Kennaway } 8483b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-certform") == 0) 8493b4e3dcbSSimon L. B. Nielsen { 8503b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8513b4e3dcbSSimon L. B. Nielsen s_cert_format = str2fmt(*(++argv)); 8523b4e3dcbSSimon L. B. Nielsen } 85374664626SKris Kennaway else if (strcmp(*argv,"-key") == 0) 85474664626SKris Kennaway { 85574664626SKris Kennaway if (--argc < 1) goto bad; 85674664626SKris Kennaway s_key_file= *(++argv); 85774664626SKris Kennaway } 8583b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-keyform") == 0) 8593b4e3dcbSSimon L. B. Nielsen { 8603b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8613b4e3dcbSSimon L. B. Nielsen s_key_format = str2fmt(*(++argv)); 8623b4e3dcbSSimon L. B. Nielsen } 8633b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-pass") == 0) 8643b4e3dcbSSimon L. B. Nielsen { 8653b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8663b4e3dcbSSimon L. B. Nielsen passarg = *(++argv); 8673b4e3dcbSSimon L. B. Nielsen } 868f579bf8eSKris Kennaway else if (strcmp(*argv,"-dhparam") == 0) 869f579bf8eSKris Kennaway { 870f579bf8eSKris Kennaway if (--argc < 1) goto bad; 871f579bf8eSKris Kennaway dhfile = *(++argv); 872f579bf8eSKris Kennaway } 8733b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_ECDH 8743b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-named_curve") == 0) 8753b4e3dcbSSimon L. B. Nielsen { 8763b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8773b4e3dcbSSimon L. B. Nielsen named_curve = *(++argv); 8783b4e3dcbSSimon L. B. Nielsen } 8793b4e3dcbSSimon L. B. Nielsen #endif 8803b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-dcertform") == 0) 8813b4e3dcbSSimon L. B. Nielsen { 8823b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8833b4e3dcbSSimon L. B. Nielsen s_dcert_format = str2fmt(*(++argv)); 8843b4e3dcbSSimon L. B. Nielsen } 88574664626SKris Kennaway else if (strcmp(*argv,"-dcert") == 0) 88674664626SKris Kennaway { 88774664626SKris Kennaway if (--argc < 1) goto bad; 88874664626SKris Kennaway s_dcert_file= *(++argv); 88974664626SKris Kennaway } 8903b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-dkeyform") == 0) 8913b4e3dcbSSimon L. B. Nielsen { 8923b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8933b4e3dcbSSimon L. B. Nielsen s_dkey_format = str2fmt(*(++argv)); 8943b4e3dcbSSimon L. B. Nielsen } 8953b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-dpass") == 0) 8963b4e3dcbSSimon L. B. Nielsen { 8973b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 8983b4e3dcbSSimon L. B. Nielsen dpassarg = *(++argv); 8993b4e3dcbSSimon L. B. Nielsen } 90074664626SKris Kennaway else if (strcmp(*argv,"-dkey") == 0) 90174664626SKris Kennaway { 90274664626SKris Kennaway if (--argc < 1) goto bad; 90374664626SKris Kennaway s_dkey_file= *(++argv); 90474664626SKris Kennaway } 90574664626SKris Kennaway else if (strcmp(*argv,"-nocert") == 0) 90674664626SKris Kennaway { 90774664626SKris Kennaway nocert=1; 90874664626SKris Kennaway } 90974664626SKris Kennaway else if (strcmp(*argv,"-CApath") == 0) 91074664626SKris Kennaway { 91174664626SKris Kennaway if (--argc < 1) goto bad; 91274664626SKris Kennaway CApath= *(++argv); 91374664626SKris Kennaway } 9145c87c606SMark Murray else if (strcmp(*argv,"-crl_check") == 0) 9155c87c606SMark Murray { 9165c87c606SMark Murray vflags |= X509_V_FLAG_CRL_CHECK; 9175c87c606SMark Murray } 918db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-crl_check_all") == 0) 9195c87c606SMark Murray { 9205c87c606SMark Murray vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL; 9215c87c606SMark Murray } 9225c87c606SMark Murray else if (strcmp(*argv,"-serverpref") == 0) 9235c87c606SMark Murray { off|=SSL_OP_CIPHER_SERVER_PREFERENCE; } 92474664626SKris Kennaway else if (strcmp(*argv,"-cipher") == 0) 92574664626SKris Kennaway { 92674664626SKris Kennaway if (--argc < 1) goto bad; 92774664626SKris Kennaway cipher= *(++argv); 92874664626SKris Kennaway } 92974664626SKris Kennaway else if (strcmp(*argv,"-CAfile") == 0) 93074664626SKris Kennaway { 93174664626SKris Kennaway if (--argc < 1) goto bad; 93274664626SKris Kennaway CAfile= *(++argv); 93374664626SKris Kennaway } 93474664626SKris Kennaway #ifdef FIONBIO 93574664626SKris Kennaway else if (strcmp(*argv,"-nbio") == 0) 93674664626SKris Kennaway { s_nbio=1; } 93774664626SKris Kennaway #endif 93874664626SKris Kennaway else if (strcmp(*argv,"-nbio_test") == 0) 93974664626SKris Kennaway { 94074664626SKris Kennaway #ifdef FIONBIO 94174664626SKris Kennaway s_nbio=1; 94274664626SKris Kennaway #endif 94374664626SKris Kennaway s_nbio_test=1; 94474664626SKris Kennaway } 94574664626SKris Kennaway else if (strcmp(*argv,"-debug") == 0) 94674664626SKris Kennaway { s_debug=1; } 947db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 948db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-tlsextdebug") == 0) 949db522d3aSSimon L. B. Nielsen s_tlsextdebug=1; 950db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-status") == 0) 951db522d3aSSimon L. B. Nielsen s_tlsextstatus=1; 952db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-status_verbose") == 0) 953db522d3aSSimon L. B. Nielsen { 954db522d3aSSimon L. B. Nielsen s_tlsextstatus=1; 955db522d3aSSimon L. B. Nielsen tlscstatp.verbose = 1; 956db522d3aSSimon L. B. Nielsen } 957db522d3aSSimon L. B. Nielsen else if (!strcmp(*argv, "-status_timeout")) 958db522d3aSSimon L. B. Nielsen { 959db522d3aSSimon L. B. Nielsen s_tlsextstatus=1; 960db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 961db522d3aSSimon L. B. Nielsen tlscstatp.timeout = atoi(*(++argv)); 962db522d3aSSimon L. B. Nielsen } 963db522d3aSSimon L. B. Nielsen else if (!strcmp(*argv, "-status_url")) 964db522d3aSSimon L. B. Nielsen { 965db522d3aSSimon L. B. Nielsen s_tlsextstatus=1; 966db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 967db522d3aSSimon L. B. Nielsen if (!OCSP_parse_url(*(++argv), 968db522d3aSSimon L. B. Nielsen &tlscstatp.host, 969db522d3aSSimon L. B. Nielsen &tlscstatp.port, 970db522d3aSSimon L. B. Nielsen &tlscstatp.path, 971db522d3aSSimon L. B. Nielsen &tlscstatp.use_ssl)) 972db522d3aSSimon L. B. Nielsen { 973db522d3aSSimon L. B. Nielsen BIO_printf(bio_err, "Error parsing URL\n"); 974db522d3aSSimon L. B. Nielsen goto bad; 975db522d3aSSimon L. B. Nielsen } 976db522d3aSSimon L. B. Nielsen } 977db522d3aSSimon L. B. Nielsen #endif 9785c87c606SMark Murray else if (strcmp(*argv,"-msg") == 0) 9795c87c606SMark Murray { s_msg=1; } 98074664626SKris Kennaway else if (strcmp(*argv,"-hack") == 0) 98174664626SKris Kennaway { hack=1; } 98274664626SKris Kennaway else if (strcmp(*argv,"-state") == 0) 98374664626SKris Kennaway { state=1; } 98474664626SKris Kennaway else if (strcmp(*argv,"-crlf") == 0) 98574664626SKris Kennaway { s_crlf=1; } 98674664626SKris Kennaway else if (strcmp(*argv,"-quiet") == 0) 98774664626SKris Kennaway { s_quiet=1; } 98874664626SKris Kennaway else if (strcmp(*argv,"-bugs") == 0) 98974664626SKris Kennaway { bugs=1; } 99074664626SKris Kennaway else if (strcmp(*argv,"-no_tmp_rsa") == 0) 99174664626SKris Kennaway { no_tmp_rsa=1; } 99274664626SKris Kennaway else if (strcmp(*argv,"-no_dhe") == 0) 99374664626SKris Kennaway { no_dhe=1; } 9943b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-no_ecdhe") == 0) 9953b4e3dcbSSimon L. B. Nielsen { no_ecdhe=1; } 99674664626SKris Kennaway else if (strcmp(*argv,"-www") == 0) 99774664626SKris Kennaway { www=1; } 99874664626SKris Kennaway else if (strcmp(*argv,"-WWW") == 0) 99974664626SKris Kennaway { www=2; } 10005c87c606SMark Murray else if (strcmp(*argv,"-HTTP") == 0) 10015c87c606SMark Murray { www=3; } 100274664626SKris Kennaway else if (strcmp(*argv,"-no_ssl2") == 0) 100374664626SKris Kennaway { off|=SSL_OP_NO_SSLv2; } 100474664626SKris Kennaway else if (strcmp(*argv,"-no_ssl3") == 0) 100574664626SKris Kennaway { off|=SSL_OP_NO_SSLv3; } 100674664626SKris Kennaway else if (strcmp(*argv,"-no_tls1") == 0) 100774664626SKris Kennaway { off|=SSL_OP_NO_TLSv1; } 1008db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1009db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-no_ticket") == 0) 1010db522d3aSSimon L. B. Nielsen { off|=SSL_OP_NO_TICKET; } 1011db522d3aSSimon L. B. Nielsen #endif 10125c87c606SMark Murray #ifndef OPENSSL_NO_SSL2 101374664626SKris Kennaway else if (strcmp(*argv,"-ssl2") == 0) 101474664626SKris Kennaway { meth=SSLv2_server_method(); } 101574664626SKris Kennaway #endif 10165c87c606SMark Murray #ifndef OPENSSL_NO_SSL3 101774664626SKris Kennaway else if (strcmp(*argv,"-ssl3") == 0) 101874664626SKris Kennaway { meth=SSLv3_server_method(); } 101974664626SKris Kennaway #endif 10205c87c606SMark Murray #ifndef OPENSSL_NO_TLS1 102174664626SKris Kennaway else if (strcmp(*argv,"-tls1") == 0) 102274664626SKris Kennaway { meth=TLSv1_server_method(); } 102374664626SKris Kennaway #endif 10243b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_DTLS1 10253b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-dtls1") == 0) 10263b4e3dcbSSimon L. B. Nielsen { 10273b4e3dcbSSimon L. B. Nielsen meth=DTLSv1_server_method(); 1028db522d3aSSimon L. B. Nielsen socket_type = SOCK_DGRAM; 10293b4e3dcbSSimon L. B. Nielsen } 10303b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-timeout") == 0) 10313b4e3dcbSSimon L. B. Nielsen enable_timeouts = 1; 10323b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv,"-mtu") == 0) 10333b4e3dcbSSimon L. B. Nielsen { 10343b4e3dcbSSimon L. B. Nielsen if (--argc < 1) goto bad; 10353b4e3dcbSSimon L. B. Nielsen mtu = atol(*(++argv)); 10363b4e3dcbSSimon L. B. Nielsen } 10373b4e3dcbSSimon L. B. Nielsen else if (strcmp(*argv, "-chain") == 0) 10383b4e3dcbSSimon L. B. Nielsen cert_chain = 1; 10393b4e3dcbSSimon L. B. Nielsen #endif 10405c87c606SMark Murray else if (strcmp(*argv, "-id_prefix") == 0) 10415c87c606SMark Murray { 10425c87c606SMark Murray if (--argc < 1) goto bad; 10435c87c606SMark Murray session_id_prefix = *(++argv); 10445c87c606SMark Murray } 1045fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE 10465c87c606SMark Murray else if (strcmp(*argv,"-engine") == 0) 10475c87c606SMark Murray { 10485c87c606SMark Murray if (--argc < 1) goto bad; 10495c87c606SMark Murray engine_id= *(++argv); 10505c87c606SMark Murray } 1051fceca8a3SJacques Vidrine #endif 10525740a5e3SKris Kennaway else if (strcmp(*argv,"-rand") == 0) 10535740a5e3SKris Kennaway { 10545740a5e3SKris Kennaway if (--argc < 1) goto bad; 10555740a5e3SKris Kennaway inrand= *(++argv); 10565740a5e3SKris Kennaway } 1057db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1058db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-servername") == 0) 1059db522d3aSSimon L. B. Nielsen { 1060db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 1061db522d3aSSimon L. B. Nielsen tlsextcbp.servername= *(++argv); 1062db522d3aSSimon L. B. Nielsen } 1063db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-servername_fatal") == 0) 1064db522d3aSSimon L. B. Nielsen { tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL; } 1065db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-cert2") == 0) 1066db522d3aSSimon L. B. Nielsen { 1067db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 1068db522d3aSSimon L. B. Nielsen s_cert_file2= *(++argv); 1069db522d3aSSimon L. B. Nielsen } 1070db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-key2") == 0) 1071db522d3aSSimon L. B. Nielsen { 1072db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 1073db522d3aSSimon L. B. Nielsen s_key_file2= *(++argv); 1074db522d3aSSimon L. B. Nielsen } 1075db522d3aSSimon L. B. Nielsen 1076db522d3aSSimon L. B. Nielsen #endif 1077db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE 1078db522d3aSSimon L. B. Nielsen else if (strcmp(*argv,"-jpake") == 0) 1079db522d3aSSimon L. B. Nielsen { 1080db522d3aSSimon L. B. Nielsen if (--argc < 1) goto bad; 1081db522d3aSSimon L. B. Nielsen jpake_secret = *(++argv); 1082db522d3aSSimon L. B. Nielsen } 1083db522d3aSSimon L. B. Nielsen #endif 108474664626SKris Kennaway else 108574664626SKris Kennaway { 108674664626SKris Kennaway BIO_printf(bio_err,"unknown option %s\n",*argv); 108774664626SKris Kennaway badop=1; 108874664626SKris Kennaway break; 108974664626SKris Kennaway } 109074664626SKris Kennaway argc--; 109174664626SKris Kennaway argv++; 109274664626SKris Kennaway } 109374664626SKris Kennaway if (badop) 109474664626SKris Kennaway { 109574664626SKris Kennaway bad: 109674664626SKris Kennaway sv_usage(); 109774664626SKris Kennaway goto end; 109874664626SKris Kennaway } 109974664626SKris Kennaway 11005c87c606SMark Murray SSL_load_error_strings(); 11015c87c606SMark Murray OpenSSL_add_ssl_algorithms(); 11025c87c606SMark Murray 1103fceca8a3SJacques Vidrine #ifndef OPENSSL_NO_ENGINE 11045c87c606SMark Murray e = setup_engine(bio_err, engine_id, 1); 1105fceca8a3SJacques Vidrine #endif 11065c87c606SMark Murray 11073b4e3dcbSSimon L. B. Nielsen if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass)) 11083b4e3dcbSSimon L. B. Nielsen { 11093b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err, "Error getting password\n"); 11103b4e3dcbSSimon L. B. Nielsen goto end; 11113b4e3dcbSSimon L. B. Nielsen } 11123b4e3dcbSSimon L. B. Nielsen 11133b4e3dcbSSimon L. B. Nielsen 11143b4e3dcbSSimon L. B. Nielsen if (s_key_file == NULL) 11153b4e3dcbSSimon L. B. Nielsen s_key_file = s_cert_file; 1116db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1117db522d3aSSimon L. B. Nielsen if (s_key_file2 == NULL) 1118db522d3aSSimon L. B. Nielsen s_key_file2 = s_cert_file2; 1119db522d3aSSimon L. B. Nielsen #endif 11203b4e3dcbSSimon L. B. Nielsen 11213b4e3dcbSSimon L. B. Nielsen if (nocert == 0) 11223b4e3dcbSSimon L. B. Nielsen { 11233b4e3dcbSSimon L. B. Nielsen s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e, 11243b4e3dcbSSimon L. B. Nielsen "server certificate private key file"); 11253b4e3dcbSSimon L. B. Nielsen if (!s_key) 11263b4e3dcbSSimon L. B. Nielsen { 11273b4e3dcbSSimon L. B. Nielsen ERR_print_errors(bio_err); 11283b4e3dcbSSimon L. B. Nielsen goto end; 11293b4e3dcbSSimon L. B. Nielsen } 11303b4e3dcbSSimon L. B. Nielsen 11313b4e3dcbSSimon L. B. Nielsen s_cert = load_cert(bio_err,s_cert_file,s_cert_format, 11323b4e3dcbSSimon L. B. Nielsen NULL, e, "server certificate file"); 11333b4e3dcbSSimon L. B. Nielsen 11343b4e3dcbSSimon L. B. Nielsen if (!s_cert) 11353b4e3dcbSSimon L. B. Nielsen { 11363b4e3dcbSSimon L. B. Nielsen ERR_print_errors(bio_err); 11373b4e3dcbSSimon L. B. Nielsen goto end; 11383b4e3dcbSSimon L. B. Nielsen } 1139db522d3aSSimon L. B. Nielsen 1140db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1141db522d3aSSimon L. B. Nielsen if (tlsextcbp.servername) 1142db522d3aSSimon L. B. Nielsen { 1143db522d3aSSimon L. B. Nielsen s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e, 1144db522d3aSSimon L. B. Nielsen "second server certificate private key file"); 1145db522d3aSSimon L. B. Nielsen if (!s_key2) 1146db522d3aSSimon L. B. Nielsen { 1147db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1148db522d3aSSimon L. B. Nielsen goto end; 11493b4e3dcbSSimon L. B. Nielsen } 11503b4e3dcbSSimon L. B. Nielsen 1151db522d3aSSimon L. B. Nielsen s_cert2 = load_cert(bio_err,s_cert_file2,s_cert_format, 1152db522d3aSSimon L. B. Nielsen NULL, e, "second server certificate file"); 1153db522d3aSSimon L. B. Nielsen 1154db522d3aSSimon L. B. Nielsen if (!s_cert2) 1155db522d3aSSimon L. B. Nielsen { 1156db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1157db522d3aSSimon L. B. Nielsen goto end; 1158db522d3aSSimon L. B. Nielsen } 1159db522d3aSSimon L. B. Nielsen } 1160db522d3aSSimon L. B. Nielsen #endif 1161db522d3aSSimon L. B. Nielsen } 11623b4e3dcbSSimon L. B. Nielsen if (s_dcert_file) 11633b4e3dcbSSimon L. B. Nielsen { 11643b4e3dcbSSimon L. B. Nielsen 11653b4e3dcbSSimon L. B. Nielsen if (s_dkey_file == NULL) 11663b4e3dcbSSimon L. B. Nielsen s_dkey_file = s_dcert_file; 11673b4e3dcbSSimon L. B. Nielsen 11683b4e3dcbSSimon L. B. Nielsen s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format, 11693b4e3dcbSSimon L. B. Nielsen 0, dpass, e, 11703b4e3dcbSSimon L. B. Nielsen "second certificate private key file"); 11713b4e3dcbSSimon L. B. Nielsen if (!s_dkey) 11723b4e3dcbSSimon L. B. Nielsen { 11733b4e3dcbSSimon L. B. Nielsen ERR_print_errors(bio_err); 11743b4e3dcbSSimon L. B. Nielsen goto end; 11753b4e3dcbSSimon L. B. Nielsen } 11763b4e3dcbSSimon L. B. Nielsen 11773b4e3dcbSSimon L. B. Nielsen s_dcert = load_cert(bio_err,s_dcert_file,s_dcert_format, 11783b4e3dcbSSimon L. B. Nielsen NULL, e, "second server certificate file"); 11793b4e3dcbSSimon L. B. Nielsen 11803b4e3dcbSSimon L. B. Nielsen if (!s_dcert) 11813b4e3dcbSSimon L. B. Nielsen { 11823b4e3dcbSSimon L. B. Nielsen ERR_print_errors(bio_err); 11833b4e3dcbSSimon L. B. Nielsen goto end; 11843b4e3dcbSSimon L. B. Nielsen } 11853b4e3dcbSSimon L. B. Nielsen 11863b4e3dcbSSimon L. B. Nielsen } 11873b4e3dcbSSimon L. B. Nielsen 11885740a5e3SKris Kennaway if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL 11895740a5e3SKris Kennaway && !RAND_status()) 11905740a5e3SKris Kennaway { 11915740a5e3SKris Kennaway BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n"); 11925740a5e3SKris Kennaway } 11935740a5e3SKris Kennaway if (inrand != NULL) 11945740a5e3SKris Kennaway BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 11955740a5e3SKris Kennaway app_RAND_load_files(inrand)); 1196f579bf8eSKris Kennaway 119774664626SKris Kennaway if (bio_s_out == NULL) 119874664626SKris Kennaway { 11995c87c606SMark Murray if (s_quiet && !s_debug && !s_msg) 120074664626SKris Kennaway { 120174664626SKris Kennaway bio_s_out=BIO_new(BIO_s_null()); 120274664626SKris Kennaway } 120374664626SKris Kennaway else 120474664626SKris Kennaway { 120574664626SKris Kennaway if (bio_s_out == NULL) 120674664626SKris Kennaway bio_s_out=BIO_new_fp(stdout,BIO_NOCLOSE); 120774664626SKris Kennaway } 120874664626SKris Kennaway } 120974664626SKris Kennaway 12103b4e3dcbSSimon L. B. Nielsen #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA) 121174664626SKris Kennaway if (nocert) 121274664626SKris Kennaway #endif 121374664626SKris Kennaway { 121474664626SKris Kennaway s_cert_file=NULL; 121574664626SKris Kennaway s_key_file=NULL; 121674664626SKris Kennaway s_dcert_file=NULL; 121774664626SKris Kennaway s_dkey_file=NULL; 1218db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1219db522d3aSSimon L. B. Nielsen s_cert_file2=NULL; 1220db522d3aSSimon L. B. Nielsen s_key_file2=NULL; 1221db522d3aSSimon L. B. Nielsen #endif 122274664626SKris Kennaway } 122374664626SKris Kennaway 122474664626SKris Kennaway ctx=SSL_CTX_new(meth); 122574664626SKris Kennaway if (ctx == NULL) 122674664626SKris Kennaway { 122774664626SKris Kennaway ERR_print_errors(bio_err); 122874664626SKris Kennaway goto end; 122974664626SKris Kennaway } 12305c87c606SMark Murray if (session_id_prefix) 12315c87c606SMark Murray { 12325c87c606SMark Murray if(strlen(session_id_prefix) >= 32) 12335c87c606SMark Murray BIO_printf(bio_err, 12345c87c606SMark Murray "warning: id_prefix is too long, only one new session will be possible\n"); 12355c87c606SMark Murray else if(strlen(session_id_prefix) >= 16) 12365c87c606SMark Murray BIO_printf(bio_err, 12375c87c606SMark Murray "warning: id_prefix is too long if you use SSLv2\n"); 12385c87c606SMark Murray if(!SSL_CTX_set_generate_session_id(ctx, generate_session_id)) 12395c87c606SMark Murray { 12405c87c606SMark Murray BIO_printf(bio_err,"error setting 'id_prefix'\n"); 12415c87c606SMark Murray ERR_print_errors(bio_err); 12425c87c606SMark Murray goto end; 12435c87c606SMark Murray } 12445c87c606SMark Murray BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix); 12455c87c606SMark Murray } 124674664626SKris Kennaway SSL_CTX_set_quiet_shutdown(ctx,1); 124774664626SKris Kennaway if (bugs) SSL_CTX_set_options(ctx,SSL_OP_ALL); 124874664626SKris Kennaway if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG); 124974664626SKris Kennaway SSL_CTX_set_options(ctx,off); 12503b4e3dcbSSimon L. B. Nielsen /* DTLS: partial reads end up discarding unread UDP bytes :-( 12513b4e3dcbSSimon L. B. Nielsen * Setting read ahead solves this problem. 12523b4e3dcbSSimon L. B. Nielsen */ 1253db522d3aSSimon L. B. Nielsen if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1); 125474664626SKris Kennaway 125574664626SKris Kennaway if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback); 125674664626SKris Kennaway 125774664626SKris Kennaway SSL_CTX_sess_set_cache_size(ctx,128); 125874664626SKris Kennaway 125974664626SKris Kennaway #if 0 126074664626SKris Kennaway if (cipher == NULL) cipher=getenv("SSL_CIPHER"); 126174664626SKris Kennaway #endif 126274664626SKris Kennaway 126374664626SKris Kennaway #if 0 126474664626SKris Kennaway if (s_cert_file == NULL) 126574664626SKris Kennaway { 126674664626SKris Kennaway BIO_printf(bio_err,"You must specify a certificate file for the server to use\n"); 126774664626SKris Kennaway goto end; 126874664626SKris Kennaway } 126974664626SKris Kennaway #endif 127074664626SKris Kennaway 127174664626SKris Kennaway if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) || 127274664626SKris Kennaway (!SSL_CTX_set_default_verify_paths(ctx))) 127374664626SKris Kennaway { 127474664626SKris Kennaway /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */ 127574664626SKris Kennaway ERR_print_errors(bio_err); 127674664626SKris Kennaway /* goto end; */ 127774664626SKris Kennaway } 12785c87c606SMark Murray store = SSL_CTX_get_cert_store(ctx); 12795c87c606SMark Murray X509_STORE_set_flags(store, vflags); 1280db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1281db522d3aSSimon L. B. Nielsen if (s_cert2) 1282db522d3aSSimon L. B. Nielsen { 1283db522d3aSSimon L. B. Nielsen ctx2=SSL_CTX_new(meth); 1284db522d3aSSimon L. B. Nielsen if (ctx2 == NULL) 1285db522d3aSSimon L. B. Nielsen { 1286db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1287db522d3aSSimon L. B. Nielsen goto end; 1288db522d3aSSimon L. B. Nielsen } 1289db522d3aSSimon L. B. Nielsen } 1290db522d3aSSimon L. B. Nielsen 1291db522d3aSSimon L. B. Nielsen if (ctx2) 1292db522d3aSSimon L. B. Nielsen { 1293db522d3aSSimon L. B. Nielsen BIO_printf(bio_s_out,"Setting secondary ctx parameters\n"); 1294db522d3aSSimon L. B. Nielsen 1295db522d3aSSimon L. B. Nielsen if (session_id_prefix) 1296db522d3aSSimon L. B. Nielsen { 1297db522d3aSSimon L. B. Nielsen if(strlen(session_id_prefix) >= 32) 1298db522d3aSSimon L. B. Nielsen BIO_printf(bio_err, 1299db522d3aSSimon L. B. Nielsen "warning: id_prefix is too long, only one new session will be possible\n"); 1300db522d3aSSimon L. B. Nielsen else if(strlen(session_id_prefix) >= 16) 1301db522d3aSSimon L. B. Nielsen BIO_printf(bio_err, 1302db522d3aSSimon L. B. Nielsen "warning: id_prefix is too long if you use SSLv2\n"); 1303db522d3aSSimon L. B. Nielsen if(!SSL_CTX_set_generate_session_id(ctx2, generate_session_id)) 1304db522d3aSSimon L. B. Nielsen { 1305db522d3aSSimon L. B. Nielsen BIO_printf(bio_err,"error setting 'id_prefix'\n"); 1306db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1307db522d3aSSimon L. B. Nielsen goto end; 1308db522d3aSSimon L. B. Nielsen } 1309db522d3aSSimon L. B. Nielsen BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix); 1310db522d3aSSimon L. B. Nielsen } 1311db522d3aSSimon L. B. Nielsen SSL_CTX_set_quiet_shutdown(ctx2,1); 1312db522d3aSSimon L. B. Nielsen if (bugs) SSL_CTX_set_options(ctx2,SSL_OP_ALL); 1313db522d3aSSimon L. B. Nielsen if (hack) SSL_CTX_set_options(ctx2,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG); 1314db522d3aSSimon L. B. Nielsen SSL_CTX_set_options(ctx2,off); 1315db522d3aSSimon L. B. Nielsen 1316db522d3aSSimon L. B. Nielsen /* DTLS: partial reads end up discarding unread UDP bytes :-( 1317db522d3aSSimon L. B. Nielsen * Setting read ahead solves this problem. 1318db522d3aSSimon L. B. Nielsen */ 1319db522d3aSSimon L. B. Nielsen if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx2, 1); 1320db522d3aSSimon L. B. Nielsen 1321db522d3aSSimon L. B. Nielsen 1322db522d3aSSimon L. B. Nielsen if (state) SSL_CTX_set_info_callback(ctx2,apps_ssl_info_callback); 1323db522d3aSSimon L. B. Nielsen 1324db522d3aSSimon L. B. Nielsen SSL_CTX_sess_set_cache_size(ctx2,128); 1325db522d3aSSimon L. B. Nielsen 1326db522d3aSSimon L. B. Nielsen if ((!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) || 1327db522d3aSSimon L. B. Nielsen (!SSL_CTX_set_default_verify_paths(ctx2))) 1328db522d3aSSimon L. B. Nielsen { 1329db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1330db522d3aSSimon L. B. Nielsen } 1331db522d3aSSimon L. B. Nielsen store = SSL_CTX_get_cert_store(ctx2); 1332db522d3aSSimon L. B. Nielsen X509_STORE_set_flags(store, vflags); 1333db522d3aSSimon L. B. Nielsen } 1334db522d3aSSimon L. B. Nielsen #endif 1335db522d3aSSimon L. B. Nielsen 133674664626SKris Kennaway 13375c87c606SMark Murray #ifndef OPENSSL_NO_DH 133874664626SKris Kennaway if (!no_dhe) 133974664626SKris Kennaway { 13405c87c606SMark Murray DH *dh=NULL; 13415c87c606SMark Murray 13425c87c606SMark Murray if (dhfile) 13435c87c606SMark Murray dh = load_dh_param(dhfile); 13445c87c606SMark Murray else if (s_cert_file) 13455c87c606SMark Murray dh = load_dh_param(s_cert_file); 13465c87c606SMark Murray 134774664626SKris Kennaway if (dh != NULL) 134874664626SKris Kennaway { 134974664626SKris Kennaway BIO_printf(bio_s_out,"Setting temp DH parameters\n"); 135074664626SKris Kennaway } 135174664626SKris Kennaway else 135274664626SKris Kennaway { 135374664626SKris Kennaway BIO_printf(bio_s_out,"Using default temp DH parameters\n"); 135474664626SKris Kennaway dh=get_dh512(); 135574664626SKris Kennaway } 135674664626SKris Kennaway (void)BIO_flush(bio_s_out); 135774664626SKris Kennaway 135874664626SKris Kennaway SSL_CTX_set_tmp_dh(ctx,dh); 1359db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1360db522d3aSSimon L. B. Nielsen if (ctx2) 1361db522d3aSSimon L. B. Nielsen { 1362db522d3aSSimon L. B. Nielsen if (!dhfile) 1363db522d3aSSimon L. B. Nielsen { 1364db522d3aSSimon L. B. Nielsen DH *dh2=load_dh_param(s_cert_file2); 1365db522d3aSSimon L. B. Nielsen if (dh2 != NULL) 1366db522d3aSSimon L. B. Nielsen { 1367db522d3aSSimon L. B. Nielsen BIO_printf(bio_s_out,"Setting temp DH parameters\n"); 1368db522d3aSSimon L. B. Nielsen (void)BIO_flush(bio_s_out); 1369db522d3aSSimon L. B. Nielsen 1370db522d3aSSimon L. B. Nielsen DH_free(dh); 1371db522d3aSSimon L. B. Nielsen dh = dh2; 1372db522d3aSSimon L. B. Nielsen } 1373db522d3aSSimon L. B. Nielsen } 1374db522d3aSSimon L. B. Nielsen SSL_CTX_set_tmp_dh(ctx2,dh); 1375db522d3aSSimon L. B. Nielsen } 1376db522d3aSSimon L. B. Nielsen #endif 137774664626SKris Kennaway DH_free(dh); 137874664626SKris Kennaway } 137974664626SKris Kennaway #endif 138074664626SKris Kennaway 13813b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_ECDH 13823b4e3dcbSSimon L. B. Nielsen if (!no_ecdhe) 138374664626SKris Kennaway { 13843b4e3dcbSSimon L. B. Nielsen EC_KEY *ecdh=NULL; 13853b4e3dcbSSimon L. B. Nielsen 13863b4e3dcbSSimon L. B. Nielsen if (named_curve) 13873b4e3dcbSSimon L. B. Nielsen { 13883b4e3dcbSSimon L. B. Nielsen int nid = OBJ_sn2nid(named_curve); 13893b4e3dcbSSimon L. B. Nielsen 13903b4e3dcbSSimon L. B. Nielsen if (nid == 0) 13913b4e3dcbSSimon L. B. Nielsen { 13923b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err, "unknown curve name (%s)\n", 13933b4e3dcbSSimon L. B. Nielsen named_curve); 13943b4e3dcbSSimon L. B. Nielsen goto end; 13953b4e3dcbSSimon L. B. Nielsen } 13963b4e3dcbSSimon L. B. Nielsen ecdh = EC_KEY_new_by_curve_name(nid); 13973b4e3dcbSSimon L. B. Nielsen if (ecdh == NULL) 13983b4e3dcbSSimon L. B. Nielsen { 13993b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err, "unable to create curve (%s)\n", 14003b4e3dcbSSimon L. B. Nielsen named_curve); 14013b4e3dcbSSimon L. B. Nielsen goto end; 14023b4e3dcbSSimon L. B. Nielsen } 14033b4e3dcbSSimon L. B. Nielsen } 14043b4e3dcbSSimon L. B. Nielsen 14053b4e3dcbSSimon L. B. Nielsen if (ecdh != NULL) 14063b4e3dcbSSimon L. B. Nielsen { 14073b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_s_out,"Setting temp ECDH parameters\n"); 14083b4e3dcbSSimon L. B. Nielsen } 14093b4e3dcbSSimon L. B. Nielsen else 14103b4e3dcbSSimon L. B. Nielsen { 14113b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_s_out,"Using default temp ECDH parameters\n"); 14123b4e3dcbSSimon L. B. Nielsen ecdh = EC_KEY_new_by_curve_name(NID_sect163r2); 14133b4e3dcbSSimon L. B. Nielsen if (ecdh == NULL) 14143b4e3dcbSSimon L. B. Nielsen { 14153b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err, "unable to create curve (sect163r2)\n"); 14163b4e3dcbSSimon L. B. Nielsen goto end; 14173b4e3dcbSSimon L. B. Nielsen } 14183b4e3dcbSSimon L. B. Nielsen } 14193b4e3dcbSSimon L. B. Nielsen (void)BIO_flush(bio_s_out); 14203b4e3dcbSSimon L. B. Nielsen 14213b4e3dcbSSimon L. B. Nielsen SSL_CTX_set_tmp_ecdh(ctx,ecdh); 1422db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1423db522d3aSSimon L. B. Nielsen if (ctx2) 1424db522d3aSSimon L. B. Nielsen SSL_CTX_set_tmp_ecdh(ctx2,ecdh); 1425db522d3aSSimon L. B. Nielsen #endif 14263b4e3dcbSSimon L. B. Nielsen EC_KEY_free(ecdh); 14273b4e3dcbSSimon L. B. Nielsen } 14283b4e3dcbSSimon L. B. Nielsen #endif 14293b4e3dcbSSimon L. B. Nielsen 14303b4e3dcbSSimon L. B. Nielsen if (!set_cert_key_stuff(ctx,s_cert,s_key)) 14313b4e3dcbSSimon L. B. Nielsen goto end; 1432db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1433db522d3aSSimon L. B. Nielsen if (ctx2 && !set_cert_key_stuff(ctx2,s_cert2,s_key2)) 1434db522d3aSSimon L. B. Nielsen goto end; 1435db522d3aSSimon L. B. Nielsen #endif 14363b4e3dcbSSimon L. B. Nielsen if (s_dcert != NULL) 14373b4e3dcbSSimon L. B. Nielsen { 14383b4e3dcbSSimon L. B. Nielsen if (!set_cert_key_stuff(ctx,s_dcert,s_dkey)) 143974664626SKris Kennaway goto end; 144074664626SKris Kennaway } 144174664626SKris Kennaway 14425c87c606SMark Murray #ifndef OPENSSL_NO_RSA 144374664626SKris Kennaway #if 1 14445740a5e3SKris Kennaway if (!no_tmp_rsa) 1445db522d3aSSimon L. B. Nielsen { 144674664626SKris Kennaway SSL_CTX_set_tmp_rsa_callback(ctx,tmp_rsa_cb); 1447db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1448db522d3aSSimon L. B. Nielsen if (ctx2) 1449db522d3aSSimon L. B. Nielsen SSL_CTX_set_tmp_rsa_callback(ctx2,tmp_rsa_cb); 1450db522d3aSSimon L. B. Nielsen #endif 1451db522d3aSSimon L. B. Nielsen } 145274664626SKris Kennaway #else 145374664626SKris Kennaway if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx)) 145474664626SKris Kennaway { 145574664626SKris Kennaway RSA *rsa; 145674664626SKris Kennaway 145774664626SKris Kennaway BIO_printf(bio_s_out,"Generating temp (512 bit) RSA key..."); 145874664626SKris Kennaway BIO_flush(bio_s_out); 145974664626SKris Kennaway 146074664626SKris Kennaway rsa=RSA_generate_key(512,RSA_F4,NULL); 146174664626SKris Kennaway 146274664626SKris Kennaway if (!SSL_CTX_set_tmp_rsa(ctx,rsa)) 146374664626SKris Kennaway { 146474664626SKris Kennaway ERR_print_errors(bio_err); 146574664626SKris Kennaway goto end; 146674664626SKris Kennaway } 1467db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1468db522d3aSSimon L. B. Nielsen if (ctx2) 1469db522d3aSSimon L. B. Nielsen { 1470db522d3aSSimon L. B. Nielsen if (!SSL_CTX_set_tmp_rsa(ctx2,rsa)) 1471db522d3aSSimon L. B. Nielsen { 1472db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1473db522d3aSSimon L. B. Nielsen goto end; 1474db522d3aSSimon L. B. Nielsen } 1475db522d3aSSimon L. B. Nielsen } 1476db522d3aSSimon L. B. Nielsen #endif 147774664626SKris Kennaway RSA_free(rsa); 147874664626SKris Kennaway BIO_printf(bio_s_out,"\n"); 147974664626SKris Kennaway } 148074664626SKris Kennaway #endif 148174664626SKris Kennaway #endif 148274664626SKris Kennaway 148374664626SKris Kennaway if (cipher != NULL) 1484f579bf8eSKris Kennaway if(!SSL_CTX_set_cipher_list(ctx,cipher)) { 1485f579bf8eSKris Kennaway BIO_printf(bio_err,"error setting cipher list\n"); 1486f579bf8eSKris Kennaway ERR_print_errors(bio_err); 1487f579bf8eSKris Kennaway goto end; 1488db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1489db522d3aSSimon L. B. Nielsen if (ctx2 && !SSL_CTX_set_cipher_list(ctx2,cipher)) 1490db522d3aSSimon L. B. Nielsen { 1491db522d3aSSimon L. B. Nielsen BIO_printf(bio_err,"error setting cipher list\n"); 1492db522d3aSSimon L. B. Nielsen ERR_print_errors(bio_err); 1493db522d3aSSimon L. B. Nielsen goto end; 1494db522d3aSSimon L. B. Nielsen } 1495db522d3aSSimon L. B. Nielsen #endif 1496f579bf8eSKris Kennaway } 149774664626SKris Kennaway SSL_CTX_set_verify(ctx,s_server_verify,verify_callback); 149874664626SKris Kennaway SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context, 149974664626SKris Kennaway sizeof s_server_session_id_context); 150074664626SKris Kennaway 1501db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1502db522d3aSSimon L. B. Nielsen if (ctx2) 1503db522d3aSSimon L. B. Nielsen { 1504db522d3aSSimon L. B. Nielsen SSL_CTX_set_verify(ctx2,s_server_verify,verify_callback); 1505db522d3aSSimon L. B. Nielsen SSL_CTX_set_session_id_context(ctx2,(void*)&s_server_session_id_context, 1506db522d3aSSimon L. B. Nielsen sizeof s_server_session_id_context); 150774664626SKris Kennaway 1508db522d3aSSimon L. B. Nielsen tlsextcbp.biodebug = bio_s_out; 1509db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb); 1510db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp); 1511db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb); 1512db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp); 1513db522d3aSSimon L. B. Nielsen } 1514db522d3aSSimon L. B. Nielsen #endif 1515db522d3aSSimon L. B. Nielsen if (CAfile != NULL) 1516db522d3aSSimon L. B. Nielsen { 1517db522d3aSSimon L. B. Nielsen SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile)); 1518db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1519db522d3aSSimon L. B. Nielsen if (ctx2) 1520db522d3aSSimon L. B. Nielsen SSL_CTX_set_client_CA_list(ctx2,SSL_load_client_CA_file(CAfile)); 1521db522d3aSSimon L. B. Nielsen #endif 1522db522d3aSSimon L. B. Nielsen } 152374664626SKris Kennaway BIO_printf(bio_s_out,"ACCEPT\n"); 152474664626SKris Kennaway if (www) 1525db522d3aSSimon L. B. Nielsen do_server(port,socket_type,&accept_socket,www_body, context); 152674664626SKris Kennaway else 1527db522d3aSSimon L. B. Nielsen do_server(port,socket_type,&accept_socket,sv_body, context); 152874664626SKris Kennaway print_stats(bio_s_out,ctx); 152974664626SKris Kennaway ret=0; 153074664626SKris Kennaway end: 153174664626SKris Kennaway if (ctx != NULL) SSL_CTX_free(ctx); 15323b4e3dcbSSimon L. B. Nielsen if (s_cert) 15333b4e3dcbSSimon L. B. Nielsen X509_free(s_cert); 15343b4e3dcbSSimon L. B. Nielsen if (s_dcert) 15353b4e3dcbSSimon L. B. Nielsen X509_free(s_dcert); 15363b4e3dcbSSimon L. B. Nielsen if (s_key) 15373b4e3dcbSSimon L. B. Nielsen EVP_PKEY_free(s_key); 15383b4e3dcbSSimon L. B. Nielsen if (s_dkey) 15393b4e3dcbSSimon L. B. Nielsen EVP_PKEY_free(s_dkey); 15403b4e3dcbSSimon L. B. Nielsen if (pass) 15413b4e3dcbSSimon L. B. Nielsen OPENSSL_free(pass); 15423b4e3dcbSSimon L. B. Nielsen if (dpass) 15433b4e3dcbSSimon L. B. Nielsen OPENSSL_free(dpass); 1544db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1545db522d3aSSimon L. B. Nielsen if (ctx2 != NULL) SSL_CTX_free(ctx2); 1546db522d3aSSimon L. B. Nielsen if (s_cert2) 1547db522d3aSSimon L. B. Nielsen X509_free(s_cert2); 1548db522d3aSSimon L. B. Nielsen if (s_key2) 1549db522d3aSSimon L. B. Nielsen EVP_PKEY_free(s_key2); 1550db522d3aSSimon L. B. Nielsen #endif 155174664626SKris Kennaway if (bio_s_out != NULL) 155274664626SKris Kennaway { 155374664626SKris Kennaway BIO_free(bio_s_out); 155474664626SKris Kennaway bio_s_out=NULL; 155574664626SKris Kennaway } 15565c87c606SMark Murray apps_shutdown(); 15575c87c606SMark Murray OPENSSL_EXIT(ret); 155874664626SKris Kennaway } 155974664626SKris Kennaway 156074664626SKris Kennaway static void print_stats(BIO *bio, SSL_CTX *ssl_ctx) 156174664626SKris Kennaway { 156274664626SKris Kennaway BIO_printf(bio,"%4ld items in the session cache\n", 156374664626SKris Kennaway SSL_CTX_sess_number(ssl_ctx)); 15643b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld client connects (SSL_connect())\n", 156574664626SKris Kennaway SSL_CTX_sess_connect(ssl_ctx)); 15663b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n", 156774664626SKris Kennaway SSL_CTX_sess_connect_renegotiate(ssl_ctx)); 15683b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld client connects that finished\n", 156974664626SKris Kennaway SSL_CTX_sess_connect_good(ssl_ctx)); 15703b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld server accepts (SSL_accept())\n", 157174664626SKris Kennaway SSL_CTX_sess_accept(ssl_ctx)); 15723b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n", 157374664626SKris Kennaway SSL_CTX_sess_accept_renegotiate(ssl_ctx)); 15743b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld server accepts that finished\n", 157574664626SKris Kennaway SSL_CTX_sess_accept_good(ssl_ctx)); 15763b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx)); 15773b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx)); 15783b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx)); 15793b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx)); 15803b4e3dcbSSimon L. B. Nielsen BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n", 158174664626SKris Kennaway SSL_CTX_sess_cache_full(ssl_ctx), 158274664626SKris Kennaway SSL_CTX_sess_get_cache_size(ssl_ctx)); 158374664626SKris Kennaway } 158474664626SKris Kennaway 158574664626SKris Kennaway static int sv_body(char *hostname, int s, unsigned char *context) 158674664626SKris Kennaway { 158774664626SKris Kennaway char *buf=NULL; 158874664626SKris Kennaway fd_set readfds; 158974664626SKris Kennaway int ret=1,width; 159074664626SKris Kennaway int k,i; 159174664626SKris Kennaway unsigned long l; 159274664626SKris Kennaway SSL *con=NULL; 159374664626SKris Kennaway BIO *sbio; 15943b4e3dcbSSimon L. B. Nielsen #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) 1595f579bf8eSKris Kennaway struct timeval tv; 1596f579bf8eSKris Kennaway #endif 159774664626SKris Kennaway 1598ddd58736SKris Kennaway if ((buf=OPENSSL_malloc(bufsize)) == NULL) 159974664626SKris Kennaway { 160074664626SKris Kennaway BIO_printf(bio_err,"out of memory\n"); 160174664626SKris Kennaway goto err; 160274664626SKris Kennaway } 160374664626SKris Kennaway #ifdef FIONBIO 160474664626SKris Kennaway if (s_nbio) 160574664626SKris Kennaway { 160674664626SKris Kennaway unsigned long sl=1; 160774664626SKris Kennaway 160874664626SKris Kennaway if (!s_quiet) 160974664626SKris Kennaway BIO_printf(bio_err,"turning on non blocking io\n"); 161074664626SKris Kennaway if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0) 161174664626SKris Kennaway ERR_print_errors(bio_err); 161274664626SKris Kennaway } 161374664626SKris Kennaway #endif 161474664626SKris Kennaway 161574664626SKris Kennaway if (con == NULL) { 1616f579bf8eSKris Kennaway con=SSL_new(ctx); 1617db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1618db522d3aSSimon L. B. Nielsen if (s_tlsextdebug) 1619db522d3aSSimon L. B. Nielsen { 1620db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_callback(con, tlsext_cb); 1621db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_arg(con, bio_s_out); 1622db522d3aSSimon L. B. Nielsen } 1623db522d3aSSimon L. B. Nielsen if (s_tlsextstatus) 1624db522d3aSSimon L. B. Nielsen { 1625db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb); 1626db522d3aSSimon L. B. Nielsen tlscstatp.err = bio_err; 1627db522d3aSSimon L. B. Nielsen SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp); 1628db522d3aSSimon L. B. Nielsen } 1629db522d3aSSimon L. B. Nielsen #endif 16305c87c606SMark Murray #ifndef OPENSSL_NO_KRB5 16315c87c606SMark Murray if ((con->kssl_ctx = kssl_ctx_new()) != NULL) 16325c87c606SMark Murray { 16335c87c606SMark Murray kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, 16345c87c606SMark Murray KRB5SVC); 16355c87c606SMark Murray kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, 16365c87c606SMark Murray KRB5KEYTAB); 16375c87c606SMark Murray } 16385c87c606SMark Murray #endif /* OPENSSL_NO_KRB5 */ 163974664626SKris Kennaway if(context) 164074664626SKris Kennaway SSL_set_session_id_context(con, context, 164174664626SKris Kennaway strlen((char *)context)); 164274664626SKris Kennaway } 164374664626SKris Kennaway SSL_clear(con); 164474664626SKris Kennaway 16453b4e3dcbSSimon L. B. Nielsen if (SSL_version(con) == DTLS1_VERSION) 16463b4e3dcbSSimon L. B. Nielsen { 16473b4e3dcbSSimon L. B. Nielsen struct timeval timeout; 16483b4e3dcbSSimon L. B. Nielsen 16493b4e3dcbSSimon L. B. Nielsen sbio=BIO_new_dgram(s,BIO_NOCLOSE); 16503b4e3dcbSSimon L. B. Nielsen 16513b4e3dcbSSimon L. B. Nielsen if ( enable_timeouts) 16523b4e3dcbSSimon L. B. Nielsen { 16533b4e3dcbSSimon L. B. Nielsen timeout.tv_sec = 0; 16543b4e3dcbSSimon L. B. Nielsen timeout.tv_usec = DGRAM_RCV_TIMEOUT; 16553b4e3dcbSSimon L. B. Nielsen BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout); 16563b4e3dcbSSimon L. B. Nielsen 16573b4e3dcbSSimon L. B. Nielsen timeout.tv_sec = 0; 16583b4e3dcbSSimon L. B. Nielsen timeout.tv_usec = DGRAM_SND_TIMEOUT; 16593b4e3dcbSSimon L. B. Nielsen BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout); 16603b4e3dcbSSimon L. B. Nielsen } 16613b4e3dcbSSimon L. B. Nielsen 16623b4e3dcbSSimon L. B. Nielsen 16633b4e3dcbSSimon L. B. Nielsen if ( mtu > 0) 16643b4e3dcbSSimon L. B. Nielsen { 16653b4e3dcbSSimon L. B. Nielsen SSL_set_options(con, SSL_OP_NO_QUERY_MTU); 16663b4e3dcbSSimon L. B. Nielsen SSL_set_mtu(con, mtu); 16673b4e3dcbSSimon L. B. Nielsen } 16683b4e3dcbSSimon L. B. Nielsen else 16693b4e3dcbSSimon L. B. Nielsen /* want to do MTU discovery */ 16703b4e3dcbSSimon L. B. Nielsen BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL); 16713b4e3dcbSSimon L. B. Nielsen 16723b4e3dcbSSimon L. B. Nielsen /* turn on cookie exchange */ 16733b4e3dcbSSimon L. B. Nielsen SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE); 16743b4e3dcbSSimon L. B. Nielsen } 16753b4e3dcbSSimon L. B. Nielsen else 167674664626SKris Kennaway sbio=BIO_new_socket(s,BIO_NOCLOSE); 16773b4e3dcbSSimon L. B. Nielsen 167874664626SKris Kennaway if (s_nbio_test) 167974664626SKris Kennaway { 168074664626SKris Kennaway BIO *test; 168174664626SKris Kennaway 168274664626SKris Kennaway test=BIO_new(BIO_f_nbio_test()); 168374664626SKris Kennaway sbio=BIO_push(test,sbio); 168474664626SKris Kennaway } 1685db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_JPAKE 1686db522d3aSSimon L. B. Nielsen if(jpake_secret) 1687db522d3aSSimon L. B. Nielsen jpake_server_auth(bio_s_out, sbio, jpake_secret); 1688db522d3aSSimon L. B. Nielsen #endif 1689db522d3aSSimon L. B. Nielsen 169074664626SKris Kennaway SSL_set_bio(con,sbio,sbio); 169174664626SKris Kennaway SSL_set_accept_state(con); 169274664626SKris Kennaway /* SSL_set_fd(con,s); */ 169374664626SKris Kennaway 169474664626SKris Kennaway if (s_debug) 169574664626SKris Kennaway { 169674664626SKris Kennaway con->debug=1; 16973b4e3dcbSSimon L. B. Nielsen BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); 16985471f83eSSimon L. B. Nielsen BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); 169974664626SKris Kennaway } 17005c87c606SMark Murray if (s_msg) 17015c87c606SMark Murray { 17025c87c606SMark Murray SSL_set_msg_callback(con, msg_cb); 17035c87c606SMark Murray SSL_set_msg_callback_arg(con, bio_s_out); 17045c87c606SMark Murray } 1705db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 1706db522d3aSSimon L. B. Nielsen if (s_tlsextdebug) 1707db522d3aSSimon L. B. Nielsen { 1708db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_callback(con, tlsext_cb); 1709db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_arg(con, bio_s_out); 1710db522d3aSSimon L. B. Nielsen } 1711db522d3aSSimon L. B. Nielsen #endif 171274664626SKris Kennaway 171374664626SKris Kennaway width=s+1; 171474664626SKris Kennaway for (;;) 171574664626SKris Kennaway { 1716f579bf8eSKris Kennaway int read_from_terminal; 1717f579bf8eSKris Kennaway int read_from_sslcon; 1718f579bf8eSKris Kennaway 1719f579bf8eSKris Kennaway read_from_terminal = 0; 1720f579bf8eSKris Kennaway read_from_sslcon = SSL_pending(con); 1721f579bf8eSKris Kennaway 1722f579bf8eSKris Kennaway if (!read_from_sslcon) 1723f579bf8eSKris Kennaway { 172474664626SKris Kennaway FD_ZERO(&readfds); 17253b4e3dcbSSimon L. B. Nielsen #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) 172674664626SKris Kennaway FD_SET(fileno(stdin),&readfds); 172774664626SKris Kennaway #endif 172874664626SKris Kennaway FD_SET(s,&readfds); 172974664626SKris Kennaway /* Note: under VMS with SOCKETSHR the second parameter is 173074664626SKris Kennaway * currently of type (int *) whereas under other systems 173174664626SKris Kennaway * it is (void *) if you don't have a cast it will choke 173274664626SKris Kennaway * the compiler: if you do have a cast then you can either 173374664626SKris Kennaway * go for (int *) or (void *). 173474664626SKris Kennaway */ 17353b4e3dcbSSimon L. B. Nielsen #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) 173650ef0093SJacques Vidrine /* Under DOS (non-djgpp) and Windows we can't select on stdin: only 1737f579bf8eSKris Kennaway * on sockets. As a workaround we timeout the select every 1738f579bf8eSKris Kennaway * second and check for any keypress. In a proper Windows 1739f579bf8eSKris Kennaway * application we wouldn't do this because it is inefficient. 1740f579bf8eSKris Kennaway */ 1741f579bf8eSKris Kennaway tv.tv_sec = 1; 1742f579bf8eSKris Kennaway tv.tv_usec = 0; 1743f579bf8eSKris Kennaway i=select(width,(void *)&readfds,NULL,NULL,&tv); 1744f579bf8eSKris Kennaway if((i < 0) || (!i && !_kbhit() ) )continue; 1745f579bf8eSKris Kennaway if(_kbhit()) 1746f579bf8eSKris Kennaway read_from_terminal = 1; 1747f579bf8eSKris Kennaway #else 174874664626SKris Kennaway i=select(width,(void *)&readfds,NULL,NULL,NULL); 174974664626SKris Kennaway if (i <= 0) continue; 175074664626SKris Kennaway if (FD_ISSET(fileno(stdin),&readfds)) 1751f579bf8eSKris Kennaway read_from_terminal = 1; 1752f579bf8eSKris Kennaway #endif 1753f579bf8eSKris Kennaway if (FD_ISSET(s,&readfds)) 1754f579bf8eSKris Kennaway read_from_sslcon = 1; 1755f579bf8eSKris Kennaway } 1756f579bf8eSKris Kennaway if (read_from_terminal) 175774664626SKris Kennaway { 175874664626SKris Kennaway if (s_crlf) 175974664626SKris Kennaway { 176074664626SKris Kennaway int j, lf_num; 176174664626SKris Kennaway 176274664626SKris Kennaway i=read(fileno(stdin), buf, bufsize/2); 176374664626SKris Kennaway lf_num = 0; 176474664626SKris Kennaway /* both loops are skipped when i <= 0 */ 176574664626SKris Kennaway for (j = 0; j < i; j++) 176674664626SKris Kennaway if (buf[j] == '\n') 176774664626SKris Kennaway lf_num++; 176874664626SKris Kennaway for (j = i-1; j >= 0; j--) 176974664626SKris Kennaway { 177074664626SKris Kennaway buf[j+lf_num] = buf[j]; 177174664626SKris Kennaway if (buf[j] == '\n') 177274664626SKris Kennaway { 177374664626SKris Kennaway lf_num--; 177474664626SKris Kennaway i++; 177574664626SKris Kennaway buf[j+lf_num] = '\r'; 177674664626SKris Kennaway } 177774664626SKris Kennaway } 177874664626SKris Kennaway assert(lf_num == 0); 177974664626SKris Kennaway } 178074664626SKris Kennaway else 178174664626SKris Kennaway i=read(fileno(stdin),buf,bufsize); 178274664626SKris Kennaway if (!s_quiet) 178374664626SKris Kennaway { 178474664626SKris Kennaway if ((i <= 0) || (buf[0] == 'Q')) 178574664626SKris Kennaway { 178674664626SKris Kennaway BIO_printf(bio_s_out,"DONE\n"); 178774664626SKris Kennaway SHUTDOWN(s); 178874664626SKris Kennaway close_accept_socket(); 178974664626SKris Kennaway ret= -11; 179074664626SKris Kennaway goto err; 179174664626SKris Kennaway } 179274664626SKris Kennaway if ((i <= 0) || (buf[0] == 'q')) 179374664626SKris Kennaway { 179474664626SKris Kennaway BIO_printf(bio_s_out,"DONE\n"); 17953b4e3dcbSSimon L. B. Nielsen if (SSL_version(con) != DTLS1_VERSION) 179674664626SKris Kennaway SHUTDOWN(s); 179774664626SKris Kennaway /* close_accept_socket(); 179874664626SKris Kennaway ret= -11;*/ 179974664626SKris Kennaway goto err; 180074664626SKris Kennaway } 180174664626SKris Kennaway if ((buf[0] == 'r') && 180274664626SKris Kennaway ((buf[1] == '\n') || (buf[1] == '\r'))) 180374664626SKris Kennaway { 180474664626SKris Kennaway SSL_renegotiate(con); 180574664626SKris Kennaway i=SSL_do_handshake(con); 180674664626SKris Kennaway printf("SSL_do_handshake -> %d\n",i); 180774664626SKris Kennaway i=0; /*13; */ 180874664626SKris Kennaway continue; 180974664626SKris Kennaway /* strcpy(buf,"server side RE-NEGOTIATE\n"); */ 181074664626SKris Kennaway } 181174664626SKris Kennaway if ((buf[0] == 'R') && 181274664626SKris Kennaway ((buf[1] == '\n') || (buf[1] == '\r'))) 181374664626SKris Kennaway { 181474664626SKris Kennaway SSL_set_verify(con, 181574664626SKris Kennaway SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL); 181674664626SKris Kennaway SSL_renegotiate(con); 181774664626SKris Kennaway i=SSL_do_handshake(con); 181874664626SKris Kennaway printf("SSL_do_handshake -> %d\n",i); 181974664626SKris Kennaway i=0; /* 13; */ 182074664626SKris Kennaway continue; 182174664626SKris Kennaway /* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */ 182274664626SKris Kennaway } 182374664626SKris Kennaway if (buf[0] == 'P') 182474664626SKris Kennaway { 18253b4e3dcbSSimon L. B. Nielsen static const char *str="Lets print some clear text\n"; 182674664626SKris Kennaway BIO_write(SSL_get_wbio(con),str,strlen(str)); 182774664626SKris Kennaway } 182874664626SKris Kennaway if (buf[0] == 'S') 182974664626SKris Kennaway { 183074664626SKris Kennaway print_stats(bio_s_out,SSL_get_SSL_CTX(con)); 183174664626SKris Kennaway } 183274664626SKris Kennaway } 183374664626SKris Kennaway #ifdef CHARSET_EBCDIC 183474664626SKris Kennaway ebcdic2ascii(buf,buf,i); 183574664626SKris Kennaway #endif 183674664626SKris Kennaway l=k=0; 183774664626SKris Kennaway for (;;) 183874664626SKris Kennaway { 183974664626SKris Kennaway /* should do a select for the write */ 184074664626SKris Kennaway #ifdef RENEG 184174664626SKris Kennaway { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } } 184274664626SKris Kennaway #endif 184374664626SKris Kennaway k=SSL_write(con,&(buf[l]),(unsigned int)i); 184474664626SKris Kennaway switch (SSL_get_error(con,k)) 184574664626SKris Kennaway { 184674664626SKris Kennaway case SSL_ERROR_NONE: 184774664626SKris Kennaway break; 184874664626SKris Kennaway case SSL_ERROR_WANT_WRITE: 184974664626SKris Kennaway case SSL_ERROR_WANT_READ: 185074664626SKris Kennaway case SSL_ERROR_WANT_X509_LOOKUP: 185174664626SKris Kennaway BIO_printf(bio_s_out,"Write BLOCK\n"); 185274664626SKris Kennaway break; 185374664626SKris Kennaway case SSL_ERROR_SYSCALL: 185474664626SKris Kennaway case SSL_ERROR_SSL: 185574664626SKris Kennaway BIO_printf(bio_s_out,"ERROR\n"); 185674664626SKris Kennaway ERR_print_errors(bio_err); 185774664626SKris Kennaway ret=1; 185874664626SKris Kennaway goto err; 185974664626SKris Kennaway /* break; */ 186074664626SKris Kennaway case SSL_ERROR_ZERO_RETURN: 186174664626SKris Kennaway BIO_printf(bio_s_out,"DONE\n"); 186274664626SKris Kennaway ret=1; 186374664626SKris Kennaway goto err; 186474664626SKris Kennaway } 186574664626SKris Kennaway l+=k; 186674664626SKris Kennaway i-=k; 186774664626SKris Kennaway if (i <= 0) break; 186874664626SKris Kennaway } 186974664626SKris Kennaway } 1870f579bf8eSKris Kennaway if (read_from_sslcon) 187174664626SKris Kennaway { 187274664626SKris Kennaway if (!SSL_is_init_finished(con)) 187374664626SKris Kennaway { 187474664626SKris Kennaway i=init_ssl_connection(con); 187574664626SKris Kennaway 187674664626SKris Kennaway if (i < 0) 187774664626SKris Kennaway { 187874664626SKris Kennaway ret=0; 187974664626SKris Kennaway goto err; 188074664626SKris Kennaway } 188174664626SKris Kennaway else if (i == 0) 188274664626SKris Kennaway { 188374664626SKris Kennaway ret=1; 188474664626SKris Kennaway goto err; 188574664626SKris Kennaway } 188674664626SKris Kennaway } 188774664626SKris Kennaway else 188874664626SKris Kennaway { 188974664626SKris Kennaway again: 189074664626SKris Kennaway i=SSL_read(con,(char *)buf,bufsize); 189174664626SKris Kennaway switch (SSL_get_error(con,i)) 189274664626SKris Kennaway { 189374664626SKris Kennaway case SSL_ERROR_NONE: 189474664626SKris Kennaway #ifdef CHARSET_EBCDIC 189574664626SKris Kennaway ascii2ebcdic(buf,buf,i); 189674664626SKris Kennaway #endif 189774664626SKris Kennaway write(fileno(stdout),buf, 189874664626SKris Kennaway (unsigned int)i); 189974664626SKris Kennaway if (SSL_pending(con)) goto again; 190074664626SKris Kennaway break; 190174664626SKris Kennaway case SSL_ERROR_WANT_WRITE: 190274664626SKris Kennaway case SSL_ERROR_WANT_READ: 190374664626SKris Kennaway case SSL_ERROR_WANT_X509_LOOKUP: 190474664626SKris Kennaway BIO_printf(bio_s_out,"Read BLOCK\n"); 190574664626SKris Kennaway break; 190674664626SKris Kennaway case SSL_ERROR_SYSCALL: 190774664626SKris Kennaway case SSL_ERROR_SSL: 190874664626SKris Kennaway BIO_printf(bio_s_out,"ERROR\n"); 190974664626SKris Kennaway ERR_print_errors(bio_err); 191074664626SKris Kennaway ret=1; 191174664626SKris Kennaway goto err; 191274664626SKris Kennaway case SSL_ERROR_ZERO_RETURN: 191374664626SKris Kennaway BIO_printf(bio_s_out,"DONE\n"); 191474664626SKris Kennaway ret=1; 191574664626SKris Kennaway goto err; 191674664626SKris Kennaway } 191774664626SKris Kennaway } 191874664626SKris Kennaway } 191974664626SKris Kennaway } 192074664626SKris Kennaway err: 192174664626SKris Kennaway BIO_printf(bio_s_out,"shutting down SSL\n"); 192274664626SKris Kennaway #if 1 192374664626SKris Kennaway SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 192474664626SKris Kennaway #else 192574664626SKris Kennaway SSL_shutdown(con); 192674664626SKris Kennaway #endif 192774664626SKris Kennaway if (con != NULL) SSL_free(con); 192874664626SKris Kennaway BIO_printf(bio_s_out,"CONNECTION CLOSED\n"); 192974664626SKris Kennaway if (buf != NULL) 193074664626SKris Kennaway { 19315c87c606SMark Murray OPENSSL_cleanse(buf,bufsize); 1932ddd58736SKris Kennaway OPENSSL_free(buf); 193374664626SKris Kennaway } 193474664626SKris Kennaway if (ret >= 0) 193574664626SKris Kennaway BIO_printf(bio_s_out,"ACCEPT\n"); 193674664626SKris Kennaway return(ret); 193774664626SKris Kennaway } 193874664626SKris Kennaway 193974664626SKris Kennaway static void close_accept_socket(void) 194074664626SKris Kennaway { 194174664626SKris Kennaway BIO_printf(bio_err,"shutdown accept socket\n"); 194274664626SKris Kennaway if (accept_socket >= 0) 194374664626SKris Kennaway { 194474664626SKris Kennaway SHUTDOWN2(accept_socket); 194574664626SKris Kennaway } 194674664626SKris Kennaway } 194774664626SKris Kennaway 194874664626SKris Kennaway static int init_ssl_connection(SSL *con) 194974664626SKris Kennaway { 195074664626SKris Kennaway int i; 195174664626SKris Kennaway const char *str; 195274664626SKris Kennaway X509 *peer; 195374664626SKris Kennaway long verify_error; 195474664626SKris Kennaway MS_STATIC char buf[BUFSIZ]; 195574664626SKris Kennaway 195674664626SKris Kennaway if ((i=SSL_accept(con)) <= 0) 195774664626SKris Kennaway { 195874664626SKris Kennaway if (BIO_sock_should_retry(i)) 195974664626SKris Kennaway { 196074664626SKris Kennaway BIO_printf(bio_s_out,"DELAY\n"); 196174664626SKris Kennaway return(1); 196274664626SKris Kennaway } 196374664626SKris Kennaway 196474664626SKris Kennaway BIO_printf(bio_err,"ERROR\n"); 196574664626SKris Kennaway verify_error=SSL_get_verify_result(con); 196674664626SKris Kennaway if (verify_error != X509_V_OK) 196774664626SKris Kennaway { 196874664626SKris Kennaway BIO_printf(bio_err,"verify error:%s\n", 196974664626SKris Kennaway X509_verify_cert_error_string(verify_error)); 197074664626SKris Kennaway } 197174664626SKris Kennaway else 197274664626SKris Kennaway ERR_print_errors(bio_err); 197374664626SKris Kennaway return(0); 197474664626SKris Kennaway } 197574664626SKris Kennaway 197674664626SKris Kennaway PEM_write_bio_SSL_SESSION(bio_s_out,SSL_get_session(con)); 197774664626SKris Kennaway 197874664626SKris Kennaway peer=SSL_get_peer_certificate(con); 197974664626SKris Kennaway if (peer != NULL) 198074664626SKris Kennaway { 198174664626SKris Kennaway BIO_printf(bio_s_out,"Client certificate\n"); 198274664626SKris Kennaway PEM_write_bio_X509(bio_s_out,peer); 19835c87c606SMark Murray X509_NAME_oneline(X509_get_subject_name(peer),buf,sizeof buf); 198474664626SKris Kennaway BIO_printf(bio_s_out,"subject=%s\n",buf); 19855c87c606SMark Murray X509_NAME_oneline(X509_get_issuer_name(peer),buf,sizeof buf); 198674664626SKris Kennaway BIO_printf(bio_s_out,"issuer=%s\n",buf); 198774664626SKris Kennaway X509_free(peer); 198874664626SKris Kennaway } 198974664626SKris Kennaway 19905c87c606SMark Murray if (SSL_get_shared_ciphers(con,buf,sizeof buf) != NULL) 199174664626SKris Kennaway BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf); 199274664626SKris Kennaway str=SSL_CIPHER_get_name(SSL_get_current_cipher(con)); 199374664626SKris Kennaway BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)"); 199474664626SKris Kennaway if (con->hit) BIO_printf(bio_s_out,"Reused session-id\n"); 199574664626SKris Kennaway if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) & 199674664626SKris Kennaway TLS1_FLAGS_TLS_PADDING_BUG) 199774664626SKris Kennaway BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n"); 199850ef0093SJacques Vidrine #ifndef OPENSSL_NO_KRB5 199950ef0093SJacques Vidrine if (con->kssl_ctx->client_princ != NULL) 200050ef0093SJacques Vidrine { 200150ef0093SJacques Vidrine BIO_printf(bio_s_out,"Kerberos peer principal is %s\n", 200250ef0093SJacques Vidrine con->kssl_ctx->client_princ); 200350ef0093SJacques Vidrine } 200450ef0093SJacques Vidrine #endif /* OPENSSL_NO_KRB5 */ 200574664626SKris Kennaway return(1); 200674664626SKris Kennaway } 200774664626SKris Kennaway 20085c87c606SMark Murray #ifndef OPENSSL_NO_DH 20093b4e3dcbSSimon L. B. Nielsen static DH *load_dh_param(const char *dhfile) 201074664626SKris Kennaway { 201174664626SKris Kennaway DH *ret=NULL; 201274664626SKris Kennaway BIO *bio; 201374664626SKris Kennaway 2014f579bf8eSKris Kennaway if ((bio=BIO_new_file(dhfile,"r")) == NULL) 201574664626SKris Kennaway goto err; 201674664626SKris Kennaway ret=PEM_read_bio_DHparams(bio,NULL,NULL,NULL); 201774664626SKris Kennaway err: 201874664626SKris Kennaway if (bio != NULL) BIO_free(bio); 201974664626SKris Kennaway return(ret); 202074664626SKris Kennaway } 202174664626SKris Kennaway #endif 202274664626SKris Kennaway 202374664626SKris Kennaway #if 0 202474664626SKris Kennaway static int load_CA(SSL_CTX *ctx, char *file) 202574664626SKris Kennaway { 202674664626SKris Kennaway FILE *in; 202774664626SKris Kennaway X509 *x=NULL; 202874664626SKris Kennaway 202974664626SKris Kennaway if ((in=fopen(file,"r")) == NULL) 203074664626SKris Kennaway return(0); 203174664626SKris Kennaway 203274664626SKris Kennaway for (;;) 203374664626SKris Kennaway { 203474664626SKris Kennaway if (PEM_read_X509(in,&x,NULL) == NULL) 203574664626SKris Kennaway break; 203674664626SKris Kennaway SSL_CTX_add_client_CA(ctx,x); 203774664626SKris Kennaway } 203874664626SKris Kennaway if (x != NULL) X509_free(x); 203974664626SKris Kennaway fclose(in); 204074664626SKris Kennaway return(1); 204174664626SKris Kennaway } 204274664626SKris Kennaway #endif 204374664626SKris Kennaway 204474664626SKris Kennaway static int www_body(char *hostname, int s, unsigned char *context) 204574664626SKris Kennaway { 204674664626SKris Kennaway char *buf=NULL; 204774664626SKris Kennaway int ret=1; 204874664626SKris Kennaway int i,j,k,blank,dot; 204974664626SKris Kennaway struct stat st_buf; 205074664626SKris Kennaway SSL *con; 205174664626SKris Kennaway SSL_CIPHER *c; 205274664626SKris Kennaway BIO *io,*ssl_bio,*sbio; 205374664626SKris Kennaway long total_bytes; 205474664626SKris Kennaway 2055ddd58736SKris Kennaway buf=OPENSSL_malloc(bufsize); 205674664626SKris Kennaway if (buf == NULL) return(0); 205774664626SKris Kennaway io=BIO_new(BIO_f_buffer()); 205874664626SKris Kennaway ssl_bio=BIO_new(BIO_f_ssl()); 205974664626SKris Kennaway if ((io == NULL) || (ssl_bio == NULL)) goto err; 206074664626SKris Kennaway 206174664626SKris Kennaway #ifdef FIONBIO 206274664626SKris Kennaway if (s_nbio) 206374664626SKris Kennaway { 206474664626SKris Kennaway unsigned long sl=1; 206574664626SKris Kennaway 206674664626SKris Kennaway if (!s_quiet) 206774664626SKris Kennaway BIO_printf(bio_err,"turning on non blocking io\n"); 206874664626SKris Kennaway if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0) 206974664626SKris Kennaway ERR_print_errors(bio_err); 207074664626SKris Kennaway } 207174664626SKris Kennaway #endif 207274664626SKris Kennaway 207374664626SKris Kennaway /* lets make the output buffer a reasonable size */ 207474664626SKris Kennaway if (!BIO_set_write_buffer_size(io,bufsize)) goto err; 207574664626SKris Kennaway 2076f579bf8eSKris Kennaway if ((con=SSL_new(ctx)) == NULL) goto err; 2077db522d3aSSimon L. B. Nielsen #ifndef OPENSSL_NO_TLSEXT 2078db522d3aSSimon L. B. Nielsen if (s_tlsextdebug) 2079db522d3aSSimon L. B. Nielsen { 2080db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_callback(con, tlsext_cb); 2081db522d3aSSimon L. B. Nielsen SSL_set_tlsext_debug_arg(con, bio_s_out); 2082db522d3aSSimon L. B. Nielsen } 2083db522d3aSSimon L. B. Nielsen #endif 20845c87c606SMark Murray #ifndef OPENSSL_NO_KRB5 20855c87c606SMark Murray if ((con->kssl_ctx = kssl_ctx_new()) != NULL) 20865c87c606SMark Murray { 20875c87c606SMark Murray kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC); 20885c87c606SMark Murray kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB); 20895c87c606SMark Murray } 20905c87c606SMark Murray #endif /* OPENSSL_NO_KRB5 */ 209174664626SKris Kennaway if(context) SSL_set_session_id_context(con, context, 209274664626SKris Kennaway strlen((char *)context)); 209374664626SKris Kennaway 209474664626SKris Kennaway sbio=BIO_new_socket(s,BIO_NOCLOSE); 209574664626SKris Kennaway if (s_nbio_test) 209674664626SKris Kennaway { 209774664626SKris Kennaway BIO *test; 209874664626SKris Kennaway 209974664626SKris Kennaway test=BIO_new(BIO_f_nbio_test()); 210074664626SKris Kennaway sbio=BIO_push(test,sbio); 210174664626SKris Kennaway } 210274664626SKris Kennaway SSL_set_bio(con,sbio,sbio); 210374664626SKris Kennaway SSL_set_accept_state(con); 210474664626SKris Kennaway 210574664626SKris Kennaway /* SSL_set_fd(con,s); */ 210674664626SKris Kennaway BIO_set_ssl(ssl_bio,con,BIO_CLOSE); 210774664626SKris Kennaway BIO_push(io,ssl_bio); 210874664626SKris Kennaway #ifdef CHARSET_EBCDIC 210974664626SKris Kennaway io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io); 211074664626SKris Kennaway #endif 211174664626SKris Kennaway 211274664626SKris Kennaway if (s_debug) 211374664626SKris Kennaway { 211474664626SKris Kennaway con->debug=1; 21153b4e3dcbSSimon L. B. Nielsen BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); 21165471f83eSSimon L. B. Nielsen BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); 211774664626SKris Kennaway } 21185c87c606SMark Murray if (s_msg) 21195c87c606SMark Murray { 21205c87c606SMark Murray SSL_set_msg_callback(con, msg_cb); 21215c87c606SMark Murray SSL_set_msg_callback_arg(con, bio_s_out); 21225c87c606SMark Murray } 212374664626SKris Kennaway 212474664626SKris Kennaway blank=0; 212574664626SKris Kennaway for (;;) 212674664626SKris Kennaway { 212774664626SKris Kennaway if (hack) 212874664626SKris Kennaway { 212974664626SKris Kennaway i=SSL_accept(con); 213074664626SKris Kennaway 213174664626SKris Kennaway switch (SSL_get_error(con,i)) 213274664626SKris Kennaway { 213374664626SKris Kennaway case SSL_ERROR_NONE: 213474664626SKris Kennaway break; 213574664626SKris Kennaway case SSL_ERROR_WANT_WRITE: 213674664626SKris Kennaway case SSL_ERROR_WANT_READ: 213774664626SKris Kennaway case SSL_ERROR_WANT_X509_LOOKUP: 213874664626SKris Kennaway continue; 213974664626SKris Kennaway case SSL_ERROR_SYSCALL: 214074664626SKris Kennaway case SSL_ERROR_SSL: 214174664626SKris Kennaway case SSL_ERROR_ZERO_RETURN: 214274664626SKris Kennaway ret=1; 214374664626SKris Kennaway goto err; 214474664626SKris Kennaway /* break; */ 214574664626SKris Kennaway } 214674664626SKris Kennaway 214774664626SKris Kennaway SSL_renegotiate(con); 214874664626SKris Kennaway SSL_write(con,NULL,0); 214974664626SKris Kennaway } 215074664626SKris Kennaway 215174664626SKris Kennaway i=BIO_gets(io,buf,bufsize-1); 215274664626SKris Kennaway if (i < 0) /* error */ 215374664626SKris Kennaway { 215474664626SKris Kennaway if (!BIO_should_retry(io)) 215574664626SKris Kennaway { 215674664626SKris Kennaway if (!s_quiet) 215774664626SKris Kennaway ERR_print_errors(bio_err); 215874664626SKris Kennaway goto err; 215974664626SKris Kennaway } 216074664626SKris Kennaway else 216174664626SKris Kennaway { 216274664626SKris Kennaway BIO_printf(bio_s_out,"read R BLOCK\n"); 21633b4e3dcbSSimon L. B. Nielsen #if defined(OPENSSL_SYS_NETWARE) 21643b4e3dcbSSimon L. B. Nielsen delay(1000); 21653b4e3dcbSSimon L. B. Nielsen #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__) 216674664626SKris Kennaway sleep(1); 216774664626SKris Kennaway #endif 216874664626SKris Kennaway continue; 216974664626SKris Kennaway } 217074664626SKris Kennaway } 217174664626SKris Kennaway else if (i == 0) /* end of input */ 217274664626SKris Kennaway { 217374664626SKris Kennaway ret=1; 217474664626SKris Kennaway goto end; 217574664626SKris Kennaway } 217674664626SKris Kennaway 217774664626SKris Kennaway /* else we have data */ 217874664626SKris Kennaway if ( ((www == 1) && (strncmp("GET ",buf,4) == 0)) || 217974664626SKris Kennaway ((www == 2) && (strncmp("GET /stats ",buf,10) == 0))) 218074664626SKris Kennaway { 218174664626SKris Kennaway char *p; 218274664626SKris Kennaway X509 *peer; 218374664626SKris Kennaway STACK_OF(SSL_CIPHER) *sk; 21843b4e3dcbSSimon L. B. Nielsen static const char *space=" "; 218574664626SKris Kennaway 218674664626SKris Kennaway BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n"); 218774664626SKris Kennaway BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n"); 218874664626SKris Kennaway BIO_puts(io,"<pre>\n"); 218974664626SKris Kennaway /* BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/ 219074664626SKris Kennaway BIO_puts(io,"\n"); 219174664626SKris Kennaway for (i=0; i<local_argc; i++) 219274664626SKris Kennaway { 219374664626SKris Kennaway BIO_puts(io,local_argv[i]); 219474664626SKris Kennaway BIO_write(io," ",1); 219574664626SKris Kennaway } 219674664626SKris Kennaway BIO_puts(io,"\n"); 219774664626SKris Kennaway 219874664626SKris Kennaway /* The following is evil and should not really 219974664626SKris Kennaway * be done */ 220074664626SKris Kennaway BIO_printf(io,"Ciphers supported in s_server binary\n"); 220174664626SKris Kennaway sk=SSL_get_ciphers(con); 220274664626SKris Kennaway j=sk_SSL_CIPHER_num(sk); 220374664626SKris Kennaway for (i=0; i<j; i++) 220474664626SKris Kennaway { 220574664626SKris Kennaway c=sk_SSL_CIPHER_value(sk,i); 220674664626SKris Kennaway BIO_printf(io,"%-11s:%-25s", 220774664626SKris Kennaway SSL_CIPHER_get_version(c), 220874664626SKris Kennaway SSL_CIPHER_get_name(c)); 220974664626SKris Kennaway if ((((i+1)%2) == 0) && (i+1 != j)) 221074664626SKris Kennaway BIO_puts(io,"\n"); 221174664626SKris Kennaway } 221274664626SKris Kennaway BIO_puts(io,"\n"); 221374664626SKris Kennaway p=SSL_get_shared_ciphers(con,buf,bufsize); 221474664626SKris Kennaway if (p != NULL) 221574664626SKris Kennaway { 221674664626SKris Kennaway BIO_printf(io,"---\nCiphers common between both SSL end points:\n"); 221774664626SKris Kennaway j=i=0; 221874664626SKris Kennaway while (*p) 221974664626SKris Kennaway { 222074664626SKris Kennaway if (*p == ':') 222174664626SKris Kennaway { 222274664626SKris Kennaway BIO_write(io,space,26-j); 222374664626SKris Kennaway i++; 222474664626SKris Kennaway j=0; 222574664626SKris Kennaway BIO_write(io,((i%3)?" ":"\n"),1); 222674664626SKris Kennaway } 222774664626SKris Kennaway else 222874664626SKris Kennaway { 222974664626SKris Kennaway BIO_write(io,p,1); 223074664626SKris Kennaway j++; 223174664626SKris Kennaway } 223274664626SKris Kennaway p++; 223374664626SKris Kennaway } 223474664626SKris Kennaway BIO_puts(io,"\n"); 223574664626SKris Kennaway } 223674664626SKris Kennaway BIO_printf(io,((con->hit) 223774664626SKris Kennaway ?"---\nReused, " 223874664626SKris Kennaway :"---\nNew, ")); 223974664626SKris Kennaway c=SSL_get_current_cipher(con); 224074664626SKris Kennaway BIO_printf(io,"%s, Cipher is %s\n", 224174664626SKris Kennaway SSL_CIPHER_get_version(c), 224274664626SKris Kennaway SSL_CIPHER_get_name(c)); 224374664626SKris Kennaway SSL_SESSION_print(io,SSL_get_session(con)); 224474664626SKris Kennaway BIO_printf(io,"---\n"); 224574664626SKris Kennaway print_stats(io,SSL_get_SSL_CTX(con)); 224674664626SKris Kennaway BIO_printf(io,"---\n"); 224774664626SKris Kennaway peer=SSL_get_peer_certificate(con); 224874664626SKris Kennaway if (peer != NULL) 224974664626SKris Kennaway { 225074664626SKris Kennaway BIO_printf(io,"Client certificate\n"); 225174664626SKris Kennaway X509_print(io,peer); 225274664626SKris Kennaway PEM_write_bio_X509(io,peer); 225374664626SKris Kennaway } 225474664626SKris Kennaway else 225574664626SKris Kennaway BIO_puts(io,"no client certificate available\n"); 225674664626SKris Kennaway BIO_puts(io,"</BODY></HTML>\r\n\r\n"); 225774664626SKris Kennaway break; 225874664626SKris Kennaway } 22595c87c606SMark Murray else if ((www == 2 || www == 3) 22605c87c606SMark Murray && (strncmp("GET /",buf,5) == 0)) 226174664626SKris Kennaway { 226274664626SKris Kennaway BIO *file; 226374664626SKris Kennaway char *p,*e; 22643b4e3dcbSSimon L. B. Nielsen static const char *text="HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n"; 226574664626SKris Kennaway 226674664626SKris Kennaway /* skip the '/' */ 226774664626SKris Kennaway p= &(buf[5]); 22685740a5e3SKris Kennaway 22695740a5e3SKris Kennaway dot = 1; 227074664626SKris Kennaway for (e=p; *e != '\0'; e++) 227174664626SKris Kennaway { 22725740a5e3SKris Kennaway if (e[0] == ' ') 22735740a5e3SKris Kennaway break; 227474664626SKris Kennaway 22755740a5e3SKris Kennaway switch (dot) 22765740a5e3SKris Kennaway { 22775740a5e3SKris Kennaway case 1: 22785740a5e3SKris Kennaway dot = (e[0] == '.') ? 2 : 0; 22795740a5e3SKris Kennaway break; 22805740a5e3SKris Kennaway case 2: 22815740a5e3SKris Kennaway dot = (e[0] == '.') ? 3 : 0; 22825740a5e3SKris Kennaway break; 22835740a5e3SKris Kennaway case 3: 22845740a5e3SKris Kennaway dot = (e[0] == '/') ? -1 : 0; 22855740a5e3SKris Kennaway break; 22865740a5e3SKris Kennaway } 22875740a5e3SKris Kennaway if (dot == 0) 22885740a5e3SKris Kennaway dot = (e[0] == '/') ? 1 : 0; 22895740a5e3SKris Kennaway } 22905740a5e3SKris Kennaway dot = (dot == 3) || (dot == -1); /* filename contains ".." component */ 229174664626SKris Kennaway 229274664626SKris Kennaway if (*e == '\0') 229374664626SKris Kennaway { 229474664626SKris Kennaway BIO_puts(io,text); 229574664626SKris Kennaway BIO_printf(io,"'%s' is an invalid file name\r\n",p); 229674664626SKris Kennaway break; 229774664626SKris Kennaway } 229874664626SKris Kennaway *e='\0'; 229974664626SKris Kennaway 230074664626SKris Kennaway if (dot) 230174664626SKris Kennaway { 230274664626SKris Kennaway BIO_puts(io,text); 230374664626SKris Kennaway BIO_printf(io,"'%s' contains '..' reference\r\n",p); 230474664626SKris Kennaway break; 230574664626SKris Kennaway } 230674664626SKris Kennaway 230774664626SKris Kennaway if (*p == '/') 230874664626SKris Kennaway { 230974664626SKris Kennaway BIO_puts(io,text); 231074664626SKris Kennaway BIO_printf(io,"'%s' is an invalid path\r\n",p); 231174664626SKris Kennaway break; 231274664626SKris Kennaway } 231374664626SKris Kennaway 23145740a5e3SKris Kennaway #if 0 231574664626SKris Kennaway /* append if a directory lookup */ 231674664626SKris Kennaway if (e[-1] == '/') 231774664626SKris Kennaway strcat(p,"index.html"); 23185740a5e3SKris Kennaway #endif 231974664626SKris Kennaway 232074664626SKris Kennaway /* if a directory, do the index thang */ 232174664626SKris Kennaway if (stat(p,&st_buf) < 0) 232274664626SKris Kennaway { 232374664626SKris Kennaway BIO_puts(io,text); 232474664626SKris Kennaway BIO_printf(io,"Error accessing '%s'\r\n",p); 232574664626SKris Kennaway ERR_print_errors(io); 232674664626SKris Kennaway break; 232774664626SKris Kennaway } 232874664626SKris Kennaway if (S_ISDIR(st_buf.st_mode)) 232974664626SKris Kennaway { 23305740a5e3SKris Kennaway #if 0 /* must check buffer size */ 233174664626SKris Kennaway strcat(p,"/index.html"); 23325740a5e3SKris Kennaway #else 23335740a5e3SKris Kennaway BIO_puts(io,text); 23345740a5e3SKris Kennaway BIO_printf(io,"'%s' is a directory\r\n",p); 23355740a5e3SKris Kennaway break; 23365740a5e3SKris Kennaway #endif 233774664626SKris Kennaway } 233874664626SKris Kennaway 233974664626SKris Kennaway if ((file=BIO_new_file(p,"r")) == NULL) 234074664626SKris Kennaway { 234174664626SKris Kennaway BIO_puts(io,text); 234274664626SKris Kennaway BIO_printf(io,"Error opening '%s'\r\n",p); 234374664626SKris Kennaway ERR_print_errors(io); 234474664626SKris Kennaway break; 234574664626SKris Kennaway } 234674664626SKris Kennaway 234774664626SKris Kennaway if (!s_quiet) 234874664626SKris Kennaway BIO_printf(bio_err,"FILE:%s\n",p); 234974664626SKris Kennaway 23505c87c606SMark Murray if (www == 2) 23515c87c606SMark Murray { 235274664626SKris Kennaway i=strlen(p); 235374664626SKris Kennaway if ( ((i > 5) && (strcmp(&(p[i-5]),".html") == 0)) || 235474664626SKris Kennaway ((i > 4) && (strcmp(&(p[i-4]),".php") == 0)) || 235574664626SKris Kennaway ((i > 4) && (strcmp(&(p[i-4]),".htm") == 0))) 235674664626SKris Kennaway BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n"); 235774664626SKris Kennaway else 235874664626SKris Kennaway BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n"); 23595c87c606SMark Murray } 236074664626SKris Kennaway /* send the file */ 236174664626SKris Kennaway total_bytes=0; 236274664626SKris Kennaway for (;;) 236374664626SKris Kennaway { 236474664626SKris Kennaway i=BIO_read(file,buf,bufsize); 236574664626SKris Kennaway if (i <= 0) break; 236674664626SKris Kennaway 236774664626SKris Kennaway #ifdef RENEG 236874664626SKris Kennaway total_bytes+=i; 236974664626SKris Kennaway fprintf(stderr,"%d\n",i); 237074664626SKris Kennaway if (total_bytes > 3*1024) 237174664626SKris Kennaway { 237274664626SKris Kennaway total_bytes=0; 237374664626SKris Kennaway fprintf(stderr,"RENEGOTIATE\n"); 237474664626SKris Kennaway SSL_renegotiate(con); 237574664626SKris Kennaway } 237674664626SKris Kennaway #endif 237774664626SKris Kennaway 237874664626SKris Kennaway for (j=0; j<i; ) 237974664626SKris Kennaway { 238074664626SKris Kennaway #ifdef RENEG 238174664626SKris Kennaway { static count=0; if (++count == 13) { SSL_renegotiate(con); } } 238274664626SKris Kennaway #endif 238374664626SKris Kennaway k=BIO_write(io,&(buf[j]),i-j); 238474664626SKris Kennaway if (k <= 0) 238574664626SKris Kennaway { 238674664626SKris Kennaway if (!BIO_should_retry(io)) 238774664626SKris Kennaway goto write_error; 238874664626SKris Kennaway else 238974664626SKris Kennaway { 239074664626SKris Kennaway BIO_printf(bio_s_out,"rwrite W BLOCK\n"); 239174664626SKris Kennaway } 239274664626SKris Kennaway } 239374664626SKris Kennaway else 239474664626SKris Kennaway { 239574664626SKris Kennaway j+=k; 239674664626SKris Kennaway } 239774664626SKris Kennaway } 239874664626SKris Kennaway } 239974664626SKris Kennaway write_error: 240074664626SKris Kennaway BIO_free(file); 240174664626SKris Kennaway break; 240274664626SKris Kennaway } 240374664626SKris Kennaway } 240474664626SKris Kennaway 240574664626SKris Kennaway for (;;) 240674664626SKris Kennaway { 240774664626SKris Kennaway i=(int)BIO_flush(io); 240874664626SKris Kennaway if (i <= 0) 240974664626SKris Kennaway { 241074664626SKris Kennaway if (!BIO_should_retry(io)) 241174664626SKris Kennaway break; 241274664626SKris Kennaway } 241374664626SKris Kennaway else 241474664626SKris Kennaway break; 241574664626SKris Kennaway } 241674664626SKris Kennaway end: 241774664626SKris Kennaway #if 1 241874664626SKris Kennaway /* make sure we re-use sessions */ 241974664626SKris Kennaway SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); 242074664626SKris Kennaway #else 2421f579bf8eSKris Kennaway /* This kills performance */ 242274664626SKris Kennaway /* SSL_shutdown(con); A shutdown gets sent in the 242374664626SKris Kennaway * BIO_free_all(io) procession */ 242474664626SKris Kennaway #endif 242574664626SKris Kennaway 242674664626SKris Kennaway err: 242774664626SKris Kennaway 242874664626SKris Kennaway if (ret >= 0) 242974664626SKris Kennaway BIO_printf(bio_s_out,"ACCEPT\n"); 243074664626SKris Kennaway 2431ddd58736SKris Kennaway if (buf != NULL) OPENSSL_free(buf); 243274664626SKris Kennaway if (io != NULL) BIO_free_all(io); 243374664626SKris Kennaway /* if (ssl_bio != NULL) BIO_free(ssl_bio);*/ 243474664626SKris Kennaway return(ret); 243574664626SKris Kennaway } 243674664626SKris Kennaway 24375c87c606SMark Murray #ifndef OPENSSL_NO_RSA 243874664626SKris Kennaway static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength) 243974664626SKris Kennaway { 24403b4e3dcbSSimon L. B. Nielsen BIGNUM *bn = NULL; 244174664626SKris Kennaway static RSA *rsa_tmp=NULL; 244274664626SKris Kennaway 24433b4e3dcbSSimon L. B. Nielsen if (!rsa_tmp && ((bn = BN_new()) == NULL)) 24443b4e3dcbSSimon L. B. Nielsen BIO_printf(bio_err,"Allocation error in generating RSA key\n"); 24453b4e3dcbSSimon L. B. Nielsen if (!rsa_tmp && bn) 244674664626SKris Kennaway { 244774664626SKris Kennaway if (!s_quiet) 244874664626SKris Kennaway { 244974664626SKris Kennaway BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength); 245074664626SKris Kennaway (void)BIO_flush(bio_err); 245174664626SKris Kennaway } 24523b4e3dcbSSimon L. B. Nielsen if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) || 24533b4e3dcbSSimon L. B. Nielsen !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL)) 24543b4e3dcbSSimon L. B. Nielsen { 24553b4e3dcbSSimon L. B. Nielsen if(rsa_tmp) RSA_free(rsa_tmp); 24563b4e3dcbSSimon L. B. Nielsen rsa_tmp = NULL; 24573b4e3dcbSSimon L. B. Nielsen } 245874664626SKris Kennaway if (!s_quiet) 245974664626SKris Kennaway { 246074664626SKris Kennaway BIO_printf(bio_err,"\n"); 246174664626SKris Kennaway (void)BIO_flush(bio_err); 246274664626SKris Kennaway } 24633b4e3dcbSSimon L. B. Nielsen BN_free(bn); 246474664626SKris Kennaway } 246574664626SKris Kennaway return(rsa_tmp); 246674664626SKris Kennaway } 246774664626SKris Kennaway #endif 24685c87c606SMark Murray 24695c87c606SMark Murray #define MAX_SESSION_ID_ATTEMPTS 10 24705c87c606SMark Murray static int generate_session_id(const SSL *ssl, unsigned char *id, 24715c87c606SMark Murray unsigned int *id_len) 24725c87c606SMark Murray { 24735c87c606SMark Murray unsigned int count = 0; 24745c87c606SMark Murray do { 24755c87c606SMark Murray RAND_pseudo_bytes(id, *id_len); 24765c87c606SMark Murray /* Prefix the session_id with the required prefix. NB: If our 24775c87c606SMark Murray * prefix is too long, clip it - but there will be worse effects 24785c87c606SMark Murray * anyway, eg. the server could only possibly create 1 session 24795c87c606SMark Murray * ID (ie. the prefix!) so all future session negotiations will 24805c87c606SMark Murray * fail due to conflicts. */ 24815c87c606SMark Murray memcpy(id, session_id_prefix, 24825c87c606SMark Murray (strlen(session_id_prefix) < *id_len) ? 24835c87c606SMark Murray strlen(session_id_prefix) : *id_len); 24845c87c606SMark Murray } 24855c87c606SMark Murray while(SSL_has_matching_session_id(ssl, id, *id_len) && 24865c87c606SMark Murray (++count < MAX_SESSION_ID_ATTEMPTS)); 24875c87c606SMark Murray if(count >= MAX_SESSION_ID_ATTEMPTS) 24885c87c606SMark Murray return 0; 24895c87c606SMark Murray return 1; 24905c87c606SMark Murray } 2491