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