os/ossrv/ssl/tsrc/BC/libcrypto/topenssl/src/s_server.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /* apps/s_server.c */
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
     3  * All rights reserved.
     4  *
     5  * This package is an SSL implementation written
     6  * by Eric Young (eay@cryptsoft.com).
     7  * The implementation was written so as to conform with Netscapes SSL.
     8  * 
     9  * This library is free for commercial and non-commercial use as long as
    10  * the following conditions are aheared to.  The following conditions
    11  * apply to all code found in this distribution, be it the RC4, RSA,
    12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
    13  * included with this distribution is covered by the same copyright terms
    14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
    15  * 
    16  * Copyright remains Eric Young's, and as such any Copyright notices in
    17  * the code are not to be removed.
    18  * If this package is used in a product, Eric Young should be given attribution
    19  * as the author of the parts of the library used.
    20  * This can be in the form of a textual message at program startup or
    21  * in documentation (online or textual) provided with the package.
    22  * 
    23  * Redistribution and use in source and binary forms, with or without
    24  * modification, are permitted provided that the following conditions
    25  * are met:
    26  * 1. Redistributions of source code must retain the copyright
    27  *    notice, this list of conditions and the following disclaimer.
    28  * 2. Redistributions in binary form must reproduce the above copyright
    29  *    notice, this list of conditions and the following disclaimer in the
    30  *    documentation and/or other materials provided with the distribution.
    31  * 3. All advertising materials mentioning features or use of this software
    32  *    must display the following acknowledgement:
    33  *    "This product includes cryptographic software written by
    34  *     Eric Young (eay@cryptsoft.com)"
    35  *    The word 'cryptographic' can be left out if the rouines from the library
    36  *    being used are not cryptographic related :-).
    37  * 4. If you include any Windows specific code (or a derivative thereof) from 
    38  *    the apps directory (application code) you must include an acknowledgement:
    39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
    40  * 
    41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
    42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    51  * SUCH DAMAGE.
    52  * 
    53  * The licence and distribution terms for any publically available version or
    54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
    55  * copied and put under another distribution licence
    56  * [including the GNU Public Licence.]
    57  */
    58 /* ====================================================================
    59  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
    60  *
    61  * Redistribution and use in source and binary forms, with or without
    62  * modification, are permitted provided that the following conditions
    63  * are met:
    64  *
    65  * 1. Redistributions of source code must retain the above copyright
    66  *    notice, this list of conditions and the following disclaimer. 
    67  *
    68  * 2. Redistributions in binary form must reproduce the above copyright
    69  *    notice, this list of conditions and the following disclaimer in
    70  *    the documentation and/or other materials provided with the
    71  *    distribution.
    72  *
    73  * 3. All advertising materials mentioning features or use of this
    74  *    software must display the following acknowledgment:
    75  *    "This product includes software developed by the OpenSSL Project
    76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
    77  *
    78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
    79  *    endorse or promote products derived from this software without
    80  *    prior written permission. For written permission, please contact
    81  *    openssl-core@openssl.org.
    82  *
    83  * 5. Products derived from this software may not be called "OpenSSL"
    84  *    nor may "OpenSSL" appear in their names without prior written
    85  *    permission of the OpenSSL Project.
    86  *
    87  * 6. Redistributions of any form whatsoever must retain the following
    88  *    acknowledgment:
    89  *    "This product includes software developed by the OpenSSL Project
    90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
    91  *
    92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
    93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
    96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   103  * OF THE POSSIBILITY OF SUCH DAMAGE.
   104  * ====================================================================
   105  *
   106  * This product includes cryptographic software written by Eric Young
   107  * (eay@cryptsoft.com).  This product includes software written by Tim
   108  * Hudson (tjh@cryptsoft.com).
   109  *
   110  */
   111 /* ====================================================================
   112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
   113  * ECC cipher suite support in OpenSSL originally developed by 
   114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
   115  */
   116 
   117 /* Until the key-gen callbacks are modified to use newer prototypes, we allow
   118  * deprecated functions for openssl-internal code */
   119 #ifdef OPENSSL_NO_DEPRECATED
   120 #undef OPENSSL_NO_DEPRECATED
   121 #endif
   122 
   123 #include <assert.h>
   124 #include <stdio.h>
   125 #include <stdlib.h>
   126 #include <string.h>
   127 #include <sys/select.h>
   128 #include <sys/stat.h>
   129 #include <openssl/e_os2.h>
   130 #ifdef OPENSSL_NO_STDIO
   131 #define APPS_WIN16
   132 #endif
   133 
   134 #if !defined(OPENSSL_SYS_NETWARE)  /* conflicts with winsock2 stuff on netware */
   135 #include <sys/types.h>
   136 #endif
   137 
   138 /* With IPv6, it looks like Digital has mixed up the proper order of
   139    recursive header file inclusion, resulting in the compiler complaining
   140    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
   141    is needed to have fileno() declared correctly...  So let's define u_int */
   142 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
   143 #define __U_INT
   144 typedef unsigned int u_int;
   145 #endif
   146 
   147 #include <openssl/lhash.h>
   148 #include <openssl/bn.h>
   149 #define USE_SOCKETS
   150 #include "apps.h"
   151 #include <openssl/err.h>
   152 #include <openssl/pem.h>
   153 #include <openssl/x509.h>
   154 #include <openssl/ssl.h>
   155 #include <openssl/rand.h>
   156 #ifndef OPENSSL_NO_DH
   157 #include <openssl/dh.h>
   158 #endif
   159 #ifndef OPENSSL_NO_RSA
   160 #include <openssl/rsa.h>
   161 #endif
   162 #include "s_apps.h"
   163 #include "timeouts.h"
   164 
   165 #ifdef OPENSSL_SYS_WINCE
   166 /* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
   167 #ifdef fileno
   168 #undef fileno
   169 #endif
   170 #define fileno(a) (int)_fileno(a)
   171 #endif
   172 
   173 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
   174 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
   175 #undef FIONBIO
   176 #endif
   177 
   178 #ifndef OPENSSL_NO_RSA
   179 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
   180 #endif
   181 static int sv_body(char *hostname, int s, unsigned char *context);
   182 static int www_body(char *hostname, int s, unsigned char *context);
   183 static void close_accept_socket(void );
   184 static void sv_usage(void);
   185 static int init_ssl_connection(SSL *s);
   186 static void print_stats(BIO *bp,SSL_CTX *ctx);
   187 static int generate_session_id(const SSL *ssl, unsigned char *id,
   188 				unsigned int *id_len);
   189 #ifndef OPENSSL_NO_DH
   190 static DH *load_dh_param(const char *dhfile);
   191 static DH *get_dh512(void);
   192 #endif
   193 
   194 
   195 #ifdef MONOLITH
   196 static void s_server_init(void);
   197 #endif
   198 
   199 #ifndef S_ISDIR
   200 # if defined(_S_IFMT) && defined(_S_IFDIR)
   201 #  define S_ISDIR(a)	(((a) & _S_IFMT) == _S_IFDIR)
   202 # else
   203 #  define S_ISDIR(a)	(((a) & S_IFMT) == S_IFDIR)
   204 # endif
   205 #endif
   206 
   207 #ifndef OPENSSL_NO_DH
   208 static unsigned char dh512_p[]={
   209 	0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
   210 	0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F,
   211 	0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3,
   212 	0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12,
   213 	0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C,
   214 	0x47,0x74,0xE8,0x33,
   215 	};
   216 static unsigned char dh512_g[]={
   217 	0x02,
   218 	};
   219 
   220 static DH *get_dh512(void)
   221 	{
   222 	DH *dh=NULL;
   223 
   224 	if ((dh=DH_new()) == NULL) return(NULL);
   225 	dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
   226 	dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
   227 	if ((dh->p == NULL) || (dh->g == NULL))
   228 		return(NULL);
   229 	return(dh);
   230 	}
   231 #endif
   232 
   233 
   234 /* static int load_CA(SSL_CTX *ctx, char *file);*/
   235 
   236 #undef BUFSIZZ
   237 #define BUFSIZZ	16*1024
   238 static int bufsize=BUFSIZZ;
   239 static int accept_socket= -1;
   240 
   241 #define TEST_CERT	"server.pem"
   242 #undef PROG
   243 #define PROG		s_server_main
   244 
   245 extern int verify_depth;
   246 
   247 static char *cipher=NULL;
   248 static int s_server_verify=SSL_VERIFY_NONE;
   249 static int s_server_session_id_context = 1; /* anything will do */
   250 static const char *s_cert_file=TEST_CERT,*s_key_file=NULL;
   251 static char *s_dcert_file=NULL,*s_dkey_file=NULL;
   252 #ifdef FIONBIO
   253 static int s_nbio=0;
   254 #endif
   255 static int s_nbio_test=0;
   256 int s_crlf=0;
   257 static SSL_CTX *ctx=NULL;
   258 static int www=0;
   259 
   260 static BIO *bio_s_out=NULL;
   261 static int s_debug=0;
   262 static int s_msg=0;
   263 static int s_quiet=0;
   264 
   265 static int hack=0;
   266 #ifndef OPENSSL_NO_ENGINE
   267 static char *engine_id=NULL;
   268 #endif
   269 static const char *session_id_prefix=NULL;
   270 
   271 static int enable_timeouts = 0;
   272 #ifdef mtu
   273 #undef mtu
   274 #endif
   275 static long mtu;
   276 static int cert_chain = 0;
   277 
   278 
   279 #ifdef MONOLITH
   280 static void s_server_init(void)
   281 	{
   282 	accept_socket=-1;
   283 	cipher=NULL;
   284 	s_server_verify=SSL_VERIFY_NONE;
   285 	s_dcert_file=NULL;
   286 	s_dkey_file=NULL;
   287 	s_cert_file=TEST_CERT;
   288 	s_key_file=NULL;
   289 #ifdef FIONBIO
   290 	s_nbio=0;
   291 #endif
   292 	s_nbio_test=0;
   293 	ctx=NULL;
   294 	www=0;
   295 
   296 	bio_s_out=NULL;
   297 	s_debug=0;
   298 	s_msg=0;
   299 	s_quiet=0;
   300 	hack=0;
   301 #ifndef OPENSSL_NO_ENGINE
   302 	engine_id=NULL;
   303 #endif
   304 	}
   305 #endif
   306 
   307 static void sv_usage(void)
   308 	{
   309 	BIO_printf(bio_err,"usage: s_server [args ...]\n");
   310 	BIO_printf(bio_err,"\n");
   311 	BIO_printf(bio_err," -accept arg   - port to accept on (default is %d)\n",PORT);
   312 	BIO_printf(bio_err," -context arg  - set session ID context\n");
   313 	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
   314 	BIO_printf(bio_err," -Verify arg   - turn on peer certificate verification, must have a cert.\n");
   315 	BIO_printf(bio_err," -cert arg     - certificate file to use\n");
   316 	BIO_printf(bio_err,"                 (default is %s)\n",TEST_CERT);
   317 	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
   318 	BIO_printf(bio_err," -key arg      - Private Key file to use, in cert file if\n");
   319 	BIO_printf(bio_err,"                 not specified (default is %s)\n",TEST_CERT);
   320 	BIO_printf(bio_err," -keyform arg  - key format (PEM, DER or ENGINE) PEM default\n");
   321 	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
   322 	BIO_printf(bio_err," -dcert arg    - second certificate file to use (usually for DSA)\n");
   323 	BIO_printf(bio_err," -dcertform x  - second certificate format (PEM or DER) PEM default\n");
   324 	BIO_printf(bio_err," -dkey arg     - second private key file to use (usually for DSA)\n");
   325 	BIO_printf(bio_err," -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
   326 	BIO_printf(bio_err," -dpass arg    - second private key file pass phrase source\n");
   327 	BIO_printf(bio_err," -dhparam arg  - DH parameter file to use, in cert file if not specified\n");
   328 	BIO_printf(bio_err,"                 or a default set of parameters is used\n");
   329 #ifndef OPENSSL_NO_ECDH
   330 	BIO_printf(bio_err," -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n" \
   331 	                   "                 Use \"openssl ecparam -list_curves\" for all names\n" \
   332 	                   "                 (default is sect163r2).\n");
   333 #endif
   334 #ifdef FIONBIO
   335 	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
   336 #endif
   337 	BIO_printf(bio_err," -nbio_test    - test with the non-blocking test bio\n");
   338 	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
   339 	BIO_printf(bio_err," -debug        - Print more output\n");
   340 	BIO_printf(bio_err," -msg          - Show protocol messages\n");
   341 	BIO_printf(bio_err," -state        - Print the SSL states\n");
   342 	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
   343 	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
   344 	BIO_printf(bio_err," -nocert       - Don't use any certificates (Anon-DH)\n");
   345 	BIO_printf(bio_err," -cipher arg   - play with 'openssl ciphers' to see what goes here\n");
   346 	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences\n");
   347 	BIO_printf(bio_err," -quiet        - No server output\n");
   348 	BIO_printf(bio_err," -no_tmp_rsa   - Do not generate a tmp RSA key\n");
   349 	BIO_printf(bio_err," -ssl2         - Just talk SSLv2\n");
   350 	BIO_printf(bio_err," -ssl3         - Just talk SSLv3\n");
   351 	BIO_printf(bio_err," -tls1         - Just talk TLSv1\n");
   352 	BIO_printf(bio_err," -dtls1        - Just talk DTLSv1\n");
   353 	BIO_printf(bio_err," -timeout      - Enable timeouts\n");
   354 	BIO_printf(bio_err," -mtu          - Set MTU\n");
   355 	BIO_printf(bio_err," -chain        - Read a certificate chain\n");
   356 	BIO_printf(bio_err," -no_ssl2      - Just disable SSLv2\n");
   357 	BIO_printf(bio_err," -no_ssl3      - Just disable SSLv3\n");
   358 	BIO_printf(bio_err," -no_tls1      - Just disable TLSv1\n");
   359 #ifndef OPENSSL_NO_DH
   360 	BIO_printf(bio_err," -no_dhe       - Disable ephemeral DH\n");
   361 #endif
   362 #ifndef OPENSSL_NO_ECDH
   363 	BIO_printf(bio_err," -no_ecdhe     - Disable ephemeral ECDH\n");
   364 #endif
   365 	BIO_printf(bio_err," -bugs         - Turn on SSL bug compatibility\n");
   366 	BIO_printf(bio_err," -www          - Respond to a 'GET /' with a status page\n");
   367 	BIO_printf(bio_err," -WWW          - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
   368 	BIO_printf(bio_err," -HTTP         - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
   369         BIO_printf(bio_err,"                 with the assumption it contains a complete HTTP response.\n");
   370 #ifndef OPENSSL_NO_ENGINE
   371 	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
   372 #endif
   373 	BIO_printf(bio_err," -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
   374 	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
   375 	}
   376 
   377 static int local_argc=0;
   378 static char **local_argv;
   379 
   380 #ifdef CHARSET_EBCDIC
   381 static int ebcdic_new(BIO *bi);
   382 static int ebcdic_free(BIO *a);
   383 static int ebcdic_read(BIO *b, char *out, int outl);
   384 static int ebcdic_write(BIO *b, const char *in, int inl);
   385 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
   386 static int ebcdic_gets(BIO *bp, char *buf, int size);
   387 static int ebcdic_puts(BIO *bp, const char *str);
   388 
   389 #define BIO_TYPE_EBCDIC_FILTER	(18|0x0200)
   390 static BIO_METHOD methods_ebcdic=
   391 	{
   392 	BIO_TYPE_EBCDIC_FILTER,
   393 	"EBCDIC/ASCII filter",
   394 	ebcdic_write,
   395 	ebcdic_read,
   396 	ebcdic_puts,
   397 	ebcdic_gets,
   398 	ebcdic_ctrl,
   399 	ebcdic_new,
   400 	ebcdic_free,
   401 	};
   402 
   403 typedef struct
   404 {
   405 	size_t	alloced;
   406 	char	buff[1];
   407 } EBCDIC_OUTBUFF;
   408 
   409 BIO_METHOD *BIO_f_ebcdic_filter()
   410 {
   411 	return(&methods_ebcdic);
   412 }
   413 
   414 static int ebcdic_new(BIO *bi)
   415 {
   416 	EBCDIC_OUTBUFF *wbuf;
   417 
   418 	wbuf = (EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
   419 	wbuf->alloced = 1024;
   420 	wbuf->buff[0] = '\0';
   421 
   422 	bi->ptr=(char *)wbuf;
   423 	bi->init=1;
   424 	bi->flags=0;
   425 	return(1);
   426 }
   427 
   428 static int ebcdic_free(BIO *a)
   429 {
   430 	if (a == NULL) return(0);
   431 	if (a->ptr != NULL)
   432 		OPENSSL_free(a->ptr);
   433 	a->ptr=NULL;
   434 	a->init=0;
   435 	a->flags=0;
   436 	return(1);
   437 }
   438 	
   439 static int ebcdic_read(BIO *b, char *out, int outl)
   440 {
   441 	int ret=0;
   442 
   443 	if (out == NULL || outl == 0) return(0);
   444 	if (b->next_bio == NULL) return(0);
   445 
   446 	ret=BIO_read(b->next_bio,out,outl);
   447 	if (ret > 0)
   448 		ascii2ebcdic(out,out,ret);
   449 	return(ret);
   450 }
   451 
   452 static int ebcdic_write(BIO *b, const char *in, int inl)
   453 {
   454 	EBCDIC_OUTBUFF *wbuf;
   455 	int ret=0;
   456 	int num;
   457 	unsigned char n;
   458 
   459 	if ((in == NULL) || (inl <= 0)) return(0);
   460 	if (b->next_bio == NULL) return(0);
   461 
   462 	wbuf=(EBCDIC_OUTBUFF *)b->ptr;
   463 
   464 	if (inl > (num = wbuf->alloced))
   465 	{
   466 		num = num + num;  /* double the size */
   467 		if (num < inl)
   468 			num = inl;
   469 		OPENSSL_free(wbuf);
   470 		wbuf=(EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
   471 
   472 		wbuf->alloced = num;
   473 		wbuf->buff[0] = '\0';
   474 
   475 		b->ptr=(char *)wbuf;
   476 	}
   477 
   478 	ebcdic2ascii(wbuf->buff, in, inl);
   479 
   480 	ret=BIO_write(b->next_bio, wbuf->buff, inl);
   481 
   482 	return(ret);
   483 }
   484 
   485 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
   486 {
   487 	long ret;
   488 
   489 	if (b->next_bio == NULL) return(0);
   490 	switch (cmd)
   491 	{
   492 	case BIO_CTRL_DUP:
   493 		ret=0L;
   494 		break;
   495 	default:
   496 		ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
   497 		break;
   498 	}
   499 	return(ret);
   500 }
   501 
   502 static int ebcdic_gets(BIO *bp, char *buf, int size)
   503 {
   504 	int i, ret=0;
   505 	if (bp->next_bio == NULL) return(0);
   506 /*	return(BIO_gets(bp->next_bio,buf,size));*/
   507 	for (i=0; i<size-1; ++i)
   508 	{
   509 		ret = ebcdic_read(bp,&buf[i],1);
   510 		if (ret <= 0)
   511 			break;
   512 		else if (buf[i] == '\n')
   513 		{
   514 			++i;
   515 			break;
   516 		}
   517 	}
   518 	if (i < size)
   519 		buf[i] = '\0';
   520 	return (ret < 0 && i == 0) ? ret : i;
   521 }
   522 
   523 static int ebcdic_puts(BIO *bp, const char *str)
   524 {
   525 	if (bp->next_bio == NULL) return(0);
   526 	return ebcdic_write(bp, str, strlen(str));
   527 }
   528 #endif
   529 
   530 int MAIN(int, char **);
   531 
   532 int MAIN(int argc, char *argv[])
   533 	{
   534 	X509_STORE *store = NULL;
   535 	int vflags = 0;
   536 	short port=PORT;
   537 	char *CApath=NULL,*CAfile=NULL;
   538 	unsigned char *context = NULL;
   539 	char *dhfile = NULL;
   540 #ifndef OPENSSL_NO_ECDH
   541 	char *named_curve = NULL;
   542 #endif
   543 	int badop=0,bugs=0;
   544 	int ret=1;
   545 	int off=0;
   546 	int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0;
   547 	int state=0;
   548 	SSL_METHOD *meth=NULL;
   549 #ifdef sock_type
   550 #undef sock_type
   551 #endif
   552     int sock_type=SOCK_STREAM;
   553 #ifndef OPENSSL_NO_ENGINE
   554 	ENGINE *e=NULL;
   555 #endif
   556 	char *inrand=NULL;
   557 	int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
   558 	char *passarg = NULL, *pass = NULL;
   559 	char *dpassarg = NULL, *dpass = NULL;
   560 	int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
   561 	X509 *s_cert = NULL, *s_dcert = NULL;
   562 	EVP_PKEY *s_key = NULL, *s_dkey = NULL;
   563 
   564 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
   565 	meth=SSLv23_server_method();
   566 #elif !defined(OPENSSL_NO_SSL3)
   567 	meth=SSLv3_server_method();
   568 #elif !defined(OPENSSL_NO_SSL2)
   569 	meth=SSLv2_server_method();
   570 #endif
   571 
   572 	local_argc=argc;
   573 	local_argv=argv;
   574 
   575 	apps_startup();
   576 #ifdef MONOLITH
   577 	s_server_init();
   578 #endif
   579 
   580 	if (bio_err == NULL)
   581 		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
   582 
   583 	if (!load_config(bio_err, NULL))
   584 		goto end;
   585 
   586 	verify_depth=0;
   587 #ifdef FIONBIO
   588 	s_nbio=0;
   589 #endif
   590 	s_nbio_test=0;
   591 
   592 	argc--;
   593 	argv++;
   594 
   595 	while (argc >= 1)
   596 		{
   597 		if	((strcmp(*argv,"-port") == 0) ||
   598 			 (strcmp(*argv,"-accept") == 0))
   599 			{
   600 			if (--argc < 1) goto bad;
   601 			if (!extract_port(*(++argv),&port))
   602 				goto bad;
   603 			}
   604 		else if	(strcmp(*argv,"-verify") == 0)
   605 			{
   606 			s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE;
   607 			if (--argc < 1) goto bad;
   608 			verify_depth=atoi(*(++argv));
   609 			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
   610 			}
   611 		else if	(strcmp(*argv,"-Verify") == 0)
   612 			{
   613 			s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
   614 				SSL_VERIFY_CLIENT_ONCE;
   615 			if (--argc < 1) goto bad;
   616 			verify_depth=atoi(*(++argv));
   617 			BIO_printf(bio_err,"verify depth is %d, must return a certificate\n",verify_depth);
   618 			}
   619 		else if	(strcmp(*argv,"-context") == 0)
   620 			{
   621 			if (--argc < 1) goto bad;
   622 			context= (unsigned char *)*(++argv);
   623 			}
   624 		else if	(strcmp(*argv,"-cert") == 0)
   625 			{
   626 			if (--argc < 1) goto bad;
   627 			s_cert_file= *(++argv);
   628 			}
   629 		else if	(strcmp(*argv,"-certform") == 0)
   630 			{
   631 			if (--argc < 1) goto bad;
   632 			s_cert_format = str2fmt(*(++argv));
   633 			}
   634 		else if	(strcmp(*argv,"-key") == 0)
   635 			{
   636 			if (--argc < 1) goto bad;
   637 			s_key_file= *(++argv);
   638 			}
   639 		else if	(strcmp(*argv,"-keyform") == 0)
   640 			{
   641 			if (--argc < 1) goto bad;
   642 			s_key_format = str2fmt(*(++argv));
   643 			}
   644 		else if	(strcmp(*argv,"-pass") == 0)
   645 			{
   646 			if (--argc < 1) goto bad;
   647 			passarg = *(++argv);
   648 			}
   649 		else if	(strcmp(*argv,"-dhparam") == 0)
   650 			{
   651 			if (--argc < 1) goto bad;
   652 			dhfile = *(++argv);
   653 			}
   654 #ifndef OPENSSL_NO_ECDH		
   655 		else if	(strcmp(*argv,"-named_curve") == 0)
   656 			{
   657 			if (--argc < 1) goto bad;
   658 			named_curve = *(++argv);
   659 			}
   660 #endif
   661 		else if	(strcmp(*argv,"-dcertform") == 0)
   662 			{
   663 			if (--argc < 1) goto bad;
   664 			s_dcert_format = str2fmt(*(++argv));
   665 			}
   666 		else if	(strcmp(*argv,"-dcert") == 0)
   667 			{
   668 			if (--argc < 1) goto bad;
   669 			s_dcert_file= *(++argv);
   670 			}
   671 		else if	(strcmp(*argv,"-dkeyform") == 0)
   672 			{
   673 			if (--argc < 1) goto bad;
   674 			s_dkey_format = str2fmt(*(++argv));
   675 			}
   676 		else if	(strcmp(*argv,"-dpass") == 0)
   677 			{
   678 			if (--argc < 1) goto bad;
   679 			dpassarg = *(++argv);
   680 			}
   681 		else if	(strcmp(*argv,"-dkey") == 0)
   682 			{
   683 			if (--argc < 1) goto bad;
   684 			s_dkey_file= *(++argv);
   685 			}
   686 		else if (strcmp(*argv,"-nocert") == 0)
   687 			{
   688 			nocert=1;
   689 			}
   690 		else if	(strcmp(*argv,"-CApath") == 0)
   691 			{
   692 			if (--argc < 1) goto bad;
   693 			CApath= *(++argv);
   694 			}
   695 		else if (strcmp(*argv,"-crl_check") == 0)
   696 			{
   697 			vflags |= X509_V_FLAG_CRL_CHECK;
   698 			}
   699 		else if (strcmp(*argv,"-crl_check") == 0)
   700 			{
   701 			vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL;
   702 			}
   703 		else if	(strcmp(*argv,"-serverpref") == 0)
   704 			{ off|=SSL_OP_CIPHER_SERVER_PREFERENCE; }
   705 		else if	(strcmp(*argv,"-cipher") == 0)
   706 			{
   707 			if (--argc < 1) goto bad;
   708 			cipher= *(++argv);
   709 			}
   710 		else if	(strcmp(*argv,"-CAfile") == 0)
   711 			{
   712 			if (--argc < 1) goto bad;
   713 			CAfile= *(++argv);
   714 			}
   715 #ifdef FIONBIO	
   716 		else if	(strcmp(*argv,"-nbio") == 0)
   717 			{ s_nbio=1; }
   718 #endif
   719 		else if	(strcmp(*argv,"-nbio_test") == 0)
   720 			{
   721 #ifdef FIONBIO	
   722 			s_nbio=1;
   723 #endif
   724 			s_nbio_test=1;
   725 			}
   726 		else if	(strcmp(*argv,"-debug") == 0)
   727 			{ s_debug=1; }
   728 		else if	(strcmp(*argv,"-msg") == 0)
   729 			{ s_msg=1; }
   730 		else if	(strcmp(*argv,"-hack") == 0)
   731 			{ hack=1; }
   732 		else if	(strcmp(*argv,"-state") == 0)
   733 			{ state=1; }
   734 		else if	(strcmp(*argv,"-crlf") == 0)
   735 			{ s_crlf=1; }
   736 		else if	(strcmp(*argv,"-quiet") == 0)
   737 			{ s_quiet=1; }
   738 		else if	(strcmp(*argv,"-bugs") == 0)
   739 			{ bugs=1; }
   740 		else if	(strcmp(*argv,"-no_tmp_rsa") == 0)
   741 			{ no_tmp_rsa=1; }
   742 		else if	(strcmp(*argv,"-no_dhe") == 0)
   743 			{ no_dhe=1; }
   744 		else if	(strcmp(*argv,"-no_ecdhe") == 0)
   745 			{ no_ecdhe=1; }
   746 		else if	(strcmp(*argv,"-www") == 0)
   747 			{ www=1; }
   748 		else if	(strcmp(*argv,"-WWW") == 0)
   749 			{ www=2; }
   750 		else if	(strcmp(*argv,"-HTTP") == 0)
   751 			{ www=3; }
   752 		else if	(strcmp(*argv,"-no_ssl2") == 0)
   753 			{ off|=SSL_OP_NO_SSLv2; }
   754 		else if	(strcmp(*argv,"-no_ssl3") == 0)
   755 			{ off|=SSL_OP_NO_SSLv3; }
   756 		else if	(strcmp(*argv,"-no_tls1") == 0)
   757 			{ off|=SSL_OP_NO_TLSv1; }
   758 #ifndef OPENSSL_NO_SSL2
   759 		else if	(strcmp(*argv,"-ssl2") == 0)
   760 			{ meth=SSLv2_server_method(); }
   761 #endif
   762 #ifndef OPENSSL_NO_SSL3
   763 		else if	(strcmp(*argv,"-ssl3") == 0)
   764 			{ meth=SSLv3_server_method(); }
   765 #endif
   766 #ifndef OPENSSL_NO_TLS1
   767 		else if	(strcmp(*argv,"-tls1") == 0)
   768 			{ meth=TLSv1_server_method(); }
   769 #endif
   770 #ifndef OPENSSL_NO_DTLS1
   771 		else if	(strcmp(*argv,"-dtls1") == 0)
   772 			{ 
   773 			meth=DTLSv1_server_method();
   774 			sock_type = SOCK_DGRAM;
   775 			}
   776 		else if (strcmp(*argv,"-timeout") == 0)
   777 			enable_timeouts = 1;
   778 		else if (strcmp(*argv,"-mtu") == 0)
   779 			{
   780 			if (--argc < 1) goto bad;
   781 			mtu = atol(*(++argv));
   782 			}
   783 		else if (strcmp(*argv, "-chain") == 0)
   784 			cert_chain = 1;
   785 #endif
   786 		else if (strcmp(*argv, "-id_prefix") == 0)
   787 			{
   788 			if (--argc < 1) goto bad;
   789 			session_id_prefix = *(++argv);
   790 			}
   791 #ifndef OPENSSL_NO_ENGINE
   792 		else if (strcmp(*argv,"-engine") == 0)
   793 			{
   794 			if (--argc < 1) goto bad;
   795 			engine_id= *(++argv);
   796 			}
   797 #endif
   798 		else if (strcmp(*argv,"-rand") == 0)
   799 			{
   800 			if (--argc < 1) goto bad;
   801 			inrand= *(++argv);
   802 			}
   803 		else
   804 			{
   805 			BIO_printf(bio_err,"unknown option %s\n",*argv);
   806 			badop=1;
   807 			break;
   808 			}
   809 		argc--;
   810 		argv++;
   811 		}
   812 	if (badop)
   813 		{
   814 bad:
   815 		sv_usage();
   816 		goto end;
   817 		}
   818 
   819 	SSL_load_error_strings();
   820 	OpenSSL_add_ssl_algorithms();
   821 
   822 #ifndef OPENSSL_NO_ENGINE
   823         e = setup_engine(bio_err, engine_id, 1);
   824 #endif
   825 
   826 	if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass))
   827 		{
   828 		BIO_printf(bio_err, "Error getting password\n");
   829 		goto end;
   830 		}
   831 
   832 
   833 	if (s_key_file == NULL)
   834 		s_key_file = s_cert_file;
   835 
   836 	if (nocert == 0)
   837 		{
   838 		s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
   839 		       "server certificate private key file");
   840 		if (!s_key)
   841 			{
   842 			ERR_print_errors(bio_err);
   843 			goto end;
   844 			}
   845 
   846 		s_cert = load_cert(bio_err,s_cert_file,s_cert_format,
   847 			NULL, e, "server certificate file");
   848 
   849 		if (!s_cert)
   850 			{
   851 			ERR_print_errors(bio_err);
   852 			goto end;
   853 			}
   854 		}
   855 
   856 	if (s_dcert_file)
   857 		{
   858 
   859 		if (s_dkey_file == NULL)
   860 			s_dkey_file = s_dcert_file;
   861 
   862 		s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
   863 				0, dpass, e,
   864 			       "second certificate private key file");
   865 		if (!s_dkey)
   866 			{
   867 			ERR_print_errors(bio_err);
   868 			goto end;
   869 			}
   870 
   871 		s_dcert = load_cert(bio_err,s_dcert_file,s_dcert_format,
   872 				NULL, e, "second server certificate file");
   873 
   874 		if (!s_dcert)
   875 			{
   876 			ERR_print_errors(bio_err);
   877 			goto end;
   878 			}
   879 
   880 		}
   881 
   882 	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
   883 		&& !RAND_status())
   884 		{
   885 		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
   886 		}
   887 	if (inrand != NULL)
   888 		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
   889 			app_RAND_load_files(inrand));
   890 
   891 	if (bio_s_out == NULL)
   892 		{
   893 		if (s_quiet && !s_debug && !s_msg)
   894 			{
   895 			bio_s_out=BIO_new(BIO_s_null());
   896 			}
   897 		else
   898 			{
   899 			if (bio_s_out == NULL)
   900 				bio_s_out=BIO_new_fp(stdout,BIO_NOCLOSE);
   901 			
   902 			}
   903 		}
   904 
   905 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
   906 	if (nocert)
   907 #endif
   908 		{
   909 		s_cert_file=NULL;
   910 		s_key_file=NULL;
   911 		s_dcert_file=NULL;
   912 		s_dkey_file=NULL;
   913 		}
   914 
   915 	ctx=SSL_CTX_new(meth);
   916 	if (ctx == NULL)
   917 		{
   918 		ERR_print_errors(bio_err);
   919 		goto end;
   920 		}
   921 	if (session_id_prefix)
   922 		{
   923 		if(strlen(session_id_prefix) >= 32)
   924 			BIO_printf(bio_err,
   925 "warning: id_prefix is too long, only one new session will be possible\n");
   926 		else if(strlen(session_id_prefix) >= 16)
   927 			BIO_printf(bio_err,
   928 "warning: id_prefix is too long if you use SSLv2\n");
   929 		if(!SSL_CTX_set_generate_session_id(ctx, generate_session_id))
   930 			{
   931 			BIO_printf(bio_err,"error setting 'id_prefix'\n");
   932 			ERR_print_errors(bio_err);
   933 			goto end;
   934 			}
   935 		BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
   936 		}
   937 	SSL_CTX_set_quiet_shutdown(ctx,1);
   938 	if (bugs) SSL_CTX_set_options(ctx,SSL_OP_ALL);
   939 	if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
   940 	SSL_CTX_set_options(ctx,off);
   941 	/* DTLS: partial reads end up discarding unread UDP bytes :-( 
   942 	 * Setting read ahead solves this problem.
   943 	 */
   944 	if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
   945 
   946 	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
   947 
   948 	SSL_CTX_sess_set_cache_size(ctx,128);
   949 
   950 #if 0
   951 	if (cipher == NULL) cipher=getenv("SSL_CIPHER");
   952 #endif
   953 
   954 #if 0
   955 	if (s_cert_file == NULL)
   956 		{
   957 		BIO_printf(bio_err,"You must specify a certificate file for the server to use\n");
   958 		goto end;
   959 		}
   960 #endif
   961 
   962 	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
   963 		(!SSL_CTX_set_default_verify_paths(ctx)))
   964 		{
   965 		/* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
   966 		ERR_print_errors(bio_err);
   967 		/* goto end; */
   968 		}
   969 	store = SSL_CTX_get_cert_store(ctx);
   970 	X509_STORE_set_flags(store, vflags);
   971 
   972 #ifndef OPENSSL_NO_DH
   973 	if (!no_dhe)
   974 		{
   975 		DH *dh=NULL;
   976 
   977 		if (dhfile)
   978 			dh = load_dh_param(dhfile);
   979 		else if (s_cert_file)
   980 			dh = load_dh_param(s_cert_file);
   981 
   982 		if (dh != NULL)
   983 			{
   984 			BIO_printf(bio_s_out,"Setting temp DH parameters\n");
   985 			}
   986 		else
   987 			{
   988 			BIO_printf(bio_s_out,"Using default temp DH parameters\n");
   989 			dh=get_dh512();
   990 			}
   991 		(void)BIO_flush(bio_s_out);
   992 
   993 		SSL_CTX_set_tmp_dh(ctx,dh);
   994 		DH_free(dh);
   995 		}
   996 #endif
   997 
   998 #ifndef OPENSSL_NO_ECDH
   999 	if (!no_ecdhe)
  1000 		{
  1001 		EC_KEY *ecdh=NULL;
  1002 
  1003 		if (named_curve)
  1004 			{
  1005 			int nid = OBJ_sn2nid(named_curve);
  1006 
  1007 			if (nid == 0)
  1008 				{
  1009 				BIO_printf(bio_err, "unknown curve name (%s)\n", 
  1010 					named_curve);
  1011 				goto end;
  1012 				}
  1013 			ecdh = EC_KEY_new_by_curve_name(nid);
  1014 			if (ecdh == NULL)
  1015 				{
  1016 				BIO_printf(bio_err, "unable to create curve (%s)\n", 
  1017 					named_curve);
  1018 				goto end;
  1019 				}
  1020 			}
  1021 
  1022 		if (ecdh != NULL)
  1023 			{
  1024 			BIO_printf(bio_s_out,"Setting temp ECDH parameters\n");
  1025 			}
  1026 		else
  1027 			{
  1028 			BIO_printf(bio_s_out,"Using default temp ECDH parameters\n");
  1029 			ecdh = EC_KEY_new_by_curve_name(NID_sect163r2);
  1030 			if (ecdh == NULL) 
  1031 				{
  1032 				BIO_printf(bio_err, "unable to create curve (sect163r2)\n");
  1033 				goto end;
  1034 				}
  1035 			}
  1036 		(void)BIO_flush(bio_s_out);
  1037 
  1038 		SSL_CTX_set_tmp_ecdh(ctx,ecdh);
  1039 		EC_KEY_free(ecdh);
  1040 		}
  1041 #endif
  1042 	
  1043 	if (!set_cert_key_stuff(ctx,s_cert,s_key))
  1044 		goto end;
  1045 	if (s_dcert != NULL)
  1046 		{
  1047 		if (!set_cert_key_stuff(ctx,s_dcert,s_dkey))
  1048 			goto end;
  1049 		}
  1050 
  1051 #ifndef OPENSSL_NO_RSA
  1052 #if 1
  1053 	if (!no_tmp_rsa)
  1054 		SSL_CTX_set_tmp_rsa_callback(ctx,tmp_rsa_cb);
  1055 #else
  1056 	if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx))
  1057 		{
  1058 		RSA *rsa;
  1059 
  1060 		BIO_printf(bio_s_out,"Generating temp (512 bit) RSA key...");
  1061 		BIO_flush(bio_s_out);
  1062 
  1063 		rsa=RSA_generate_key(512,RSA_F4,NULL);
  1064 
  1065 		if (!SSL_CTX_set_tmp_rsa(ctx,rsa))
  1066 			{
  1067 			ERR_print_errors(bio_err);
  1068 			goto end;
  1069 			}
  1070 		RSA_free(rsa);
  1071 		BIO_printf(bio_s_out,"\n");
  1072 		}
  1073 #endif
  1074 #endif
  1075 
  1076 	if (cipher != NULL)
  1077 		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
  1078 		BIO_printf(bio_err,"error setting cipher list\n");
  1079 		ERR_print_errors(bio_err);
  1080 		goto end;
  1081 	}
  1082 	SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
  1083 	SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,
  1084 		sizeof s_server_session_id_context);
  1085 
  1086 	if (CAfile != NULL)
  1087 	    SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
  1088 
  1089 	BIO_printf(bio_s_out,"ACCEPT\n");
  1090 	if (www)
  1091 		do_server(port,sock_type,&accept_socket,www_body, context);
  1092 	else
  1093 		do_server(port,sock_type,&accept_socket,sv_body, context);
  1094 	print_stats(bio_s_out,ctx);
  1095 	ret=0;
  1096 end:
  1097 	if (ctx != NULL) SSL_CTX_free(ctx);
  1098 	if (s_cert)
  1099 		X509_free(s_cert);
  1100 	if (s_dcert)
  1101 		X509_free(s_dcert);
  1102 	if (s_key)
  1103 		EVP_PKEY_free(s_key);
  1104 	if (s_dkey)
  1105 		EVP_PKEY_free(s_dkey);
  1106 	if (pass)
  1107 		OPENSSL_free(pass);
  1108 	if (dpass)
  1109 		OPENSSL_free(dpass);
  1110 	if (bio_s_out != NULL)
  1111 		{
  1112         BIO_free(bio_s_out);
  1113 		bio_s_out=NULL;
  1114 		}
  1115 	apps_shutdown();
  1116 	OPENSSL_EXIT(ret);
  1117 	}
  1118 
  1119 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
  1120 	{
  1121 	BIO_printf(bio,"%4ld items in the session cache\n",
  1122 		SSL_CTX_sess_number(ssl_ctx));
  1123 	BIO_printf(bio,"%4ld client connects (SSL_connect())\n",
  1124 		SSL_CTX_sess_connect(ssl_ctx));
  1125 	BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n",
  1126 		SSL_CTX_sess_connect_renegotiate(ssl_ctx));
  1127 	BIO_printf(bio,"%4ld client connects that finished\n",
  1128 		SSL_CTX_sess_connect_good(ssl_ctx));
  1129 	BIO_printf(bio,"%4ld server accepts (SSL_accept())\n",
  1130 		SSL_CTX_sess_accept(ssl_ctx));
  1131 	BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n",
  1132 		SSL_CTX_sess_accept_renegotiate(ssl_ctx));
  1133 	BIO_printf(bio,"%4ld server accepts that finished\n",
  1134 		SSL_CTX_sess_accept_good(ssl_ctx));
  1135 	BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
  1136 	BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
  1137 	BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
  1138 	BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
  1139 	BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n",
  1140 		SSL_CTX_sess_cache_full(ssl_ctx),
  1141 		SSL_CTX_sess_get_cache_size(ssl_ctx));
  1142 	}
  1143 
  1144 static int sv_body(char *hostname, int s, unsigned char *context)
  1145 	{
  1146 	char *buf=NULL;
  1147 	fd_set readfds;
  1148 	int ret=1,width;
  1149 	int k,i;
  1150 	unsigned long l;
  1151 	SSL *con=NULL;
  1152 	BIO *sbio;
  1153 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
  1154 	struct timeval tv;
  1155 #endif
  1156 
  1157 	if ((buf=OPENSSL_malloc(bufsize)) == NULL)
  1158 		{
  1159 		BIO_printf(bio_err,"out of memory\n");
  1160 		goto err;
  1161 		}
  1162 #ifdef FIONBIO	
  1163 	if (s_nbio)
  1164 		{
  1165 		unsigned long sl=1;
  1166 
  1167 		if (!s_quiet)
  1168 			BIO_printf(bio_err,"turning on non blocking io\n");
  1169 		if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
  1170 			ERR_print_errors(bio_err);
  1171 		}
  1172 #endif
  1173 
  1174 	if (con == NULL) {
  1175 		con=SSL_new(ctx);
  1176 #ifndef OPENSSL_NO_KRB5
  1177 		if ((con->kssl_ctx = kssl_ctx_new()) != NULL)
  1178                         {
  1179                         kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE,
  1180 								KRB5SVC);
  1181                         kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB,
  1182 								KRB5KEYTAB);
  1183                         }
  1184 #endif	/* OPENSSL_NO_KRB5 */
  1185 		if(context)
  1186 		      SSL_set_session_id_context(con, context,
  1187 						 strlen((char *)context));
  1188 	}
  1189 	SSL_clear(con);
  1190 
  1191 	if (SSL_version(con) == DTLS1_VERSION)
  1192 		{
  1193 		struct timeval timeout;
  1194 
  1195 		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
  1196 
  1197 		if ( enable_timeouts)
  1198 			{
  1199 			timeout.tv_sec = 0;
  1200 			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
  1201 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
  1202 			
  1203 			timeout.tv_sec = 0;
  1204 			timeout.tv_usec = DGRAM_SND_TIMEOUT;
  1205 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
  1206 			}
  1207 
  1208 		
  1209 		if ( mtu > 0)
  1210 			{
  1211 			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
  1212 			SSL_set_mtu(con, mtu);
  1213 			}
  1214 		else
  1215 			/* want to do MTU discovery */
  1216 			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
  1217 
  1218         /* turn on cookie exchange */
  1219         SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
  1220 		}
  1221 	else
  1222 		sbio=BIO_new_socket(s,BIO_NOCLOSE);
  1223 
  1224 	if (s_nbio_test)
  1225 		{
  1226 		BIO *test;
  1227 
  1228 		test=BIO_new(BIO_f_nbio_test());
  1229 		sbio=BIO_push(test,sbio);
  1230 		}
  1231 	SSL_set_bio(con,sbio,sbio);
  1232 	SSL_set_accept_state(con);
  1233 	/* SSL_set_fd(con,s); */
  1234 
  1235 	if (s_debug)
  1236 		{
  1237 		con->debug=1;
  1238 		BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
  1239 		BIO_set_callback_arg(SSL_get_rbio(con),(char*)bio_s_out);
  1240 		}
  1241 	if (s_msg)
  1242 		{
  1243 		SSL_set_msg_callback(con, msg_cb);
  1244 		SSL_set_msg_callback_arg(con, bio_s_out);
  1245 		}
  1246 
  1247 	width=s+1;
  1248 	for (;;)
  1249 		{
  1250 		int read_from_terminal;
  1251 		int read_from_sslcon;
  1252 
  1253 		read_from_terminal = 0;
  1254 		read_from_sslcon = SSL_pending(con);
  1255 
  1256 		if (!read_from_sslcon)
  1257 			{
  1258 			FD_ZERO(&readfds);
  1259 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
  1260 			FD_SET(fileno(stdin),&readfds);
  1261 	
  1262 #endif
  1263 			FD_SET(s,&readfds);
  1264 			/* Note: under VMS with SOCKETSHR the second parameter is
  1265 			 * currently of type (int *) whereas under other systems
  1266 			 * it is (void *) if you don't have a cast it will choke
  1267 			 * the compiler: if you do have a cast then you can either
  1268 			 * go for (int *) or (void *).
  1269 			 */
  1270 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
  1271                         /* Under DOS (non-djgpp) and Windows we can't select on stdin: only
  1272 			 * on sockets. As a workaround we timeout the select every
  1273 			 * second and check for any keypress. In a proper Windows
  1274 			 * application we wouldn't do this because it is inefficient.
  1275 			 */
  1276 			tv.tv_sec = 1;
  1277 			tv.tv_usec = 0;
  1278 			i=select(width,(void *)&readfds,NULL,NULL,&tv);
  1279 			if((i < 0) || (!i && !_kbhit() ) )continue;
  1280 			if(_kbhit())
  1281 				read_from_terminal = 1;
  1282 #else
  1283 			i=select(width,(void *)&readfds,NULL,NULL,NULL);
  1284 			if (i <= 0) continue;
  1285 			if (FD_ISSET(fileno(stdin),&readfds))
  1286 			
  1287 				read_from_terminal = 1;
  1288 #endif
  1289 			if (FD_ISSET(s,&readfds))
  1290 				read_from_sslcon = 1;
  1291 			}
  1292 		if (read_from_terminal)
  1293 			{
  1294 			if (s_crlf)
  1295 				{
  1296 				int j, lf_num;
  1297 				i=read(fileno(stdin), buf, bufsize/2);
  1298 				lf_num = 0;
  1299 				/* both loops are skipped when i <= 0 */
  1300 				for (j = 0; j < i; j++)
  1301 					if (buf[j] == '\n')
  1302 						lf_num++;
  1303 				for (j = i-1; j >= 0; j--)
  1304 					{
  1305 					buf[j+lf_num] = buf[j];
  1306 					if (buf[j] == '\n')
  1307 						{
  1308 						lf_num--;
  1309 						i++;
  1310 						buf[j+lf_num] = '\r';
  1311 						}
  1312 					}
  1313 				assert(lf_num == 0);
  1314 				}
  1315 			else
  1316 				i=read(fileno(stdin),buf,bufsize);
  1317 				
  1318 			if (!s_quiet)
  1319 				{
  1320 				if ((i <= 0) || (buf[0] == 'Q'))
  1321 					{
  1322 					BIO_printf(bio_s_out,"DONE\n");
  1323 					SHUTDOWN(s);
  1324 					close_accept_socket();
  1325 					ret= -11;
  1326 					goto err;
  1327 					}
  1328 				if ((i <= 0) || (buf[0] == 'q'))
  1329 					{
  1330 					BIO_printf(bio_s_out,"DONE\n");
  1331 					if (SSL_version(con) != DTLS1_VERSION)
  1332                         SHUTDOWN(s);
  1333 	/*				close_accept_socket();
  1334 					ret= -11;*/
  1335 					goto err;
  1336 					}
  1337 				if ((buf[0] == 'r') && 
  1338 					((buf[1] == '\n') || (buf[1] == '\r')))
  1339 					{
  1340 					SSL_renegotiate(con);
  1341 					i=SSL_do_handshake(con);
  1342 					printf("SSL_do_handshake -> %d\n",i);
  1343 					
  1344 					i=0; /*13; */
  1345 					continue;
  1346 					/* strcpy(buf,"server side RE-NEGOTIATE\n"); */
  1347 					}
  1348 				if ((buf[0] == 'R') &&
  1349 					((buf[1] == '\n') || (buf[1] == '\r')))
  1350 					{
  1351 					SSL_set_verify(con,
  1352 						SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
  1353 					SSL_renegotiate(con);
  1354 					i=SSL_do_handshake(con);
  1355 					printf("SSL_do_handshake -> %d\n",i);
  1356 				
  1357 					i=0; /* 13; */
  1358 					continue;
  1359 					/* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */
  1360 					}
  1361 				if (buf[0] == 'P')
  1362 					{
  1363 					static const char *str="Lets print some clear text\n";
  1364 					BIO_write(SSL_get_wbio(con),str,strlen(str));
  1365 					}
  1366 				if (buf[0] == 'S')
  1367 					{
  1368 					print_stats(bio_s_out,SSL_get_SSL_CTX(con));
  1369 					}
  1370 				}
  1371 #ifdef CHARSET_EBCDIC
  1372 			ebcdic2ascii(buf,buf,i);
  1373 #endif
  1374 			l=k=0;
  1375 			for (;;)
  1376 				{
  1377 				/* should do a select for the write */
  1378 #ifdef RENEG
  1379 { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } }
  1380 #endif
  1381 				k=SSL_write(con,&(buf[l]),(unsigned int)i);
  1382 				switch (SSL_get_error(con,k))
  1383 					{
  1384 				case SSL_ERROR_NONE:
  1385 					break;
  1386 				case SSL_ERROR_WANT_WRITE:
  1387 				case SSL_ERROR_WANT_READ:
  1388 				case SSL_ERROR_WANT_X509_LOOKUP:
  1389 					BIO_printf(bio_s_out,"Write BLOCK\n");
  1390 					break;
  1391 				case SSL_ERROR_SYSCALL:
  1392 				case SSL_ERROR_SSL:
  1393 					BIO_printf(bio_s_out,"ERROR\n");
  1394 					ERR_print_errors(bio_err);
  1395 					ret=1;
  1396 					goto err;
  1397 					/* break; */
  1398 				case SSL_ERROR_ZERO_RETURN:
  1399 					BIO_printf(bio_s_out,"DONE\n");
  1400 					ret=1;
  1401 					goto err;
  1402 					}
  1403 				l+=k;
  1404 				i-=k;
  1405 				if (i <= 0) break;
  1406 				}
  1407 			}
  1408 		if (read_from_sslcon)
  1409 			{
  1410 			if (!SSL_is_init_finished(con))
  1411 				{
  1412 				i=init_ssl_connection(con);
  1413 				
  1414 				if (i < 0)
  1415 					{
  1416 					ret=0;
  1417 					goto err;
  1418 					}
  1419 				else if (i == 0)
  1420 					{
  1421 					ret=1;
  1422 					goto err;
  1423 					}
  1424 				}
  1425 			else
  1426 				{
  1427 again:	
  1428 				i=SSL_read(con,(char *)buf,bufsize);
  1429 				switch (SSL_get_error(con,i))
  1430 					{
  1431 				case SSL_ERROR_NONE:
  1432 #ifdef CHARSET_EBCDIC
  1433 					ascii2ebcdic(buf,buf,i);
  1434 #endif
  1435 					write(fileno(stdout),buf,
  1436 						(unsigned int)i);
  1437 		
  1438 					if (SSL_pending(con)) goto again;
  1439 					break;
  1440 				case SSL_ERROR_WANT_WRITE:
  1441 				case SSL_ERROR_WANT_READ:
  1442 				case SSL_ERROR_WANT_X509_LOOKUP:
  1443 					BIO_printf(bio_s_out,"Read BLOCK\n");
  1444 					break;
  1445 				case SSL_ERROR_SYSCALL:
  1446 				case SSL_ERROR_SSL:
  1447 					BIO_printf(bio_s_out,"ERROR\n");
  1448 					ERR_print_errors(bio_err);
  1449 					ret=1;
  1450 					goto err;
  1451 				case SSL_ERROR_ZERO_RETURN:
  1452 					BIO_printf(bio_s_out,"DONE\n");
  1453 					ret=1;
  1454 					goto err;
  1455 					}
  1456 				}
  1457 			}
  1458 		}
  1459 err:
  1460 	BIO_printf(bio_s_out,"shutting down SSL\n");
  1461 #if 1
  1462 	SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
  1463 #else
  1464 	SSL_shutdown(con);
  1465 #endif
  1466 	if (con != NULL) SSL_free(con);
  1467 	BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
  1468 	if (buf != NULL)
  1469 		{
  1470 		OPENSSL_cleanse(buf,bufsize);
  1471 		OPENSSL_free(buf);
  1472 		}
  1473 	if (ret >= 0)
  1474 		BIO_printf(bio_s_out,"ACCEPT\n");
  1475 	return(ret);
  1476 	}
  1477 
  1478 static void close_accept_socket(void)
  1479 	{
  1480 	BIO_printf(bio_err,"shutdown accept socket\n");
  1481 	if (accept_socket >= 0)
  1482 		{
  1483 		SHUTDOWN2(accept_socket);
  1484 		}
  1485 	}
  1486 
  1487 static int init_ssl_connection(SSL *con)
  1488 	{
  1489 	int i;
  1490 	const char *str;
  1491 	X509 *peer;
  1492 	long verify_error;
  1493 	MS_STATIC char buf[BUFSIZ];
  1494 
  1495 	if ((i=SSL_accept(con)) <= 0)
  1496 		{
  1497 		if (BIO_sock_should_retry(i))
  1498 			{
  1499 			BIO_printf(bio_s_out,"DELAY\n");
  1500 			return(1);
  1501 			}
  1502 
  1503 		BIO_printf(bio_err,"ERROR\n");
  1504 		verify_error=SSL_get_verify_result(con);
  1505 		if (verify_error != X509_V_OK)
  1506 			{
  1507 			BIO_printf(bio_err,"verify error:%s\n",
  1508 				X509_verify_cert_error_string(verify_error));
  1509 			}
  1510 		else
  1511 			ERR_print_errors(bio_err);
  1512 		return(0);
  1513 		}
  1514 
  1515 	PEM_write_bio_SSL_SESSION(bio_s_out,SSL_get_session(con));
  1516 
  1517 	peer=SSL_get_peer_certificate(con);
  1518 	if (peer != NULL)
  1519 		{
  1520 		BIO_printf(bio_s_out,"Client certificate\n");
  1521 		PEM_write_bio_X509(bio_s_out,peer);
  1522 		X509_NAME_oneline(X509_get_subject_name(peer),buf,sizeof buf);
  1523 		BIO_printf(bio_s_out,"subject=%s\n",buf);
  1524 		X509_NAME_oneline(X509_get_issuer_name(peer),buf,sizeof buf);
  1525 		BIO_printf(bio_s_out,"issuer=%s\n",buf);
  1526 		X509_free(peer);
  1527 		}
  1528 
  1529 	if (SSL_get_shared_ciphers(con,buf,sizeof buf) != NULL)
  1530 		BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf);
  1531 	str=SSL_CIPHER_get_name(SSL_get_current_cipher(con));
  1532 	BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)");
  1533 	if (con->hit) BIO_printf(bio_s_out,"Reused session-id\n");
  1534 	if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
  1535 		TLS1_FLAGS_TLS_PADDING_BUG)
  1536 		BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n");
  1537 #ifndef OPENSSL_NO_KRB5
  1538 	if (con->kssl_ctx->client_princ != NULL)
  1539 		{
  1540 		BIO_printf(bio_s_out,"Kerberos peer principal is %s\n",
  1541 			con->kssl_ctx->client_princ);
  1542 		}
  1543 #endif /* OPENSSL_NO_KRB5 */
  1544 	return(1);
  1545 	}
  1546 
  1547 #ifndef OPENSSL_NO_DH
  1548 static DH *load_dh_param(const char *dhfile)
  1549 	{
  1550 	DH *ret=NULL;
  1551 	BIO *bio;
  1552 
  1553 	if ((bio=BIO_new_file(dhfile,"r")) == NULL)
  1554 		goto err;
  1555 	ret=PEM_read_bio_DHparams(bio,NULL,NULL,NULL);
  1556 err:
  1557 	if (bio != NULL) BIO_free(bio);
  1558 	return(ret);
  1559 	}
  1560 #endif
  1561 
  1562 #if 0
  1563 static int load_CA(SSL_CTX *ctx, char *file)
  1564 	{
  1565 	FILE *in;
  1566 	X509 *x=NULL;
  1567 
  1568 	if ((in=fopen(file,"r")) == NULL)
  1569 		return(0);
  1570 
  1571 	for (;;)
  1572 		{
  1573 		if (PEM_read_X509(in,&x,NULL) == NULL)
  1574 			break;
  1575 		SSL_CTX_add_client_CA(ctx,x);
  1576 		}
  1577 	if (x != NULL) X509_free(x);
  1578 	fclose(in);
  1579 	return(1);
  1580 	}
  1581 #endif
  1582 
  1583 static int www_body(char *hostname, int s, unsigned char *context)
  1584 	{
  1585 	char *buf=NULL;
  1586 	int ret=1;
  1587 	int i,j,k,blank,dot;
  1588 	struct stat st_buf;
  1589 	SSL *con;
  1590 	SSL_CIPHER *c;
  1591 	BIO *io,*ssl_bio,*sbio;
  1592 	long total_bytes;
  1593 
  1594 	buf=OPENSSL_malloc(bufsize);
  1595 	if (buf == NULL) return(0);
  1596 	io=BIO_new(BIO_f_buffer());
  1597 	ssl_bio=BIO_new(BIO_f_ssl());
  1598 	if ((io == NULL) || (ssl_bio == NULL)) goto err;
  1599 
  1600 #ifdef FIONBIO	
  1601 	if (s_nbio)
  1602 		{
  1603 		unsigned long sl=1;
  1604 
  1605 		if (!s_quiet)
  1606 			BIO_printf(bio_err,"turning on non blocking io\n");
  1607 		if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
  1608 			ERR_print_errors(bio_err);
  1609 		}
  1610 #endif
  1611 
  1612 	/* lets make the output buffer a reasonable size */
  1613 	if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
  1614 
  1615 	if ((con=SSL_new(ctx)) == NULL) goto err;
  1616 #ifndef OPENSSL_NO_KRB5
  1617 	if ((con->kssl_ctx = kssl_ctx_new()) != NULL)
  1618 		{
  1619 		kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC);
  1620 		kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB);
  1621 		}
  1622 #endif	/* OPENSSL_NO_KRB5 */
  1623 	if(context) SSL_set_session_id_context(con, context,
  1624 					       strlen((char *)context));
  1625 
  1626 	sbio=BIO_new_socket(s,BIO_NOCLOSE);
  1627 	if (s_nbio_test)
  1628 		{
  1629 		BIO *test;
  1630 
  1631 		test=BIO_new(BIO_f_nbio_test());
  1632 		sbio=BIO_push(test,sbio);
  1633 		}
  1634 	SSL_set_bio(con,sbio,sbio);
  1635 	SSL_set_accept_state(con);
  1636 
  1637 	/* SSL_set_fd(con,s); */
  1638 	BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
  1639 	BIO_push(io,ssl_bio);
  1640 #ifdef CHARSET_EBCDIC
  1641 	io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
  1642 #endif
  1643 
  1644 	if (s_debug)
  1645 		{
  1646 		con->debug=1;
  1647 		BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
  1648 		BIO_set_callback_arg(SSL_get_rbio(con),(char*)bio_s_out);
  1649 		}
  1650 	if (s_msg)
  1651 		{
  1652 		SSL_set_msg_callback(con, msg_cb);
  1653 		SSL_set_msg_callback_arg(con, bio_s_out);
  1654 		}
  1655 
  1656 	blank=0;
  1657 	for (;;)
  1658 		{
  1659 		if (hack)
  1660 			{
  1661 			i=SSL_accept(con);
  1662 
  1663 			switch (SSL_get_error(con,i))
  1664 				{
  1665 			case SSL_ERROR_NONE:
  1666 				break;
  1667 			case SSL_ERROR_WANT_WRITE:
  1668 			case SSL_ERROR_WANT_READ:
  1669 			case SSL_ERROR_WANT_X509_LOOKUP:
  1670 				continue;
  1671 			case SSL_ERROR_SYSCALL:
  1672 			case SSL_ERROR_SSL:
  1673 			case SSL_ERROR_ZERO_RETURN:
  1674 				ret=1;
  1675 				goto err;
  1676 				/* break; */
  1677 				}
  1678 
  1679 			SSL_renegotiate(con);
  1680 			SSL_write(con,NULL,0);
  1681 			}
  1682 
  1683 		i=BIO_gets(io,buf,bufsize-1);
  1684 		if (i < 0) /* error */
  1685 			{
  1686 			if (!BIO_should_retry(io))
  1687 				{
  1688 				if (!s_quiet)
  1689 					ERR_print_errors(bio_err);
  1690 				goto err;
  1691 				}
  1692 			else
  1693 				{
  1694 				BIO_printf(bio_s_out,"read R BLOCK\n");
  1695 #if defined(OPENSSL_SYS_NETWARE)
  1696             delay(1000);
  1697 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
  1698 				sleep(1);
  1699 #endif
  1700 				continue;
  1701 				}
  1702 			}
  1703 		else if (i == 0) /* end of input */
  1704 			{
  1705 			ret=1;
  1706 			goto end;
  1707 			}
  1708 
  1709 		/* else we have data */
  1710 		if (	((www == 1) && (strncmp("GET ",buf,4) == 0)) ||
  1711 			((www == 2) && (strncmp("GET /stats ",buf,10) == 0)))
  1712 			{
  1713 			char *p;
  1714 			X509 *peer;
  1715 			STACK_OF(SSL_CIPHER) *sk;
  1716 			static const char *space="                          ";
  1717 
  1718 			BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
  1719 			BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n");
  1720 			BIO_puts(io,"<pre>\n");
  1721 /*			BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
  1722 			BIO_puts(io,"\n");
  1723 			for (i=0; i<local_argc; i++)
  1724 				{
  1725 				BIO_puts(io,local_argv[i]);
  1726 				BIO_write(io," ",1);
  1727 				}
  1728 			BIO_puts(io,"\n");
  1729 
  1730 			/* The following is evil and should not really
  1731 			 * be done */
  1732 			BIO_printf(io,"Ciphers supported in s_server binary\n");
  1733 			sk=SSL_get_ciphers(con);
  1734 			j=sk_SSL_CIPHER_num(sk);
  1735 			for (i=0; i<j; i++)
  1736 				{
  1737 				c=sk_SSL_CIPHER_value(sk,i);
  1738 				BIO_printf(io,"%-11s:%-25s",
  1739 					SSL_CIPHER_get_version(c),
  1740 					SSL_CIPHER_get_name(c));
  1741 				if ((((i+1)%2) == 0) && (i+1 != j))
  1742 					BIO_puts(io,"\n");
  1743 				}
  1744 			BIO_puts(io,"\n");
  1745 			p=SSL_get_shared_ciphers(con,buf,bufsize);
  1746 			if (p != NULL)
  1747 				{
  1748 				BIO_printf(io,"---\nCiphers common between both SSL end points:\n");
  1749 				j=i=0;
  1750 				while (*p)
  1751 					{
  1752 					if (*p == ':')
  1753 						{
  1754 						BIO_write(io,space,26-j);
  1755 						i++;
  1756 						j=0;
  1757 						BIO_write(io,((i%3)?" ":"\n"),1);
  1758 						}
  1759 					else
  1760 						{
  1761 						BIO_write(io,p,1);
  1762 						j++;
  1763 						}
  1764 					p++;
  1765 					}
  1766 				BIO_puts(io,"\n");
  1767 				}
  1768 			BIO_printf(io,((con->hit)
  1769 				?"---\nReused, "
  1770 				:"---\nNew, "));
  1771 			c=SSL_get_current_cipher(con);
  1772 			BIO_printf(io,"%s, Cipher is %s\n",
  1773 				SSL_CIPHER_get_version(c),
  1774 				SSL_CIPHER_get_name(c));
  1775 			SSL_SESSION_print(io,SSL_get_session(con));
  1776 			BIO_printf(io,"---\n");
  1777 			print_stats(io,SSL_get_SSL_CTX(con));
  1778 			BIO_printf(io,"---\n");
  1779 			peer=SSL_get_peer_certificate(con);
  1780 			if (peer != NULL)
  1781 				{
  1782 				BIO_printf(io,"Client certificate\n");
  1783 				X509_print(io,peer);
  1784 				PEM_write_bio_X509(io,peer);
  1785 				}
  1786 			else
  1787 				BIO_puts(io,"no client certificate available\n");
  1788 			BIO_puts(io,"</BODY></HTML>\r\n\r\n");
  1789 			break;
  1790 			}
  1791 		else if ((www == 2 || www == 3)
  1792                          && (strncmp("GET /",buf,5) == 0))
  1793 			{
  1794 			BIO *file;
  1795 			char *p,*e;
  1796 			static const char *text="HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
  1797 
  1798 			/* skip the '/' */
  1799 			p= &(buf[5]);
  1800 
  1801 			dot = 1;
  1802 			for (e=p; *e != '\0'; e++)
  1803 				{
  1804 				if (e[0] == ' ')
  1805 					break;
  1806 
  1807 				switch (dot)
  1808 					{
  1809 				case 1:
  1810 					dot = (e[0] == '.') ? 2 : 0;
  1811 					break;
  1812 				case 2:
  1813 					dot = (e[0] == '.') ? 3 : 0;
  1814 					break;
  1815 				case 3:
  1816 					dot = (e[0] == '/') ? -1 : 0;
  1817 					break;
  1818 					}
  1819 				if (dot == 0)
  1820 					dot = (e[0] == '/') ? 1 : 0;
  1821 				}
  1822 			dot = (dot == 3) || (dot == -1); /* filename contains ".." component */
  1823 
  1824 			if (*e == '\0')
  1825 				{
  1826 				BIO_puts(io,text);
  1827 				BIO_printf(io,"'%s' is an invalid file name\r\n",p);
  1828 				break;
  1829 				}
  1830 			*e='\0';
  1831 
  1832 			if (dot)
  1833 				{
  1834 				BIO_puts(io,text);
  1835 				BIO_printf(io,"'%s' contains '..' reference\r\n",p);
  1836 				break;
  1837 				}
  1838 
  1839 			if (*p == '/')
  1840 				{
  1841 				BIO_puts(io,text);
  1842 				BIO_printf(io,"'%s' is an invalid path\r\n",p);
  1843 				break;
  1844 				}
  1845 
  1846 #if 0
  1847 			/* append if a directory lookup */
  1848 			if (e[-1] == '/')
  1849 				strcat(p,"index.html");
  1850 #endif
  1851 
  1852 			/* if a directory, do the index thang */
  1853 			if (stat(p,&st_buf) < 0)
  1854 				{
  1855 				BIO_puts(io,text);
  1856 				BIO_printf(io,"Error accessing '%s'\r\n",p);
  1857 				ERR_print_errors(io);
  1858 				break;
  1859 				}
  1860 			if (S_ISDIR(st_buf.st_mode))
  1861 				{
  1862 #if 0 /* must check buffer size */
  1863 				strcat(p,"/index.html");
  1864 #else
  1865 				BIO_puts(io,text);
  1866 				BIO_printf(io,"'%s' is a directory\r\n",p);
  1867 				break;
  1868 #endif
  1869 				}
  1870 
  1871 			if ((file=BIO_new_file(p,"r")) == NULL)
  1872 				{
  1873 				BIO_puts(io,text);
  1874 				BIO_printf(io,"Error opening '%s'\r\n",p);
  1875 				ERR_print_errors(io);
  1876 				break;
  1877 				}
  1878 
  1879 			if (!s_quiet)
  1880 				BIO_printf(bio_err,"FILE:%s\n",p);
  1881 
  1882                         if (www == 2)
  1883                                 {
  1884                                 i=strlen(p);
  1885                                 if (	((i > 5) && (strcmp(&(p[i-5]),".html") == 0)) ||
  1886                                         ((i > 4) && (strcmp(&(p[i-4]),".php") == 0)) ||
  1887                                         ((i > 4) && (strcmp(&(p[i-4]),".htm") == 0)))
  1888                                         BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
  1889                                 else
  1890                                         BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
  1891                                 }
  1892 			/* send the file */
  1893 			total_bytes=0;
  1894 			for (;;)
  1895 				{
  1896 				i=BIO_read(file,buf,bufsize);
  1897 				if (i <= 0) break;
  1898 
  1899 #ifdef RENEG
  1900 				total_bytes+=i;
  1901 				fprintf(stderr,"%d\n",i);
  1902 				if (total_bytes > 3*1024)
  1903 					{
  1904 					total_bytes=0;
  1905 					fprintf(stderr,"RENEGOTIATE\n");
  1906 					SSL_renegotiate(con);
  1907 					}
  1908 		
  1909 #endif
  1910 
  1911 				for (j=0; j<i; )
  1912 					{
  1913 #ifdef RENEG
  1914 { static count=0; if (++count == 13) { SSL_renegotiate(con); } }
  1915 #endif
  1916 					k=BIO_write(io,&(buf[j]),i-j);
  1917 					if (k <= 0)
  1918 						{
  1919 						if (!BIO_should_retry(io))
  1920 							goto write_error;
  1921 						else
  1922 							{
  1923 							BIO_printf(bio_s_out,"rwrite W BLOCK\n");
  1924 							}
  1925 						}
  1926 					else
  1927 						{
  1928 						j+=k;
  1929 						}
  1930 					}
  1931 				}
  1932 write_error:
  1933 			BIO_free(file);
  1934 			break;
  1935 			}
  1936 		}
  1937 
  1938 	for (;;)
  1939 		{
  1940 		i=(int)BIO_flush(io);
  1941 		if (i <= 0)
  1942 			{
  1943 			if (!BIO_should_retry(io))
  1944 				break;
  1945 			}
  1946 		else
  1947 			break;
  1948 		}
  1949 end:
  1950 #if 1
  1951 	/* make sure we re-use sessions */
  1952 	SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
  1953 #else
  1954 	/* This kills performance */
  1955 /*	SSL_shutdown(con); A shutdown gets sent in the
  1956  *	BIO_free_all(io) procession */
  1957 #endif
  1958 
  1959 err:
  1960 
  1961 	if (ret >= 0)
  1962 		BIO_printf(bio_s_out,"ACCEPT\n");
  1963 
  1964 	if (buf != NULL) OPENSSL_free(buf);
  1965 	if (io != NULL) BIO_free_all(io);
  1966 /*	if (ssl_bio != NULL) BIO_free(ssl_bio);*/
  1967 	return(ret);
  1968 	}
  1969 
  1970 #ifndef OPENSSL_NO_RSA
  1971 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
  1972 	{
  1973 	BIGNUM *bn = NULL;
  1974 	static RSA *rsa_tmp=NULL;
  1975 
  1976 	if (!rsa_tmp && ((bn = BN_new()) == NULL))
  1977 		BIO_printf(bio_err,"Allocation error in generating RSA key\n");
  1978 	if (!rsa_tmp && bn)
  1979 		{
  1980 		if (!s_quiet)
  1981 			{
  1982 			BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
  1983 			(void)BIO_flush(bio_err);
  1984 			}
  1985 		if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
  1986 				!RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL))
  1987 			{
  1988 			if(rsa_tmp) RSA_free(rsa_tmp);
  1989 			rsa_tmp = NULL;
  1990 			}
  1991 		if (!s_quiet)
  1992 			{
  1993 			BIO_printf(bio_err,"\n");
  1994 			(void)BIO_flush(bio_err);
  1995 			}
  1996 		BN_free(bn);
  1997 		}
  1998 	return(rsa_tmp);
  1999 	}
  2000 #endif
  2001 
  2002 #define MAX_SESSION_ID_ATTEMPTS 10
  2003 static int generate_session_id(const SSL *ssl, unsigned char *id,
  2004 				unsigned int *id_len)
  2005 	{
  2006 	unsigned int count = 0;
  2007 	do	{
  2008 		RAND_pseudo_bytes(id, *id_len);
  2009 		/* Prefix the session_id with the required prefix. NB: If our
  2010 		 * prefix is too long, clip it - but there will be worse effects
  2011 		 * anyway, eg. the server could only possibly create 1 session
  2012 		 * ID (ie. the prefix!) so all future session negotiations will
  2013 		 * fail due to conflicts. */
  2014 		memcpy(id, session_id_prefix,
  2015 			(strlen(session_id_prefix) < *id_len) ?
  2016 			strlen(session_id_prefix) : *id_len);
  2017 		}
  2018 	while(SSL_has_matching_session_id(ssl, id, *id_len) &&
  2019 		(++count < MAX_SESSION_ID_ATTEMPTS));
  2020 	if(count >= MAX_SESSION_ID_ATTEMPTS)
  2021 		return 0;
  2022 	return 1;
  2023 	}