Home | History | Annotate | Download | only in ssl
      1 /* ssl/ssltest.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 /* ====================================================================
    112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    113  * ECC cipher suite support in OpenSSL originally developed by
    114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
    115  */
    116 /* ====================================================================
    117  * Copyright 2005 Nokia. All rights reserved.
    118  *
    119  * The portions of the attached software ("Contribution") is developed by
    120  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
    121  * license.
    122  *
    123  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
    124  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
    125  * support (see RFC 4279) to OpenSSL.
    126  *
    127  * No patent licenses or other rights except those expressly stated in
    128  * the OpenSSL open source license shall be deemed granted or received
    129  * expressly, by implication, estoppel, or otherwise.
    130  *
    131  * No assurances are provided by Nokia that the Contribution does not
    132  * infringe the patent or other intellectual property rights of any third
    133  * party or that the license provides you with all the necessary rights
    134  * to make use of the Contribution.
    135  *
    136  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
    137  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
    138  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
    139  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
    140  * OTHERWISE.
    141  */
    142 
    143 #define _BSD_SOURCE 1		/* Or gethostname won't be declared properly
    144 				   on Linux and GNU platforms. */
    145 
    146 #include <assert.h>
    147 #include <errno.h>
    148 #include <limits.h>
    149 #include <stdio.h>
    150 #include <stdlib.h>
    151 #include <string.h>
    152 #include <time.h>
    153 
    154 #define USE_SOCKETS
    155 #include "e_os.h"
    156 
    157 #ifdef OPENSSL_SYS_VMS
    158 #define _XOPEN_SOURCE 500	/* Or isascii won't be declared properly on
    159 				   VMS (at least with DECompHP C).  */
    160 #endif
    161 
    162 #include <ctype.h>
    163 
    164 #include <openssl/bio.h>
    165 #include <openssl/crypto.h>
    166 #include <openssl/evp.h>
    167 #include <openssl/x509.h>
    168 #include <openssl/x509v3.h>
    169 #include <openssl/ssl.h>
    170 #ifndef OPENSSL_NO_ENGINE
    171 #include <openssl/engine.h>
    172 #endif
    173 #include <openssl/err.h>
    174 #include <openssl/rand.h>
    175 #ifndef OPENSSL_NO_RSA
    176 #include <openssl/rsa.h>
    177 #endif
    178 #ifndef OPENSSL_NO_DSA
    179 #include <openssl/dsa.h>
    180 #endif
    181 #ifndef OPENSSL_NO_DH
    182 #include <openssl/dh.h>
    183 #endif
    184 #ifndef OPENSSL_NO_SRP
    185 #include <openssl/srp.h>
    186 #endif
    187 #include <openssl/bn.h>
    188 
    189 #define _XOPEN_SOURCE_EXTENDED	1 /* Or gethostname won't be declared properly
    190 				     on Compaq platforms (at least with DEC C).
    191 				     Do not try to put it earlier, or IPv6 includes
    192 				     get screwed...
    193 				  */
    194 
    195 #ifdef OPENSSL_SYS_WINDOWS
    196 #include <winsock.h>
    197 #else
    198 #include OPENSSL_UNISTD
    199 #endif
    200 
    201 #ifdef OPENSSL_SYS_VMS
    202 #  define TEST_SERVER_CERT "SYS$DISK:[-.APPS]SERVER.PEM"
    203 #  define TEST_CLIENT_CERT "SYS$DISK:[-.APPS]CLIENT.PEM"
    204 #elif defined(OPENSSL_SYS_WINCE)
    205 #  define TEST_SERVER_CERT "\\OpenSSL\\server.pem"
    206 #  define TEST_CLIENT_CERT "\\OpenSSL\\client.pem"
    207 #elif defined(OPENSSL_SYS_NETWARE)
    208 #  define TEST_SERVER_CERT "\\openssl\\apps\\server.pem"
    209 #  define TEST_CLIENT_CERT "\\openssl\\apps\\client.pem"
    210 #else
    211 #  define TEST_SERVER_CERT "../apps/server.pem"
    212 #  define TEST_CLIENT_CERT "../apps/client.pem"
    213 #endif
    214 
    215 /* There is really no standard for this, so let's assign some tentative
    216    numbers.  In any case, these numbers are only for this test */
    217 #define COMP_RLE	255
    218 #define COMP_ZLIB	1
    219 
    220 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
    221 #ifndef OPENSSL_NO_RSA
    222 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
    223 static void free_tmp_rsa(void);
    224 #endif
    225 static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg);
    226 #define APP_CALLBACK_STRING "Test Callback Argument"
    227 struct app_verify_arg
    228 	{
    229 	char *string;
    230 	int app_verify;
    231 	int allow_proxy_certs;
    232 	char *proxy_auth;
    233 	char *proxy_cond;
    234 	};
    235 
    236 #ifndef OPENSSL_NO_DH
    237 static DH *get_dh512(void);
    238 static DH *get_dh1024(void);
    239 static DH *get_dh1024dsa(void);
    240 #endif
    241 
    242 
    243 static char *psk_key=NULL; /* by default PSK is not used */
    244 #ifndef OPENSSL_NO_PSK
    245 static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
    246 	unsigned int max_identity_len, unsigned char *psk,
    247 	unsigned int max_psk_len);
    248 static unsigned int psk_server_callback(SSL *ssl, const char *identity, unsigned char *psk,
    249 	unsigned int max_psk_len);
    250 #endif
    251 
    252 #ifndef OPENSSL_NO_SRP
    253 /* SRP client */
    254 /* This is a context that we pass to all callbacks */
    255 typedef struct srp_client_arg_st
    256 	{
    257 	char *srppassin;
    258 	char *srplogin;
    259 	} SRP_CLIENT_ARG;
    260 
    261 #define PWD_STRLEN 1024
    262 
    263 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
    264 	{
    265 	SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
    266 	return BUF_strdup((char *)srp_client_arg->srppassin);
    267 	}
    268 
    269 /* SRP server */
    270 /* This is a context that we pass to SRP server callbacks */
    271 typedef struct srp_server_arg_st
    272 	{
    273 	char *expected_user;
    274 	char *pass;
    275 	} SRP_SERVER_ARG;
    276 
    277 static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
    278 	{
    279 	SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;
    280 
    281 	if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0)
    282 		{
    283 		fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s));
    284 		return SSL3_AL_FATAL;
    285 		}
    286 	if (SSL_set_srp_server_param_pw(s,p->expected_user,p->pass,"1024")<0)
    287 		{
    288 		*ad = SSL_AD_INTERNAL_ERROR;
    289 		return SSL3_AL_FATAL;
    290 		}
    291 	return SSL_ERROR_NONE;
    292 	}
    293 #endif
    294 
    295 static BIO *bio_err=NULL;
    296 static BIO *bio_stdout=NULL;
    297 
    298 static char *cipher=NULL;
    299 static int verbose=0;
    300 static int debug=0;
    301 #if 0
    302 /* Not used yet. */
    303 #ifdef FIONBIO
    304 static int s_nbio=0;
    305 #endif
    306 #endif
    307 
    308 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
    309 
    310 int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
    311 int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
    312 static int do_test_cipherlist(void);
    313 static void sv_usage(void)
    314 	{
    315 	fprintf(stderr,"usage: ssltest [args ...]\n");
    316 	fprintf(stderr,"\n");
    317 #ifdef OPENSSL_FIPS
    318 	fprintf(stderr,"-F             - run test in FIPS mode\n");
    319 #endif
    320 	fprintf(stderr," -server_auth  - check server certificate\n");
    321 	fprintf(stderr," -client_auth  - do client authentication\n");
    322 	fprintf(stderr," -proxy        - allow proxy certificates\n");
    323 	fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
    324 	fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
    325 	fprintf(stderr," -v            - more output\n");
    326 	fprintf(stderr," -d            - debug output\n");
    327 	fprintf(stderr," -reuse        - use session-id reuse\n");
    328 	fprintf(stderr," -num <val>    - number of connections to perform\n");
    329 	fprintf(stderr," -bytes <val>  - number of bytes to swap between client/server\n");
    330 #ifndef OPENSSL_NO_DH
    331 	fprintf(stderr," -dhe1024      - use 1024 bit key (safe prime) for DHE\n");
    332 	fprintf(stderr," -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
    333 	fprintf(stderr," -no_dhe       - disable DHE\n");
    334 #endif
    335 #ifndef OPENSSL_NO_ECDH
    336 	fprintf(stderr," -no_ecdhe     - disable ECDHE\n");
    337 #endif
    338 #ifndef OPENSSL_NO_PSK
    339 	fprintf(stderr," -psk arg      - PSK in hex (without 0x)\n");
    340 #endif
    341 #ifndef OPENSSL_NO_SRP
    342 	fprintf(stderr," -srpuser user  - SRP username to use\n");
    343 	fprintf(stderr," -srppass arg   - password for 'user'\n");
    344 #endif
    345 #ifndef OPENSSL_NO_SSL2
    346 	fprintf(stderr," -ssl2         - use SSLv2\n");
    347 #endif
    348 #ifndef OPENSSL_NO_SSL3
    349 	fprintf(stderr," -ssl3         - use SSLv3\n");
    350 #endif
    351 #ifndef OPENSSL_NO_TLS1
    352 	fprintf(stderr," -tls1         - use TLSv1\n");
    353 #endif
    354 	fprintf(stderr," -CApath arg   - PEM format directory of CA's\n");
    355 	fprintf(stderr," -CAfile arg   - PEM format file of CA's\n");
    356 	fprintf(stderr," -cert arg     - Server certificate file\n");
    357 	fprintf(stderr," -key arg      - Server key file (default: same as -cert)\n");
    358 	fprintf(stderr," -c_cert arg   - Client certificate file\n");
    359 	fprintf(stderr," -c_key arg    - Client key file (default: same as -c_cert)\n");
    360 	fprintf(stderr," -cipher arg   - The cipher list\n");
    361 	fprintf(stderr," -bio_pair     - Use BIO pairs\n");
    362 	fprintf(stderr," -f            - Test even cases that can't work\n");
    363 	fprintf(stderr," -time         - measure processor time used by client and server\n");
    364 	fprintf(stderr," -zlib         - use zlib compression\n");
    365 	fprintf(stderr," -rle          - use rle compression\n");
    366 #ifndef OPENSSL_NO_ECDH
    367 	fprintf(stderr," -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n" \
    368 	               "                 Use \"openssl ecparam -list_curves\" for all names\n"  \
    369 	               "                 (default is sect163r2).\n");
    370 #endif
    371 	fprintf(stderr," -test_cipherlist - verifies the order of the ssl cipher lists\n");
    372 	fprintf(stderr," -cutthrough      - enable 1-RTT full-handshake for strong ciphers\n");
    373 	}
    374 
    375 static void print_details(SSL *c_ssl, const char *prefix)
    376 	{
    377 	const SSL_CIPHER *ciph;
    378 	X509 *cert;
    379 
    380 	ciph=SSL_get_current_cipher(c_ssl);
    381 	BIO_printf(bio_stdout,"%s%s, cipher %s %s",
    382 		prefix,
    383 		SSL_get_version(c_ssl),
    384 		SSL_CIPHER_get_version(ciph),
    385 		SSL_CIPHER_get_name(ciph));
    386 	cert=SSL_get_peer_certificate(c_ssl);
    387 	if (cert != NULL)
    388 		{
    389 		EVP_PKEY *pkey = X509_get_pubkey(cert);
    390 		if (pkey != NULL)
    391 			{
    392 			if (0)
    393 				;
    394 #ifndef OPENSSL_NO_RSA
    395 			else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
    396 				&& pkey->pkey.rsa->n != NULL)
    397 				{
    398 				BIO_printf(bio_stdout, ", %d bit RSA",
    399 					BN_num_bits(pkey->pkey.rsa->n));
    400 				}
    401 #endif
    402 #ifndef OPENSSL_NO_DSA
    403 			else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
    404 				&& pkey->pkey.dsa->p != NULL)
    405 				{
    406 				BIO_printf(bio_stdout, ", %d bit DSA",
    407 					BN_num_bits(pkey->pkey.dsa->p));
    408 				}
    409 #endif
    410 			EVP_PKEY_free(pkey);
    411 			}
    412 		X509_free(cert);
    413 		}
    414 	/* The SSL API does not allow us to look at temporary RSA/DH keys,
    415 	 * otherwise we should print their lengths too */
    416 	BIO_printf(bio_stdout,"\n");
    417 	}
    418 
    419 static void lock_dbg_cb(int mode, int type, const char *file, int line)
    420 	{
    421 	static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
    422 	const char *errstr = NULL;
    423 	int rw;
    424 
    425 	rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
    426 	if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
    427 		{
    428 		errstr = "invalid mode";
    429 		goto err;
    430 		}
    431 
    432 	if (type < 0 || type >= CRYPTO_NUM_LOCKS)
    433 		{
    434 		errstr = "type out of bounds";
    435 		goto err;
    436 		}
    437 
    438 	if (mode & CRYPTO_LOCK)
    439 		{
    440 		if (modes[type])
    441 			{
    442 			errstr = "already locked";
    443 			/* must not happen in a single-threaded program
    444 			 * (would deadlock) */
    445 			goto err;
    446 			}
    447 
    448 		modes[type] = rw;
    449 		}
    450 	else if (mode & CRYPTO_UNLOCK)
    451 		{
    452 		if (!modes[type])
    453 			{
    454 			errstr = "not locked";
    455 			goto err;
    456 			}
    457 
    458 		if (modes[type] != rw)
    459 			{
    460 			errstr = (rw == CRYPTO_READ) ?
    461 				"CRYPTO_r_unlock on write lock" :
    462 				"CRYPTO_w_unlock on read lock";
    463 			}
    464 
    465 		modes[type] = 0;
    466 		}
    467 	else
    468 		{
    469 		errstr = "invalid mode";
    470 		goto err;
    471 		}
    472 
    473  err:
    474 	if (errstr)
    475 		{
    476 		/* we cannot use bio_err here */
    477 		fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
    478 			errstr, mode, type, file, line);
    479 		}
    480 	}
    481 
    482 #ifdef TLSEXT_TYPE_opaque_prf_input
    483 struct cb_info_st { void *input; size_t len; int ret; };
    484 struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
    485 struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
    486 struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
    487 struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
    488 
    489 int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
    490 	{
    491 	struct cb_info_st *arg = arg_;
    492 
    493 	if (arg == NULL)
    494 		return 1;
    495 
    496 	if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
    497 		return 0;
    498 	return arg->ret;
    499 	}
    500 #endif
    501 
    502 int main(int argc, char *argv[])
    503 	{
    504 	char *CApath=NULL,*CAfile=NULL;
    505 	int badop=0;
    506 	int bio_pair=0;
    507 	int force=0;
    508 	int tls1=0,ssl2=0,ssl3=0,ret=1;
    509 	int client_auth=0;
    510 	int server_auth=0,i;
    511 	struct app_verify_arg app_verify_arg =
    512 		{ APP_CALLBACK_STRING, 0, 0, NULL, NULL };
    513 	char *server_cert=TEST_SERVER_CERT;
    514 	char *server_key=NULL;
    515 	char *client_cert=TEST_CLIENT_CERT;
    516 	char *client_key=NULL;
    517 #ifndef OPENSSL_NO_ECDH
    518 	char *named_curve = NULL;
    519 #endif
    520 	SSL_CTX *s_ctx=NULL;
    521 	SSL_CTX *c_ctx=NULL;
    522 	const SSL_METHOD *meth=NULL;
    523 	SSL *c_ssl,*s_ssl;
    524 	int number=1,reuse=0;
    525 	long bytes=256L;
    526 #ifndef OPENSSL_NO_DH
    527 	DH *dh;
    528 	int dhe1024 = 0, dhe1024dsa = 0;
    529 #endif
    530 #ifndef OPENSSL_NO_ECDH
    531 	EC_KEY *ecdh = NULL;
    532 #endif
    533 #ifndef OPENSSL_NO_SRP
    534 	/* client */
    535 	SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
    536 	/* server */
    537 	SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
    538 #endif
    539 	int no_dhe = 0;
    540 	int no_ecdhe = 0;
    541 	int no_psk = 0;
    542 	int print_time = 0;
    543 	clock_t s_time = 0, c_time = 0;
    544 	int comp = 0;
    545 #ifndef OPENSSL_NO_COMP
    546 	COMP_METHOD *cm = NULL;
    547 	STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
    548 #endif
    549 	int test_cipherlist = 0;
    550 #ifdef OPENSSL_FIPS
    551 	int fips_mode=0;
    552 #endif
    553 	int cutthrough = 0;
    554 
    555 	verbose = 0;
    556 	debug = 0;
    557 	cipher = 0;
    558 
    559 	bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);
    560 
    561 	CRYPTO_set_locking_callback(lock_dbg_cb);
    562 
    563 	/* enable memory leak checking unless explicitly disabled */
    564 	if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
    565 		{
    566 		CRYPTO_malloc_debug_init();
    567 		CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
    568 		}
    569 	else
    570 		{
    571 		/* OPENSSL_DEBUG_MEMORY=off */
    572 		CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
    573 		}
    574 	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
    575 
    576 	RAND_seed(rnd_seed, sizeof rnd_seed);
    577 
    578 	bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
    579 
    580 	argc--;
    581 	argv++;
    582 
    583 	while (argc >= 1)
    584 		{
    585 		if(!strcmp(*argv,"-F"))
    586 			{
    587 #ifdef OPENSSL_FIPS
    588 			fips_mode=1;
    589 #else
    590 			fprintf(stderr,"not compiled with FIPS support, so exitting without running.\n");
    591 			EXIT(0);
    592 #endif
    593 			}
    594 		else if (strcmp(*argv,"-server_auth") == 0)
    595 			server_auth=1;
    596 		else if	(strcmp(*argv,"-client_auth") == 0)
    597 			client_auth=1;
    598 		else if (strcmp(*argv,"-proxy_auth") == 0)
    599 			{
    600 			if (--argc < 1) goto bad;
    601 			app_verify_arg.proxy_auth= *(++argv);
    602 			}
    603 		else if (strcmp(*argv,"-proxy_cond") == 0)
    604 			{
    605 			if (--argc < 1) goto bad;
    606 			app_verify_arg.proxy_cond= *(++argv);
    607 			}
    608 		else if	(strcmp(*argv,"-v") == 0)
    609 			verbose=1;
    610 		else if	(strcmp(*argv,"-d") == 0)
    611 			debug=1;
    612 		else if	(strcmp(*argv,"-reuse") == 0)
    613 			reuse=1;
    614 		else if	(strcmp(*argv,"-dhe1024") == 0)
    615 			{
    616 #ifndef OPENSSL_NO_DH
    617 			dhe1024=1;
    618 #else
    619 			fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
    620 #endif
    621 			}
    622 		else if	(strcmp(*argv,"-dhe1024dsa") == 0)
    623 			{
    624 #ifndef OPENSSL_NO_DH
    625 			dhe1024dsa=1;
    626 #else
    627 			fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
    628 #endif
    629 			}
    630 		else if	(strcmp(*argv,"-no_dhe") == 0)
    631 			no_dhe=1;
    632 		else if	(strcmp(*argv,"-no_ecdhe") == 0)
    633 			no_ecdhe=1;
    634 		else if (strcmp(*argv,"-psk") == 0)
    635 			{
    636 			if (--argc < 1) goto bad;
    637 			psk_key=*(++argv);
    638 #ifndef OPENSSL_NO_PSK
    639 			if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
    640 				{
    641 				BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
    642 				goto bad;
    643 				}
    644 #else
    645 			no_psk=1;
    646 #endif
    647 			}
    648 #ifndef OPENSSL_NO_SRP
    649 		else if (strcmp(*argv,"-srpuser") == 0)
    650 			{
    651 			if (--argc < 1) goto bad;
    652 			srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
    653 			tls1=1;
    654 			}
    655 		else if (strcmp(*argv,"-srppass") == 0)
    656 			{
    657 			if (--argc < 1) goto bad;
    658 			srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
    659 			tls1=1;
    660 			}
    661 #endif
    662 		else if	(strcmp(*argv,"-ssl2") == 0)
    663 			ssl2=1;
    664 		else if	(strcmp(*argv,"-tls1") == 0)
    665 			tls1=1;
    666 		else if	(strcmp(*argv,"-ssl3") == 0)
    667 			ssl3=1;
    668 		else if	(strncmp(*argv,"-num",4) == 0)
    669 			{
    670 			if (--argc < 1) goto bad;
    671 			number= atoi(*(++argv));
    672 			if (number == 0) number=1;
    673 			}
    674 		else if	(strcmp(*argv,"-bytes") == 0)
    675 			{
    676 			if (--argc < 1) goto bad;
    677 			bytes= atol(*(++argv));
    678 			if (bytes == 0L) bytes=1L;
    679 			i=strlen(argv[0]);
    680 			if (argv[0][i-1] == 'k') bytes*=1024L;
    681 			if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
    682 			}
    683 		else if	(strcmp(*argv,"-cert") == 0)
    684 			{
    685 			if (--argc < 1) goto bad;
    686 			server_cert= *(++argv);
    687 			}
    688 		else if	(strcmp(*argv,"-s_cert") == 0)
    689 			{
    690 			if (--argc < 1) goto bad;
    691 			server_cert= *(++argv);
    692 			}
    693 		else if	(strcmp(*argv,"-key") == 0)
    694 			{
    695 			if (--argc < 1) goto bad;
    696 			server_key= *(++argv);
    697 			}
    698 		else if	(strcmp(*argv,"-s_key") == 0)
    699 			{
    700 			if (--argc < 1) goto bad;
    701 			server_key= *(++argv);
    702 			}
    703 		else if	(strcmp(*argv,"-c_cert") == 0)
    704 			{
    705 			if (--argc < 1) goto bad;
    706 			client_cert= *(++argv);
    707 			}
    708 		else if	(strcmp(*argv,"-c_key") == 0)
    709 			{
    710 			if (--argc < 1) goto bad;
    711 			client_key= *(++argv);
    712 			}
    713 		else if	(strcmp(*argv,"-cipher") == 0)
    714 			{
    715 			if (--argc < 1) goto bad;
    716 			cipher= *(++argv);
    717 			}
    718 		else if	(strcmp(*argv,"-CApath") == 0)
    719 			{
    720 			if (--argc < 1) goto bad;
    721 			CApath= *(++argv);
    722 			}
    723 		else if	(strcmp(*argv,"-CAfile") == 0)
    724 			{
    725 			if (--argc < 1) goto bad;
    726 			CAfile= *(++argv);
    727 			}
    728 		else if	(strcmp(*argv,"-bio_pair") == 0)
    729 			{
    730 			bio_pair = 1;
    731 			}
    732 		else if	(strcmp(*argv,"-f") == 0)
    733 			{
    734 			force = 1;
    735 			}
    736 		else if	(strcmp(*argv,"-time") == 0)
    737 			{
    738 			print_time = 1;
    739 			}
    740 		else if	(strcmp(*argv,"-zlib") == 0)
    741 			{
    742 			comp = COMP_ZLIB;
    743 			}
    744 		else if	(strcmp(*argv,"-rle") == 0)
    745 			{
    746 			comp = COMP_RLE;
    747 			}
    748 		else if	(strcmp(*argv,"-named_curve") == 0)
    749 			{
    750 			if (--argc < 1) goto bad;
    751 #ifndef OPENSSL_NO_ECDH
    752 			named_curve = *(++argv);
    753 #else
    754 			fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
    755 			++argv;
    756 #endif
    757 			}
    758 		else if	(strcmp(*argv,"-app_verify") == 0)
    759 			{
    760 			app_verify_arg.app_verify = 1;
    761 			}
    762 		else if	(strcmp(*argv,"-proxy") == 0)
    763 			{
    764 			app_verify_arg.allow_proxy_certs = 1;
    765 			}
    766 		else if (strcmp(*argv,"-test_cipherlist") == 0)
    767 			{
    768 			test_cipherlist = 1;
    769 			}
    770 		else if (strcmp(*argv, "-cutthrough") == 0)
    771 			{
    772 			cutthrough = 1;
    773 			}
    774 		else
    775 			{
    776 			fprintf(stderr,"unknown option %s\n",*argv);
    777 			badop=1;
    778 			break;
    779 			}
    780 		argc--;
    781 		argv++;
    782 		}
    783 	if (badop)
    784 		{
    785 bad:
    786 		sv_usage();
    787 		goto end;
    788 		}
    789 
    790 	if (test_cipherlist == 1)
    791 		{
    792 		/* ensure that the cipher list are correctly sorted and exit */
    793 		if (do_test_cipherlist() == 0)
    794 			EXIT(1);
    795 		ret = 0;
    796 		goto end;
    797 		}
    798 
    799 	if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
    800 		{
    801 		fprintf(stderr, "This case cannot work.  Use -f to perform "
    802 			"the test anyway (and\n-d to see what happens), "
    803 			"or add one of -ssl2, -ssl3, -tls1, -reuse\n"
    804 			"to avoid protocol mismatch.\n");
    805 		EXIT(1);
    806 		}
    807 
    808 #ifdef OPENSSL_FIPS
    809 	if(fips_mode)
    810 		{
    811 		if(!FIPS_mode_set(1))
    812 			{
    813 			ERR_load_crypto_strings();
    814 			ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
    815 			EXIT(1);
    816 			}
    817 		else
    818 			fprintf(stderr,"*** IN FIPS MODE ***\n");
    819 		}
    820 #endif
    821 
    822 	if (print_time)
    823 		{
    824 		if (!bio_pair)
    825 			{
    826 			fprintf(stderr, "Using BIO pair (-bio_pair)\n");
    827 			bio_pair = 1;
    828 			}
    829 		if (number < 50 && !force)
    830 			fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
    831 		}
    832 
    833 /*	if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
    834 
    835 	SSL_library_init();
    836 	SSL_load_error_strings();
    837 
    838 #ifndef OPENSSL_NO_COMP
    839 	if (comp == COMP_ZLIB) cm = COMP_zlib();
    840 	if (comp == COMP_RLE) cm = COMP_rle();
    841 	if (cm != NULL)
    842 		{
    843 		if (cm->type != NID_undef)
    844 			{
    845 			if (SSL_COMP_add_compression_method(comp, cm) != 0)
    846 				{
    847 				fprintf(stderr,
    848 					"Failed to add compression method\n");
    849 				ERR_print_errors_fp(stderr);
    850 				}
    851 			}
    852 		else
    853 			{
    854 			fprintf(stderr,
    855 				"Warning: %s compression not supported\n",
    856 				(comp == COMP_RLE ? "rle" :
    857 					(comp == COMP_ZLIB ? "zlib" :
    858 						"unknown")));
    859 			ERR_print_errors_fp(stderr);
    860 			}
    861 		}
    862 	ssl_comp_methods = SSL_COMP_get_compression_methods();
    863 	fprintf(stderr, "Available compression methods:\n");
    864 	{
    865 	int j, n = sk_SSL_COMP_num(ssl_comp_methods);
    866 	if (n == 0)
    867 		fprintf(stderr, "  NONE\n");
    868 	else
    869 		for (j = 0; j < n; j++)
    870 			{
    871 			SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
    872 			fprintf(stderr, "  %d: %s\n", c->id, c->name);
    873 			}
    874 	}
    875 #endif
    876 
    877 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
    878 	if (ssl2)
    879 		meth=SSLv2_method();
    880 	else
    881 	if (tls1)
    882 		meth=TLSv1_method();
    883 	else
    884 	if (ssl3)
    885 		meth=SSLv3_method();
    886 	else
    887 		meth=SSLv23_method();
    888 #else
    889 #ifdef OPENSSL_NO_SSL2
    890 	if (tls1)
    891 		meth=TLSv1_method();
    892 	else
    893 	if (ssl3)
    894 		meth=SSLv3_method();
    895 	else
    896 		meth=SSLv23_method();
    897 #else
    898 	meth=SSLv2_method();
    899 #endif
    900 #endif
    901 
    902 	c_ctx=SSL_CTX_new(meth);
    903 	s_ctx=SSL_CTX_new(meth);
    904 	if ((c_ctx == NULL) || (s_ctx == NULL))
    905 		{
    906 		ERR_print_errors(bio_err);
    907 		goto end;
    908 		}
    909 
    910 	if (cipher != NULL)
    911 		{
    912 		SSL_CTX_set_cipher_list(c_ctx,cipher);
    913 		SSL_CTX_set_cipher_list(s_ctx,cipher);
    914 		}
    915 	if (cutthrough)
    916 		{
    917 		int ssl_mode = SSL_CTX_get_mode(c_ctx);
    918 		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
    919 		SSL_CTX_set_mode(c_ctx, ssl_mode);
    920 		}
    921 
    922 #ifndef OPENSSL_NO_DH
    923 	if (!no_dhe)
    924 		{
    925 		if (dhe1024dsa)
    926 			{
    927 			/* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
    928 			SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
    929 			dh=get_dh1024dsa();
    930 			}
    931 		else if (dhe1024)
    932 			dh=get_dh1024();
    933 		else
    934 			dh=get_dh512();
    935 		SSL_CTX_set_tmp_dh(s_ctx,dh);
    936 		DH_free(dh);
    937 		}
    938 #else
    939 	(void)no_dhe;
    940 #endif
    941 
    942 #ifndef OPENSSL_NO_ECDH
    943 	if (!no_ecdhe)
    944 		{
    945 		int nid;
    946 
    947 		if (named_curve != NULL)
    948 			{
    949 			nid = OBJ_sn2nid(named_curve);
    950 			if (nid == 0)
    951 			{
    952 				BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
    953 				goto end;
    954 				}
    955 			}
    956 		else
    957 #ifdef OPENSSL_NO_EC2M
    958 			nid = NID_X9_62_prime256v1;
    959 #else
    960 			nid = NID_sect163r2;
    961 #endif
    962 
    963 		ecdh = EC_KEY_new_by_curve_name(nid);
    964 		if (ecdh == NULL)
    965 			{
    966 			BIO_printf(bio_err, "unable to create curve\n");
    967 			goto end;
    968 			}
    969 
    970 		SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
    971 		SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
    972 		EC_KEY_free(ecdh);
    973 		}
    974 #else
    975 	(void)no_ecdhe;
    976 #endif
    977 
    978 #ifndef OPENSSL_NO_RSA
    979 	SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
    980 #endif
    981 
    982 #ifdef TLSEXT_TYPE_opaque_prf_input
    983 	SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
    984 	SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
    985 	SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
    986 	SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
    987 #endif
    988 
    989 	if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
    990 		{
    991 		ERR_print_errors(bio_err);
    992 		}
    993 	else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
    994 		(server_key?server_key:server_cert), SSL_FILETYPE_PEM))
    995 		{
    996 		ERR_print_errors(bio_err);
    997 		goto end;
    998 		}
    999 
   1000 	if (client_auth)
   1001 		{
   1002 		SSL_CTX_use_certificate_file(c_ctx,client_cert,
   1003 			SSL_FILETYPE_PEM);
   1004 		SSL_CTX_use_PrivateKey_file(c_ctx,
   1005 			(client_key?client_key:client_cert),
   1006 			SSL_FILETYPE_PEM);
   1007 		}
   1008 
   1009 	if (	(!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
   1010 		(!SSL_CTX_set_default_verify_paths(s_ctx)) ||
   1011 		(!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
   1012 		(!SSL_CTX_set_default_verify_paths(c_ctx)))
   1013 		{
   1014 		/* fprintf(stderr,"SSL_load_verify_locations\n"); */
   1015 		ERR_print_errors(bio_err);
   1016 		/* goto end; */
   1017 		}
   1018 
   1019 	if (client_auth)
   1020 		{
   1021 		BIO_printf(bio_err,"client authentication\n");
   1022 		SSL_CTX_set_verify(s_ctx,
   1023 			SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
   1024 			verify_callback);
   1025 		SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
   1026 		}
   1027 	if (server_auth)
   1028 		{
   1029 		BIO_printf(bio_err,"server authentication\n");
   1030 		SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
   1031 			verify_callback);
   1032 		SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
   1033 		}
   1034 
   1035 	{
   1036 		int session_id_context = 0;
   1037 		SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
   1038 	}
   1039 
   1040 	/* Use PSK only if PSK key is given */
   1041 	if (psk_key != NULL)
   1042 		{
   1043 		/* no_psk is used to avoid putting psk command to openssl tool */
   1044 		if (no_psk)
   1045 			{
   1046 			/* if PSK is not compiled in and psk key is
   1047 			 * given, do nothing and exit successfully */
   1048 			ret=0;
   1049 			goto end;
   1050 			}
   1051 #ifndef OPENSSL_NO_PSK
   1052 		SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
   1053 		SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
   1054 		if (debug)
   1055 			BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
   1056 		if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
   1057 			{
   1058 			BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
   1059 			ERR_print_errors(bio_err);
   1060 			goto end;
   1061 			}
   1062 #endif
   1063 		}
   1064 #ifndef OPENSSL_NO_SRP
   1065         if (srp_client_arg.srplogin)
   1066 		{
   1067 		if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
   1068 			{
   1069 			BIO_printf(bio_err,"Unable to set SRP username\n");
   1070 			goto end;
   1071 			}
   1072 		SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
   1073 		SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
   1074 		/*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
   1075 		}
   1076 
   1077 	if (srp_server_arg.expected_user != NULL)
   1078 		{
   1079 		SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
   1080 		SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
   1081 		SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
   1082 		}
   1083 #endif
   1084 
   1085 	c_ssl=SSL_new(c_ctx);
   1086 	s_ssl=SSL_new(s_ctx);
   1087 
   1088 #ifndef OPENSSL_NO_KRB5
   1089 	if (c_ssl  &&  c_ssl->kssl_ctx)
   1090                 {
   1091                 char	localhost[MAXHOSTNAMELEN+2];
   1092 
   1093 		if (gethostname(localhost, sizeof localhost-1) == 0)
   1094                         {
   1095 			localhost[sizeof localhost-1]='\0';
   1096 			if(strlen(localhost) == sizeof localhost-1)
   1097 				{
   1098 				BIO_printf(bio_err,"localhost name too long\n");
   1099 				goto end;
   1100 				}
   1101 			kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
   1102                                 localhost);
   1103 			}
   1104 		}
   1105 #endif    /* OPENSSL_NO_KRB5  */
   1106 
   1107 	for (i=0; i<number; i++)
   1108 		{
   1109 		if (!reuse) SSL_set_session(c_ssl,NULL);
   1110 		if (bio_pair)
   1111 			ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
   1112 		else
   1113 			ret=doit(s_ssl,c_ssl,bytes);
   1114 		}
   1115 
   1116 	if (!verbose)
   1117 		{
   1118 		print_details(c_ssl, "");
   1119 		}
   1120 	if ((number > 1) || (bytes > 1L))
   1121 		BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
   1122 	if (print_time)
   1123 		{
   1124 #ifdef CLOCKS_PER_SEC
   1125 		/* "To determine the time in seconds, the value returned
   1126 		 * by the clock function should be divided by the value
   1127 		 * of the macro CLOCKS_PER_SEC."
   1128 		 *                                       -- ISO/IEC 9899 */
   1129 		BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
   1130 			"Approximate total client time: %6.2f s\n",
   1131 			(double)s_time/CLOCKS_PER_SEC,
   1132 			(double)c_time/CLOCKS_PER_SEC);
   1133 #else
   1134 		/* "`CLOCKS_PER_SEC' undeclared (first use this function)"
   1135 		 *                            -- cc on NeXTstep/OpenStep */
   1136 		BIO_printf(bio_stdout,
   1137 			"Approximate total server time: %6.2f units\n"
   1138 			"Approximate total client time: %6.2f units\n",
   1139 			(double)s_time,
   1140 			(double)c_time);
   1141 #endif
   1142 		}
   1143 
   1144 	SSL_free(s_ssl);
   1145 	SSL_free(c_ssl);
   1146 
   1147 end:
   1148 	if (s_ctx != NULL) SSL_CTX_free(s_ctx);
   1149 	if (c_ctx != NULL) SSL_CTX_free(c_ctx);
   1150 
   1151 	if (bio_stdout != NULL) BIO_free(bio_stdout);
   1152 
   1153 #ifndef OPENSSL_NO_RSA
   1154 	free_tmp_rsa();
   1155 #endif
   1156 #ifndef OPENSSL_NO_ENGINE
   1157 	ENGINE_cleanup();
   1158 #endif
   1159 	CRYPTO_cleanup_all_ex_data();
   1160 	ERR_free_strings();
   1161 	ERR_remove_thread_state(NULL);
   1162 	EVP_cleanup();
   1163 	CRYPTO_mem_leaks(bio_err);
   1164 	if (bio_err != NULL) BIO_free(bio_err);
   1165 	EXIT(ret);
   1166 	return ret;
   1167 	}
   1168 
   1169 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
   1170 	clock_t *s_time, clock_t *c_time)
   1171 	{
   1172 	long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
   1173 	BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
   1174 	BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
   1175 	int ret = 1;
   1176 
   1177 	size_t bufsiz = 256; /* small buffer for testing */
   1178 
   1179 	if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
   1180 		goto err;
   1181 	if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
   1182 		goto err;
   1183 
   1184 	s_ssl_bio = BIO_new(BIO_f_ssl());
   1185 	if (!s_ssl_bio)
   1186 		goto err;
   1187 
   1188 	c_ssl_bio = BIO_new(BIO_f_ssl());
   1189 	if (!c_ssl_bio)
   1190 		goto err;
   1191 
   1192 	SSL_set_connect_state(c_ssl);
   1193 	SSL_set_bio(c_ssl, client, client);
   1194 	(void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
   1195 
   1196 	SSL_set_accept_state(s_ssl);
   1197 	SSL_set_bio(s_ssl, server, server);
   1198 	(void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
   1199 
   1200 	do
   1201 		{
   1202 		/* c_ssl_bio:          SSL filter BIO
   1203 		 *
   1204 		 * client:             pseudo-I/O for SSL library
   1205 		 *
   1206 		 * client_io:          client's SSL communication; usually to be
   1207 		 *                     relayed over some I/O facility, but in this
   1208 		 *                     test program, we're the server, too:
   1209 		 *
   1210 		 * server_io:          server's SSL communication
   1211 		 *
   1212 		 * server:             pseudo-I/O for SSL library
   1213 		 *
   1214 		 * s_ssl_bio:          SSL filter BIO
   1215 		 *
   1216 		 * The client and the server each employ a "BIO pair":
   1217 		 * client + client_io, server + server_io.
   1218 		 * BIO pairs are symmetric.  A BIO pair behaves similar
   1219 		 * to a non-blocking socketpair (but both endpoints must
   1220 		 * be handled by the same thread).
   1221 		 * [Here we could connect client and server to the ends
   1222 		 * of a single BIO pair, but then this code would be less
   1223 		 * suitable as an example for BIO pairs in general.]
   1224 		 *
   1225 		 * Useful functions for querying the state of BIO pair endpoints:
   1226 		 *
   1227 		 * BIO_ctrl_pending(bio)              number of bytes we can read now
   1228 		 * BIO_ctrl_get_read_request(bio)     number of bytes needed to fulfil
   1229 		 *                                      other side's read attempt
   1230 		 * BIO_ctrl_get_write_guarantee(bio)   number of bytes we can write now
   1231 		 *
   1232 		 * ..._read_request is never more than ..._write_guarantee;
   1233 		 * it depends on the application which one you should use.
   1234 		 */
   1235 
   1236 		/* We have non-blocking behaviour throughout this test program, but
   1237 		 * can be sure that there is *some* progress in each iteration; so
   1238 		 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
   1239 		 * -- we just try everything in each iteration
   1240 		 */
   1241 
   1242 			{
   1243 			/* CLIENT */
   1244 
   1245 			MS_STATIC char cbuf[1024*8];
   1246 			int i, r;
   1247 			clock_t c_clock = clock();
   1248 
   1249 			memset(cbuf, 0, sizeof(cbuf));
   1250 
   1251 			if (debug)
   1252 				if (SSL_in_init(c_ssl))
   1253 					printf("client waiting in SSL_connect - %s\n",
   1254 						SSL_state_string_long(c_ssl));
   1255 
   1256 			if (cw_num > 0)
   1257 				{
   1258 				/* Write to server. */
   1259 
   1260 				if (cw_num > (long)sizeof cbuf)
   1261 					i = sizeof cbuf;
   1262 				else
   1263 					i = (int)cw_num;
   1264 				r = BIO_write(c_ssl_bio, cbuf, i);
   1265 				if (r < 0)
   1266 					{
   1267 					if (!BIO_should_retry(c_ssl_bio))
   1268 						{
   1269 						fprintf(stderr,"ERROR in CLIENT\n");
   1270 						goto err;
   1271 						}
   1272 					/* BIO_should_retry(...) can just be ignored here.
   1273 					 * The library expects us to call BIO_write with
   1274 					 * the same arguments again, and that's what we will
   1275 					 * do in the next iteration. */
   1276 					}
   1277 				else if (r == 0)
   1278 					{
   1279 					fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
   1280 					goto err;
   1281 					}
   1282 				else
   1283 					{
   1284 					if (debug)
   1285 						printf("client wrote %d\n", r);
   1286 					cw_num -= r;
   1287 					}
   1288 				}
   1289 
   1290 			if (cr_num > 0)
   1291 				{
   1292 				/* Read from server. */
   1293 
   1294 				r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
   1295 				if (r < 0)
   1296 					{
   1297 					if (!BIO_should_retry(c_ssl_bio))
   1298 						{
   1299 						fprintf(stderr,"ERROR in CLIENT\n");
   1300 						goto err;
   1301 						}
   1302 					/* Again, "BIO_should_retry" can be ignored. */
   1303 					}
   1304 				else if (r == 0)
   1305 					{
   1306 					fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
   1307 					goto err;
   1308 					}
   1309 				else
   1310 					{
   1311 					if (debug)
   1312 						printf("client read %d\n", r);
   1313 					cr_num -= r;
   1314 					}
   1315 				}
   1316 
   1317 			/* c_time and s_time increments will typically be very small
   1318 			 * (depending on machine speed and clock tick intervals),
   1319 			 * but sampling over a large number of connections should
   1320 			 * result in fairly accurate figures.  We cannot guarantee
   1321 			 * a lot, however -- if each connection lasts for exactly
   1322 			 * one clock tick, it will be counted only for the client
   1323 			 * or only for the server or even not at all.
   1324 			 */
   1325 			*c_time += (clock() - c_clock);
   1326 			}
   1327 
   1328 			{
   1329 			/* SERVER */
   1330 
   1331 			MS_STATIC char sbuf[1024*8];
   1332 			int i, r;
   1333 			clock_t s_clock = clock();
   1334 
   1335 			memset(sbuf, 0, sizeof(sbuf));
   1336 
   1337 			if (debug)
   1338 				if (SSL_in_init(s_ssl))
   1339 					printf("server waiting in SSL_accept - %s\n",
   1340 						SSL_state_string_long(s_ssl));
   1341 
   1342 			if (sw_num > 0)
   1343 				{
   1344 				/* Write to client. */
   1345 
   1346 				if (sw_num > (long)sizeof sbuf)
   1347 					i = sizeof sbuf;
   1348 				else
   1349 					i = (int)sw_num;
   1350 				r = BIO_write(s_ssl_bio, sbuf, i);
   1351 				if (r < 0)
   1352 					{
   1353 					if (!BIO_should_retry(s_ssl_bio))
   1354 						{
   1355 						fprintf(stderr,"ERROR in SERVER\n");
   1356 						goto err;
   1357 						}
   1358 					/* Ignore "BIO_should_retry". */
   1359 					}
   1360 				else if (r == 0)
   1361 					{
   1362 					fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
   1363 					goto err;
   1364 					}
   1365 				else
   1366 					{
   1367 					if (debug)
   1368 						printf("server wrote %d\n", r);
   1369 					sw_num -= r;
   1370 					}
   1371 				}
   1372 
   1373 			if (sr_num > 0)
   1374 				{
   1375 				/* Read from client. */
   1376 
   1377 				r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
   1378 				if (r < 0)
   1379 					{
   1380 					if (!BIO_should_retry(s_ssl_bio))
   1381 						{
   1382 						fprintf(stderr,"ERROR in SERVER\n");
   1383 						goto err;
   1384 						}
   1385 					/* blah, blah */
   1386 					}
   1387 				else if (r == 0)
   1388 					{
   1389 					fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
   1390 					goto err;
   1391 					}
   1392 				else
   1393 					{
   1394 					if (debug)
   1395 						printf("server read %d\n", r);
   1396 					sr_num -= r;
   1397 					}
   1398 				}
   1399 
   1400 			*s_time += (clock() - s_clock);
   1401 			}
   1402 
   1403 			{
   1404 			/* "I/O" BETWEEN CLIENT AND SERVER. */
   1405 
   1406 			size_t r1, r2;
   1407 			BIO *io1 = server_io, *io2 = client_io;
   1408 			/* we use the non-copying interface for io1
   1409 			 * and the standard BIO_write/BIO_read interface for io2
   1410 			 */
   1411 
   1412 			static int prev_progress = 1;
   1413 			int progress = 0;
   1414 
   1415 			/* io1 to io2 */
   1416 			do
   1417 				{
   1418 				size_t num;
   1419 				int r;
   1420 
   1421 				r1 = BIO_ctrl_pending(io1);
   1422 				r2 = BIO_ctrl_get_write_guarantee(io2);
   1423 
   1424 				num = r1;
   1425 				if (r2 < num)
   1426 					num = r2;
   1427 				if (num)
   1428 					{
   1429 					char *dataptr;
   1430 
   1431 					if (INT_MAX < num) /* yeah, right */
   1432 						num = INT_MAX;
   1433 
   1434 					r = BIO_nread(io1, &dataptr, (int)num);
   1435 					assert(r > 0);
   1436 					assert(r <= (int)num);
   1437 					/* possibly r < num (non-contiguous data) */
   1438 					num = r;
   1439 					r = BIO_write(io2, dataptr, (int)num);
   1440 					if (r != (int)num) /* can't happen */
   1441 						{
   1442 						fprintf(stderr, "ERROR: BIO_write could not write "
   1443 							"BIO_ctrl_get_write_guarantee() bytes");
   1444 						goto err;
   1445 						}
   1446 					progress = 1;
   1447 
   1448 					if (debug)
   1449 						printf((io1 == client_io) ?
   1450 							"C->S relaying: %d bytes\n" :
   1451 							"S->C relaying: %d bytes\n",
   1452 							(int)num);
   1453 					}
   1454 				}
   1455 			while (r1 && r2);
   1456 
   1457 			/* io2 to io1 */
   1458 			{
   1459 				size_t num;
   1460 				int r;
   1461 
   1462 				r1 = BIO_ctrl_pending(io2);
   1463 				r2 = BIO_ctrl_get_read_request(io1);
   1464 				/* here we could use ..._get_write_guarantee instead of
   1465 				 * ..._get_read_request, but by using the latter
   1466 				 * we test restartability of the SSL implementation
   1467 				 * more thoroughly */
   1468 				num = r1;
   1469 				if (r2 < num)
   1470 					num = r2;
   1471 				if (num)
   1472 					{
   1473 					char *dataptr;
   1474 
   1475 					if (INT_MAX < num)
   1476 						num = INT_MAX;
   1477 
   1478 					if (num > 1)
   1479 						--num; /* test restartability even more thoroughly */
   1480 
   1481 					r = BIO_nwrite0(io1, &dataptr);
   1482 					assert(r > 0);
   1483 					if (r < (int)num)
   1484 						num = r;
   1485 					r = BIO_read(io2, dataptr, (int)num);
   1486 					if (r != (int)num) /* can't happen */
   1487 						{
   1488 						fprintf(stderr, "ERROR: BIO_read could not read "
   1489 							"BIO_ctrl_pending() bytes");
   1490 						goto err;
   1491 						}
   1492 					progress = 1;
   1493 					r = BIO_nwrite(io1, &dataptr, (int)num);
   1494 					if (r != (int)num) /* can't happen */
   1495 						{
   1496 						fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
   1497 							"BIO_nwrite0() bytes");
   1498 						goto err;
   1499 						}
   1500 
   1501 					if (debug)
   1502 						printf((io2 == client_io) ?
   1503 							"C->S relaying: %d bytes\n" :
   1504 							"S->C relaying: %d bytes\n",
   1505 							(int)num);
   1506 					}
   1507 			} /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
   1508 
   1509 			if (!progress && !prev_progress)
   1510 				if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
   1511 					{
   1512 					fprintf(stderr, "ERROR: got stuck\n");
   1513 					if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
   1514 						{
   1515 						fprintf(stderr, "This can happen for SSL2 because "
   1516 							"CLIENT-FINISHED and SERVER-VERIFY are written \n"
   1517 							"concurrently ...");
   1518 						if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
   1519 							&& strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
   1520 							{
   1521 							fprintf(stderr, " ok.\n");
   1522 							goto end;
   1523 							}
   1524 						}
   1525 					fprintf(stderr, " ERROR.\n");
   1526 					goto err;
   1527 					}
   1528 			prev_progress = progress;
   1529 			}
   1530 		}
   1531 	while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
   1532 
   1533 	if (verbose)
   1534 		print_details(c_ssl, "DONE via BIO pair: ");
   1535 end:
   1536 	ret = 0;
   1537 
   1538  err:
   1539 	ERR_print_errors(bio_err);
   1540 
   1541 	if (server)
   1542 		BIO_free(server);
   1543 	if (server_io)
   1544 		BIO_free(server_io);
   1545 	if (client)
   1546 		BIO_free(client);
   1547 	if (client_io)
   1548 		BIO_free(client_io);
   1549 	if (s_ssl_bio)
   1550 		BIO_free(s_ssl_bio);
   1551 	if (c_ssl_bio)
   1552 		BIO_free(c_ssl_bio);
   1553 
   1554 	return ret;
   1555 	}
   1556 
   1557 
   1558 #define W_READ	1
   1559 #define W_WRITE	2
   1560 #define C_DONE	1
   1561 #define S_DONE	2
   1562 
   1563 int doit(SSL *s_ssl, SSL *c_ssl, long count)
   1564 	{
   1565 	MS_STATIC char cbuf[1024*8],sbuf[1024*8];
   1566 	long cw_num=count,cr_num=count;
   1567 	long sw_num=count,sr_num=count;
   1568 	int ret=1;
   1569 	BIO *c_to_s=NULL;
   1570 	BIO *s_to_c=NULL;
   1571 	BIO *c_bio=NULL;
   1572 	BIO *s_bio=NULL;
   1573 	int c_r,c_w,s_r,s_w;
   1574 	int i,j;
   1575 	int done=0;
   1576 	int c_write,s_write;
   1577 	int do_server=0,do_client=0;
   1578 
   1579 	memset(cbuf,0,sizeof(cbuf));
   1580 	memset(sbuf,0,sizeof(sbuf));
   1581 
   1582 	c_to_s=BIO_new(BIO_s_mem());
   1583 	s_to_c=BIO_new(BIO_s_mem());
   1584 	if ((s_to_c == NULL) || (c_to_s == NULL))
   1585 		{
   1586 		ERR_print_errors(bio_err);
   1587 		goto err;
   1588 		}
   1589 
   1590 	c_bio=BIO_new(BIO_f_ssl());
   1591 	s_bio=BIO_new(BIO_f_ssl());
   1592 	if ((c_bio == NULL) || (s_bio == NULL))
   1593 		{
   1594 		ERR_print_errors(bio_err);
   1595 		goto err;
   1596 		}
   1597 
   1598 	SSL_set_connect_state(c_ssl);
   1599 	SSL_set_bio(c_ssl,s_to_c,c_to_s);
   1600 	BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
   1601 
   1602 	SSL_set_accept_state(s_ssl);
   1603 	SSL_set_bio(s_ssl,c_to_s,s_to_c);
   1604 	BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
   1605 
   1606 	c_r=0; s_r=1;
   1607 	c_w=1; s_w=0;
   1608 	c_write=1,s_write=0;
   1609 
   1610 	/* We can always do writes */
   1611 	for (;;)
   1612 		{
   1613 		do_server=0;
   1614 		do_client=0;
   1615 
   1616 		i=(int)BIO_pending(s_bio);
   1617 		if ((i && s_r) || s_w) do_server=1;
   1618 
   1619 		i=(int)BIO_pending(c_bio);
   1620 		if ((i && c_r) || c_w) do_client=1;
   1621 
   1622 		if (do_server && debug)
   1623 			{
   1624 			if (SSL_in_init(s_ssl))
   1625 				printf("server waiting in SSL_accept - %s\n",
   1626 					SSL_state_string_long(s_ssl));
   1627 /*			else if (s_write)
   1628 				printf("server:SSL_write()\n");
   1629 			else
   1630 				printf("server:SSL_read()\n"); */
   1631 			}
   1632 
   1633 		if (do_client && debug)
   1634 			{
   1635 			if (SSL_in_init(c_ssl))
   1636 				printf("client waiting in SSL_connect - %s\n",
   1637 					SSL_state_string_long(c_ssl));
   1638 /*			else if (c_write)
   1639 				printf("client:SSL_write()\n");
   1640 			else
   1641 				printf("client:SSL_read()\n"); */
   1642 			}
   1643 
   1644 		if (!do_client && !do_server)
   1645 			{
   1646 			fprintf(stdout,"ERROR IN STARTUP\n");
   1647 			ERR_print_errors(bio_err);
   1648 			break;
   1649 			}
   1650 		if (do_client && !(done & C_DONE))
   1651 			{
   1652 			if (c_write)
   1653 				{
   1654 				j = (cw_num > (long)sizeof(cbuf)) ?
   1655 					(int)sizeof(cbuf) : (int)cw_num;
   1656 				i=BIO_write(c_bio,cbuf,j);
   1657 				if (i < 0)
   1658 					{
   1659 					c_r=0;
   1660 					c_w=0;
   1661 					if (BIO_should_retry(c_bio))
   1662 						{
   1663 						if (BIO_should_read(c_bio))
   1664 							c_r=1;
   1665 						if (BIO_should_write(c_bio))
   1666 							c_w=1;
   1667 						}
   1668 					else
   1669 						{
   1670 						fprintf(stderr,"ERROR in CLIENT\n");
   1671 						ERR_print_errors(bio_err);
   1672 						goto err;
   1673 						}
   1674 					}
   1675 				else if (i == 0)
   1676 					{
   1677 					fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
   1678 					goto err;
   1679 					}
   1680 				else
   1681 					{
   1682 					if (debug)
   1683 						printf("client wrote %d\n",i);
   1684 					/* ok */
   1685 					s_r=1;
   1686 					c_write=0;
   1687 					cw_num-=i;
   1688 					}
   1689 				}
   1690 			else
   1691 				{
   1692 				i=BIO_read(c_bio,cbuf,sizeof(cbuf));
   1693 				if (i < 0)
   1694 					{
   1695 					c_r=0;
   1696 					c_w=0;
   1697 					if (BIO_should_retry(c_bio))
   1698 						{
   1699 						if (BIO_should_read(c_bio))
   1700 							c_r=1;
   1701 						if (BIO_should_write(c_bio))
   1702 							c_w=1;
   1703 						}
   1704 					else
   1705 						{
   1706 						fprintf(stderr,"ERROR in CLIENT\n");
   1707 						ERR_print_errors(bio_err);
   1708 						goto err;
   1709 						}
   1710 					}
   1711 				else if (i == 0)
   1712 					{
   1713 					fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
   1714 					goto err;
   1715 					}
   1716 				else
   1717 					{
   1718 					if (debug)
   1719 						printf("client read %d\n",i);
   1720 					cr_num-=i;
   1721 					if (sw_num > 0)
   1722 						{
   1723 						s_write=1;
   1724 						s_w=1;
   1725 						}
   1726 					if (cr_num <= 0)
   1727 						{
   1728 						s_write=1;
   1729 						s_w=1;
   1730 						done=S_DONE|C_DONE;
   1731 						}
   1732 					}
   1733 				}
   1734 			}
   1735 
   1736 		if (do_server && !(done & S_DONE))
   1737 			{
   1738 			if (!s_write)
   1739 				{
   1740 				i=BIO_read(s_bio,sbuf,sizeof(cbuf));
   1741 				if (i < 0)
   1742 					{
   1743 					s_r=0;
   1744 					s_w=0;
   1745 					if (BIO_should_retry(s_bio))
   1746 						{
   1747 						if (BIO_should_read(s_bio))
   1748 							s_r=1;
   1749 						if (BIO_should_write(s_bio))
   1750 							s_w=1;
   1751 						}
   1752 					else
   1753 						{
   1754 						fprintf(stderr,"ERROR in SERVER\n");
   1755 						ERR_print_errors(bio_err);
   1756 						goto err;
   1757 						}
   1758 					}
   1759 				else if (i == 0)
   1760 					{
   1761 					ERR_print_errors(bio_err);
   1762 					fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
   1763 					goto err;
   1764 					}
   1765 				else
   1766 					{
   1767 					if (debug)
   1768 						printf("server read %d\n",i);
   1769 					sr_num-=i;
   1770 					if (cw_num > 0)
   1771 						{
   1772 						c_write=1;
   1773 						c_w=1;
   1774 						}
   1775 					if (sr_num <= 0)
   1776 						{
   1777 						s_write=1;
   1778 						s_w=1;
   1779 						c_write=0;
   1780 						}
   1781 					}
   1782 				}
   1783 			else
   1784 				{
   1785 				j = (sw_num > (long)sizeof(sbuf)) ?
   1786 					(int)sizeof(sbuf) : (int)sw_num;
   1787 				i=BIO_write(s_bio,sbuf,j);
   1788 				if (i < 0)
   1789 					{
   1790 					s_r=0;
   1791 					s_w=0;
   1792 					if (BIO_should_retry(s_bio))
   1793 						{
   1794 						if (BIO_should_read(s_bio))
   1795 							s_r=1;
   1796 						if (BIO_should_write(s_bio))
   1797 							s_w=1;
   1798 						}
   1799 					else
   1800 						{
   1801 						fprintf(stderr,"ERROR in SERVER\n");
   1802 						ERR_print_errors(bio_err);
   1803 						goto err;
   1804 						}
   1805 					}
   1806 				else if (i == 0)
   1807 					{
   1808 					ERR_print_errors(bio_err);
   1809 					fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
   1810 					goto err;
   1811 					}
   1812 				else
   1813 					{
   1814 					if (debug)
   1815 						printf("server wrote %d\n",i);
   1816 					sw_num-=i;
   1817 					s_write=0;
   1818 					c_r=1;
   1819 					if (sw_num <= 0)
   1820 						done|=S_DONE;
   1821 					}
   1822 				}
   1823 			}
   1824 
   1825 		if ((done & S_DONE) && (done & C_DONE)) break;
   1826 		}
   1827 
   1828 	if (verbose)
   1829 		print_details(c_ssl, "DONE: ");
   1830 	ret=0;
   1831 err:
   1832 	/* We have to set the BIO's to NULL otherwise they will be
   1833 	 * OPENSSL_free()ed twice.  Once when th s_ssl is SSL_free()ed and
   1834 	 * again when c_ssl is SSL_free()ed.
   1835 	 * This is a hack required because s_ssl and c_ssl are sharing the same
   1836 	 * BIO structure and SSL_set_bio() and SSL_free() automatically
   1837 	 * BIO_free non NULL entries.
   1838 	 * You should not normally do this or be required to do this */
   1839 	if (s_ssl != NULL)
   1840 		{
   1841 		s_ssl->rbio=NULL;
   1842 		s_ssl->wbio=NULL;
   1843 		}
   1844 	if (c_ssl != NULL)
   1845 		{
   1846 		c_ssl->rbio=NULL;
   1847 		c_ssl->wbio=NULL;
   1848 		}
   1849 
   1850 	if (c_to_s != NULL) BIO_free(c_to_s);
   1851 	if (s_to_c != NULL) BIO_free(s_to_c);
   1852 	if (c_bio != NULL) BIO_free_all(c_bio);
   1853 	if (s_bio != NULL) BIO_free_all(s_bio);
   1854 	return(ret);
   1855 	}
   1856 
   1857 static int get_proxy_auth_ex_data_idx(void)
   1858 	{
   1859 	static volatile int idx = -1;
   1860 	if (idx < 0)
   1861 		{
   1862 		CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
   1863 		if (idx < 0)
   1864 			{
   1865 			idx = X509_STORE_CTX_get_ex_new_index(0,
   1866 				"SSLtest for verify callback", NULL,NULL,NULL);
   1867 			}
   1868 		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
   1869 		}
   1870 	return idx;
   1871 	}
   1872 
   1873 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
   1874 	{
   1875 	char *s,buf[256];
   1876 
   1877 	s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
   1878 			    sizeof buf);
   1879 	if (s != NULL)
   1880 		{
   1881 		if (ok)
   1882 			fprintf(stderr,"depth=%d %s\n",
   1883 				ctx->error_depth,buf);
   1884 		else
   1885 			{
   1886 			fprintf(stderr,"depth=%d error=%d %s\n",
   1887 				ctx->error_depth,ctx->error,buf);
   1888 			}
   1889 		}
   1890 
   1891 	if (ok == 0)
   1892 		{
   1893 		fprintf(stderr,"Error string: %s\n",
   1894 			X509_verify_cert_error_string(ctx->error));
   1895 		switch (ctx->error)
   1896 			{
   1897 		case X509_V_ERR_CERT_NOT_YET_VALID:
   1898 		case X509_V_ERR_CERT_HAS_EXPIRED:
   1899 		case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
   1900 			fprintf(stderr,"  ... ignored.\n");
   1901 			ok=1;
   1902 			}
   1903 		}
   1904 
   1905 	if (ok == 1)
   1906 		{
   1907 		X509 *xs = ctx->current_cert;
   1908 #if 0
   1909 		X509 *xi = ctx->current_issuer;
   1910 #endif
   1911 
   1912 		if (xs->ex_flags & EXFLAG_PROXY)
   1913 			{
   1914 			unsigned int *letters =
   1915 				X509_STORE_CTX_get_ex_data(ctx,
   1916 					get_proxy_auth_ex_data_idx());
   1917 
   1918 			if (letters)
   1919 				{
   1920 				int found_any = 0;
   1921 				int i;
   1922 				PROXY_CERT_INFO_EXTENSION *pci =
   1923 					X509_get_ext_d2i(xs, NID_proxyCertInfo,
   1924 						NULL, NULL);
   1925 
   1926 				switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
   1927 					{
   1928 				case NID_Independent:
   1929 					/* Completely meaningless in this
   1930 					   program, as there's no way to
   1931 					   grant explicit rights to a
   1932 					   specific PrC.  Basically, using
   1933 					   id-ppl-Independent is the perfect
   1934 					   way to grant no rights at all. */
   1935 					fprintf(stderr, "  Independent proxy certificate");
   1936 					for (i = 0; i < 26; i++)
   1937 						letters[i] = 0;
   1938 					break;
   1939 				case NID_id_ppl_inheritAll:
   1940 					/* This is basically a NOP, we
   1941 					   simply let the current rights
   1942 					   stand as they are. */
   1943 					fprintf(stderr, "  Proxy certificate inherits all");
   1944 					break;
   1945 				default:
   1946 					s = (char *)
   1947 						pci->proxyPolicy->policy->data;
   1948 					i = pci->proxyPolicy->policy->length;
   1949 
   1950 					/* The algorithm works as follows:
   1951 					   it is assumed that previous
   1952 					   iterations or the initial granted
   1953 					   rights has already set some elements
   1954 					   of `letters'.  What we need to do is
   1955 					   to clear those that weren't granted
   1956 					   by the current PrC as well.  The
   1957 					   easiest way to do this is to add 1
   1958 					   to all the elements whose letters
   1959 					   are given with the current policy.
   1960 					   That way, all elements that are set
   1961 					   by the current policy and were
   1962 					   already set by earlier policies and
   1963 					   through the original grant of rights
   1964 					   will get the value 2 or higher.
   1965 					   The last thing to do is to sweep
   1966 					   through `letters' and keep the
   1967 					   elements having the value 2 as set,
   1968 					   and clear all the others. */
   1969 
   1970 					fprintf(stderr, "  Certificate proxy rights = %*.*s", i, i, s);
   1971 					while(i-- > 0)
   1972 						{
   1973 						int c = *s++;
   1974 						if (isascii(c) && isalpha(c))
   1975 							{
   1976 							if (islower(c))
   1977 								c = toupper(c);
   1978 							letters[c - 'A']++;
   1979 							}
   1980 						}
   1981 					for (i = 0; i < 26; i++)
   1982 						if (letters[i] < 2)
   1983 							letters[i] = 0;
   1984 						else
   1985 							letters[i] = 1;
   1986 					}
   1987 
   1988 				found_any = 0;
   1989 				fprintf(stderr,
   1990 					", resulting proxy rights = ");
   1991 				for(i = 0; i < 26; i++)
   1992 					if (letters[i])
   1993 						{
   1994 						fprintf(stderr, "%c", i + 'A');
   1995 						found_any = 1;
   1996 						}
   1997 				if (!found_any)
   1998 					fprintf(stderr, "none");
   1999 				fprintf(stderr, "\n");
   2000 
   2001 				PROXY_CERT_INFO_EXTENSION_free(pci);
   2002 				}
   2003 			}
   2004 		}
   2005 
   2006 	return(ok);
   2007 	}
   2008 
   2009 static void process_proxy_debug(int indent, const char *format, ...)
   2010 	{
   2011 	static const char indentation[] =
   2012 		">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
   2013 		">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
   2014 	char my_format[256];
   2015 	va_list args;
   2016 
   2017 	BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
   2018 		indent, indent, indentation, format);
   2019 
   2020 	va_start(args, format);
   2021 	vfprintf(stderr, my_format, args);
   2022 	va_end(args);
   2023 	}
   2024 /* Priority levels:
   2025    0	[!]var, ()
   2026    1	& ^
   2027    2	|
   2028 */
   2029 static int process_proxy_cond_adders(unsigned int letters[26],
   2030 	const char *cond, const char **cond_end, int *pos, int indent);
   2031 static int process_proxy_cond_val(unsigned int letters[26],
   2032 	const char *cond, const char **cond_end, int *pos, int indent)
   2033 	{
   2034 	int c;
   2035 	int ok = 1;
   2036 	int negate = 0;
   2037 
   2038 	while(isspace((int)*cond))
   2039 		{
   2040 		cond++; (*pos)++;
   2041 		}
   2042 	c = *cond;
   2043 
   2044 	if (debug)
   2045 		process_proxy_debug(indent,
   2046 			"Start process_proxy_cond_val at position %d: %s\n",
   2047 			*pos, cond);
   2048 
   2049 	while(c == '!')
   2050 		{
   2051 		negate = !negate;
   2052 		cond++; (*pos)++;
   2053 		while(isspace((int)*cond))
   2054 			{
   2055 			cond++; (*pos)++;
   2056 			}
   2057 		c = *cond;
   2058 		}
   2059 
   2060 	if (c == '(')
   2061 		{
   2062 		cond++; (*pos)++;
   2063 		ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
   2064 			indent + 1);
   2065 		cond = *cond_end;
   2066 		if (ok < 0)
   2067 			goto end;
   2068 		while(isspace((int)*cond))
   2069 			{
   2070 			cond++; (*pos)++;
   2071 			}
   2072 		c = *cond;
   2073 		if (c != ')')
   2074 			{
   2075 			fprintf(stderr,
   2076 				"Weird condition character in position %d: "
   2077 				"%c\n", *pos, c);
   2078 			ok = -1;
   2079 			goto end;
   2080 			}
   2081 		cond++; (*pos)++;
   2082 		}
   2083 	else if (isascii(c) && isalpha(c))
   2084 		{
   2085 		if (islower(c))
   2086 			c = toupper(c);
   2087 		ok = letters[c - 'A'];
   2088 		cond++; (*pos)++;
   2089 		}
   2090 	else
   2091 		{
   2092 		fprintf(stderr,
   2093 			"Weird condition character in position %d: "
   2094 			"%c\n", *pos, c);
   2095 		ok = -1;
   2096 		goto end;
   2097 		}
   2098  end:
   2099 	*cond_end = cond;
   2100 	if (ok >= 0 && negate)
   2101 		ok = !ok;
   2102 
   2103 	if (debug)
   2104 		process_proxy_debug(indent,
   2105 			"End process_proxy_cond_val at position %d: %s, returning %d\n",
   2106 			*pos, cond, ok);
   2107 
   2108 	return ok;
   2109 	}
   2110 static int process_proxy_cond_multipliers(unsigned int letters[26],
   2111 	const char *cond, const char **cond_end, int *pos, int indent)
   2112 	{
   2113 	int ok;
   2114 	char c;
   2115 
   2116 	if (debug)
   2117 		process_proxy_debug(indent,
   2118 			"Start process_proxy_cond_multipliers at position %d: %s\n",
   2119 			*pos, cond);
   2120 
   2121 	ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
   2122 	cond = *cond_end;
   2123 	if (ok < 0)
   2124 		goto end;
   2125 
   2126 	while(ok >= 0)
   2127 		{
   2128 		while(isspace((int)*cond))
   2129 			{
   2130 			cond++; (*pos)++;
   2131 			}
   2132 		c = *cond;
   2133 
   2134 		switch(c)
   2135 			{
   2136 		case '&':
   2137 		case '^':
   2138 			{
   2139 			int save_ok = ok;
   2140 
   2141 			cond++; (*pos)++;
   2142 			ok = process_proxy_cond_val(letters,
   2143 				cond, cond_end, pos, indent + 1);
   2144 			cond = *cond_end;
   2145 			if (ok < 0)
   2146 				break;
   2147 
   2148 			switch(c)
   2149 				{
   2150 			case '&':
   2151 				ok &= save_ok;
   2152 				break;
   2153 			case '^':
   2154 				ok ^= save_ok;
   2155 				break;
   2156 			default:
   2157 				fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
   2158 					" STOPPING\n");
   2159 				EXIT(1);
   2160 				}
   2161 			}
   2162 			break;
   2163 		default:
   2164 			goto end;
   2165 			}
   2166 		}
   2167  end:
   2168 	if (debug)
   2169 		process_proxy_debug(indent,
   2170 			"End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
   2171 			*pos, cond, ok);
   2172 
   2173 	*cond_end = cond;
   2174 	return ok;
   2175 	}
   2176 static int process_proxy_cond_adders(unsigned int letters[26],
   2177 	const char *cond, const char **cond_end, int *pos, int indent)
   2178 	{
   2179 	int ok;
   2180 	char c;
   2181 
   2182 	if (debug)
   2183 		process_proxy_debug(indent,
   2184 			"Start process_proxy_cond_adders at position %d: %s\n",
   2185 			*pos, cond);
   2186 
   2187 	ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
   2188 		indent + 1);
   2189 	cond = *cond_end;
   2190 	if (ok < 0)
   2191 		goto end;
   2192 
   2193 	while(ok >= 0)
   2194 		{
   2195 		while(isspace((int)*cond))
   2196 			{
   2197 			cond++; (*pos)++;
   2198 			}
   2199 		c = *cond;
   2200 
   2201 		switch(c)
   2202 			{
   2203 		case '|':
   2204 			{
   2205 			int save_ok = ok;
   2206 
   2207 			cond++; (*pos)++;
   2208 			ok = process_proxy_cond_multipliers(letters,
   2209 				cond, cond_end, pos, indent + 1);
   2210 			cond = *cond_end;
   2211 			if (ok < 0)
   2212 				break;
   2213 
   2214 			switch(c)
   2215 				{
   2216 			case '|':
   2217 				ok |= save_ok;
   2218 				break;
   2219 			default:
   2220 				fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
   2221 					" STOPPING\n");
   2222 				EXIT(1);
   2223 				}
   2224 			}
   2225 			break;
   2226 		default:
   2227 			goto end;
   2228 			}
   2229 		}
   2230  end:
   2231 	if (debug)
   2232 		process_proxy_debug(indent,
   2233 			"End process_proxy_cond_adders at position %d: %s, returning %d\n",
   2234 			*pos, cond, ok);
   2235 
   2236 	*cond_end = cond;
   2237 	return ok;
   2238 	}
   2239 
   2240 static int process_proxy_cond(unsigned int letters[26],
   2241 	const char *cond, const char **cond_end)
   2242 	{
   2243 	int pos = 1;
   2244 	return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
   2245 	}
   2246 
   2247 static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
   2248 	{
   2249 	int ok=1;
   2250 	struct app_verify_arg *cb_arg = arg;
   2251 	unsigned int letters[26]; /* only used with proxy_auth */
   2252 
   2253 	if (cb_arg->app_verify)
   2254 		{
   2255 		char *s = NULL,buf[256];
   2256 
   2257 		fprintf(stderr, "In app_verify_callback, allowing cert. ");
   2258 		fprintf(stderr, "Arg is: %s\n", cb_arg->string);
   2259 		fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
   2260 			(void *)ctx, (void *)ctx->cert);
   2261 		if (ctx->cert)
   2262 			s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
   2263 		if (s != NULL)
   2264 			{
   2265 			fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
   2266 			}
   2267 		return(1);
   2268 		}
   2269 	if (cb_arg->proxy_auth)
   2270 		{
   2271 		int found_any = 0, i;
   2272 		char *sp;
   2273 
   2274 		for(i = 0; i < 26; i++)
   2275 			letters[i] = 0;
   2276 		for(sp = cb_arg->proxy_auth; *sp; sp++)
   2277 			{
   2278 			int c = *sp;
   2279 			if (isascii(c) && isalpha(c))
   2280 				{
   2281 				if (islower(c))
   2282 					c = toupper(c);
   2283 				letters[c - 'A'] = 1;
   2284 				}
   2285 			}
   2286 
   2287 		fprintf(stderr,
   2288 			"  Initial proxy rights = ");
   2289 		for(i = 0; i < 26; i++)
   2290 			if (letters[i])
   2291 				{
   2292 				fprintf(stderr, "%c", i + 'A');
   2293 				found_any = 1;
   2294 				}
   2295 		if (!found_any)
   2296 			fprintf(stderr, "none");
   2297 		fprintf(stderr, "\n");
   2298 
   2299 		X509_STORE_CTX_set_ex_data(ctx,
   2300 			get_proxy_auth_ex_data_idx(),letters);
   2301 		}
   2302 	if (cb_arg->allow_proxy_certs)
   2303 		{
   2304 		X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
   2305 		}
   2306 
   2307 #ifndef OPENSSL_NO_X509_VERIFY
   2308 	ok = X509_verify_cert(ctx);
   2309 #endif
   2310 
   2311 	if (cb_arg->proxy_auth)
   2312 		{
   2313 		if (ok > 0)
   2314 			{
   2315 			const char *cond_end = NULL;
   2316 
   2317 			ok = process_proxy_cond(letters,
   2318 				cb_arg->proxy_cond, &cond_end);
   2319 
   2320 			if (ok < 0)
   2321 				EXIT(3);
   2322 			if (*cond_end)
   2323 				{
   2324 				fprintf(stderr, "Stopped processing condition before it's end.\n");
   2325 				ok = 0;
   2326 				}
   2327 			if (!ok)
   2328 				fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
   2329 					cb_arg->proxy_cond);
   2330 			else
   2331 				fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
   2332 					cb_arg->proxy_cond);
   2333 			}
   2334 		}
   2335 	return(ok);
   2336 	}
   2337 
   2338 #ifndef OPENSSL_NO_RSA
   2339 static RSA *rsa_tmp=NULL;
   2340 
   2341 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
   2342 	{
   2343 	BIGNUM *bn = NULL;
   2344 	if (rsa_tmp == NULL)
   2345 		{
   2346 		bn = BN_new();
   2347 		rsa_tmp = RSA_new();
   2348 		if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
   2349 			{
   2350 			BIO_printf(bio_err, "Memory error...");
   2351 			goto end;
   2352 			}
   2353 		BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
   2354 		(void)BIO_flush(bio_err);
   2355 		if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
   2356 			{
   2357 			BIO_printf(bio_err, "Error generating key.");
   2358 			RSA_free(rsa_tmp);
   2359 			rsa_tmp = NULL;
   2360 			}
   2361 end:
   2362 		BIO_printf(bio_err,"\n");
   2363 		(void)BIO_flush(bio_err);
   2364 		}
   2365 	if(bn) BN_free(bn);
   2366 	return(rsa_tmp);
   2367 	}
   2368 
   2369 static void free_tmp_rsa(void)
   2370 	{
   2371 	if (rsa_tmp != NULL)
   2372 		{
   2373 		RSA_free(rsa_tmp);
   2374 		rsa_tmp = NULL;
   2375 		}
   2376 	}
   2377 #endif
   2378 
   2379 #ifndef OPENSSL_NO_DH
   2380 /* These DH parameters have been generated as follows:
   2381  *    $ openssl dhparam -C -noout 512
   2382  *    $ openssl dhparam -C -noout 1024
   2383  *    $ openssl dhparam -C -noout -dsaparam 1024
   2384  * (The third function has been renamed to avoid name conflicts.)
   2385  */
   2386 static DH *get_dh512()
   2387 	{
   2388 	static unsigned char dh512_p[]={
   2389 		0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
   2390 		0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
   2391 		0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
   2392 		0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
   2393 		0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
   2394 		0x02,0xC5,0xAE,0x23,
   2395 		};
   2396 	static unsigned char dh512_g[]={
   2397 		0x02,
   2398 		};
   2399 	DH *dh;
   2400 
   2401 	if ((dh=DH_new()) == NULL) return(NULL);
   2402 	dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
   2403 	dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
   2404 	if ((dh->p == NULL) || (dh->g == NULL))
   2405 		{ DH_free(dh); return(NULL); }
   2406 	return(dh);
   2407 	}
   2408 
   2409 static DH *get_dh1024()
   2410 	{
   2411 	static unsigned char dh1024_p[]={
   2412 		0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
   2413 		0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
   2414 		0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
   2415 		0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
   2416 		0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
   2417 		0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
   2418 		0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
   2419 		0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
   2420 		0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
   2421 		0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
   2422 		0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
   2423 		};
   2424 	static unsigned char dh1024_g[]={
   2425 		0x02,
   2426 		};
   2427 	DH *dh;
   2428 
   2429 	if ((dh=DH_new()) == NULL) return(NULL);
   2430 	dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
   2431 	dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
   2432 	if ((dh->p == NULL) || (dh->g == NULL))
   2433 		{ DH_free(dh); return(NULL); }
   2434 	return(dh);
   2435 	}
   2436 
   2437 static DH *get_dh1024dsa()
   2438 	{
   2439 	static unsigned char dh1024_p[]={
   2440 		0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
   2441 		0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
   2442 		0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
   2443 		0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
   2444 		0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
   2445 		0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
   2446 		0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
   2447 		0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
   2448 		0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
   2449 		0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
   2450 		0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
   2451 		};
   2452 	static unsigned char dh1024_g[]={
   2453 		0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
   2454 		0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
   2455 		0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
   2456 		0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
   2457 		0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
   2458 		0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
   2459 		0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
   2460 		0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
   2461 		0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
   2462 		0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
   2463 		0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
   2464 		};
   2465 	DH *dh;
   2466 
   2467 	if ((dh=DH_new()) == NULL) return(NULL);
   2468 	dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
   2469 	dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
   2470 	if ((dh->p == NULL) || (dh->g == NULL))
   2471 		{ DH_free(dh); return(NULL); }
   2472 	dh->length = 160;
   2473 	return(dh);
   2474 	}
   2475 #endif
   2476 
   2477 #ifndef OPENSSL_NO_PSK
   2478 /* convert the PSK key (psk_key) in ascii to binary (psk) */
   2479 static int psk_key2bn(const char *pskkey, unsigned char *psk,
   2480 	unsigned int max_psk_len)
   2481 	{
   2482 	int ret;
   2483 	BIGNUM *bn = NULL;
   2484 
   2485 	ret = BN_hex2bn(&bn, pskkey);
   2486 	if (!ret)
   2487 		{
   2488 		BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey);
   2489 		if (bn)
   2490 			BN_free(bn);
   2491 		return 0;
   2492 		}
   2493 	if (BN_num_bytes(bn) > (int)max_psk_len)
   2494 		{
   2495 		BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
   2496 			max_psk_len, BN_num_bytes(bn));
   2497 		BN_free(bn);
   2498 		return 0;
   2499 		}
   2500 	ret = BN_bn2bin(bn, psk);
   2501 	BN_free(bn);
   2502 	return ret;
   2503 	}
   2504 
   2505 static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
   2506 	unsigned int max_identity_len, unsigned char *psk,
   2507 	unsigned int max_psk_len)
   2508 	{
   2509 	int ret;
   2510 	unsigned int psk_len = 0;
   2511 
   2512 	ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
   2513 	if (ret < 0)
   2514 		goto out_err;
   2515 	if (debug)
   2516 		fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
   2517 	ret = psk_key2bn(psk_key, psk, max_psk_len);
   2518 	if (ret < 0)
   2519 		goto out_err;
   2520 	psk_len = ret;
   2521 out_err:
   2522 	return psk_len;
   2523 	}
   2524 
   2525 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
   2526 	unsigned char *psk, unsigned int max_psk_len)
   2527 	{
   2528 	unsigned int psk_len=0;
   2529 
   2530 	if (strcmp(identity, "Client_identity") != 0)
   2531 		{
   2532 		BIO_printf(bio_err, "server: PSK error: client identity not found\n");
   2533 		return 0;
   2534 		}
   2535 	psk_len=psk_key2bn(psk_key, psk, max_psk_len);
   2536 	return psk_len;
   2537 	}
   2538 #endif
   2539 
   2540 static int do_test_cipherlist(void)
   2541 	{
   2542 	int i = 0;
   2543 	const SSL_METHOD *meth;
   2544 	const SSL_CIPHER *ci, *tci = NULL;
   2545 
   2546 #ifndef OPENSSL_NO_SSL2
   2547 	fprintf(stderr, "testing SSLv2 cipher list order: ");
   2548 	meth = SSLv2_method();
   2549 	while ((ci = meth->get_cipher(i++)) != NULL)
   2550 		{
   2551 		if (tci != NULL)
   2552 			if (ci->id >= tci->id)
   2553 				{
   2554 				fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
   2555 				return 0;
   2556 				}
   2557 		tci = ci;
   2558 		}
   2559 	fprintf(stderr, "ok\n");
   2560 #endif
   2561 #ifndef OPENSSL_NO_SSL3
   2562 	fprintf(stderr, "testing SSLv3 cipher list order: ");
   2563 	meth = SSLv3_method();
   2564 	tci = NULL;
   2565 	while ((ci = meth->get_cipher(i++)) != NULL)
   2566 		{
   2567 		if (tci != NULL)
   2568 			if (ci->id >= tci->id)
   2569 				{
   2570 				fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
   2571 				return 0;
   2572 				}
   2573 		tci = ci;
   2574 		}
   2575 	fprintf(stderr, "ok\n");
   2576 #endif
   2577 #ifndef OPENSSL_NO_TLS1
   2578 	fprintf(stderr, "testing TLSv1 cipher list order: ");
   2579 	meth = TLSv1_method();
   2580 	tci = NULL;
   2581 	while ((ci = meth->get_cipher(i++)) != NULL)
   2582 		{
   2583 		if (tci != NULL)
   2584 			if (ci->id >= tci->id)
   2585 				{
   2586 				fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
   2587 				return 0;
   2588 				}
   2589 		tci = ci;
   2590 		}
   2591 	fprintf(stderr, "ok\n");
   2592 #endif
   2593 
   2594 	return 1;
   2595 	}
   2596