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 * 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 220static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx); 221#ifndef OPENSSL_NO_RSA 222static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength); 223static void free_tmp_rsa(void); 224#endif 225static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg); 226#define APP_CALLBACK_STRING "Test Callback Argument" 227struct 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 237static DH *get_dh512(void); 238static DH *get_dh1024(void); 239static DH *get_dh1024dsa(void); 240#endif 241 242 243static char *psk_key=NULL; /* by default PSK is not used */ 244#ifndef OPENSSL_NO_PSK 245static 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); 248static 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 */ 255typedef struct srp_client_arg_st 256 { 257 char *srppassin; 258 char *srplogin; 259 } SRP_CLIENT_ARG; 260 261#define PWD_STRLEN 1024 262 263static 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 */ 271typedef struct srp_server_arg_st 272 { 273 char *expected_user; 274 char *pass; 275 } SRP_SERVER_ARG; 276 277static 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 295static BIO *bio_err=NULL; 296static BIO *bio_stdout=NULL; 297 298static char *cipher=NULL; 299static int verbose=0; 300static int debug=0; 301#if 0 302/* Not used yet. */ 303#ifdef FIONBIO 304static int s_nbio=0; 305#endif 306#endif 307 308static const char rnd_seed[] = "string to make the random number generator think it has entropy"; 309 310int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time); 311int doit(SSL *s_ssl,SSL *c_ssl,long bytes); 312static int do_test_cipherlist(void); 313static 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 375static 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 419static 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 483struct cb_info_st { void *input; size_t len; int ret; }; 484struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */ 485struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */ 486struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */ 487struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */ 488 489int 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 502int 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 { 785bad: 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 meth=SSLv3_method(); 891#else 892 meth=SSLv2_method(); 893#endif 894#endif 895 896 c_ctx=SSL_CTX_new(meth); 897 s_ctx=SSL_CTX_new(meth); 898 if ((c_ctx == NULL) || (s_ctx == NULL)) 899 { 900 ERR_print_errors(bio_err); 901 goto end; 902 } 903 904 if (cipher != NULL) 905 { 906 SSL_CTX_set_cipher_list(c_ctx,cipher); 907 SSL_CTX_set_cipher_list(s_ctx,cipher); 908 } 909 if (cutthrough) 910 { 911 int ssl_mode = SSL_CTX_get_mode(c_ctx); 912 ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH; 913 SSL_CTX_set_mode(c_ctx, ssl_mode); 914 } 915 916#ifndef OPENSSL_NO_DH 917 if (!no_dhe) 918 { 919 if (dhe1024dsa) 920 { 921 /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */ 922 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE); 923 dh=get_dh1024dsa(); 924 } 925 else if (dhe1024) 926 dh=get_dh1024(); 927 else 928 dh=get_dh512(); 929 SSL_CTX_set_tmp_dh(s_ctx,dh); 930 DH_free(dh); 931 } 932#else 933 (void)no_dhe; 934#endif 935 936#ifndef OPENSSL_NO_ECDH 937 if (!no_ecdhe) 938 { 939 int nid; 940 941 if (named_curve != NULL) 942 { 943 nid = OBJ_sn2nid(named_curve); 944 if (nid == 0) 945 { 946 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve); 947 goto end; 948 } 949 } 950 else 951#ifdef OPENSSL_NO_EC2M 952 nid = NID_X9_62_prime256v1; 953#else 954 nid = NID_sect163r2; 955#endif 956 957 ecdh = EC_KEY_new_by_curve_name(nid); 958 if (ecdh == NULL) 959 { 960 BIO_printf(bio_err, "unable to create curve\n"); 961 goto end; 962 } 963 964 SSL_CTX_set_tmp_ecdh(s_ctx, ecdh); 965 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE); 966 EC_KEY_free(ecdh); 967 } 968#else 969 (void)no_ecdhe; 970#endif 971 972#ifndef OPENSSL_NO_RSA 973 SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb); 974#endif 975 976#ifdef TLSEXT_TYPE_opaque_prf_input 977 SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb); 978 SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb); 979 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */ 980 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */ 981#endif 982 983 if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM)) 984 { 985 ERR_print_errors(bio_err); 986 } 987 else if (!SSL_CTX_use_PrivateKey_file(s_ctx, 988 (server_key?server_key:server_cert), SSL_FILETYPE_PEM)) 989 { 990 ERR_print_errors(bio_err); 991 goto end; 992 } 993 994 if (client_auth) 995 { 996 SSL_CTX_use_certificate_file(c_ctx,client_cert, 997 SSL_FILETYPE_PEM); 998 SSL_CTX_use_PrivateKey_file(c_ctx, 999 (client_key?client_key:client_cert), 1000 SSL_FILETYPE_PEM); 1001 } 1002 1003 if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) || 1004 (!SSL_CTX_set_default_verify_paths(s_ctx)) || 1005 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) || 1006 (!SSL_CTX_set_default_verify_paths(c_ctx))) 1007 { 1008 /* fprintf(stderr,"SSL_load_verify_locations\n"); */ 1009 ERR_print_errors(bio_err); 1010 /* goto end; */ 1011 } 1012 1013 if (client_auth) 1014 { 1015 BIO_printf(bio_err,"client authentication\n"); 1016 SSL_CTX_set_verify(s_ctx, 1017 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 1018 verify_callback); 1019 SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg); 1020 } 1021 if (server_auth) 1022 { 1023 BIO_printf(bio_err,"server authentication\n"); 1024 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER, 1025 verify_callback); 1026 SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg); 1027 } 1028 1029 { 1030 int session_id_context = 0; 1031 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context); 1032 } 1033 1034 /* Use PSK only if PSK key is given */ 1035 if (psk_key != NULL) 1036 { 1037 /* no_psk is used to avoid putting psk command to openssl tool */ 1038 if (no_psk) 1039 { 1040 /* if PSK is not compiled in and psk key is 1041 * given, do nothing and exit successfully */ 1042 ret=0; 1043 goto end; 1044 } 1045#ifndef OPENSSL_NO_PSK 1046 SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback); 1047 SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback); 1048 if (debug) 1049 BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n"); 1050 if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint")) 1051 { 1052 BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n"); 1053 ERR_print_errors(bio_err); 1054 goto end; 1055 } 1056#endif 1057 } 1058#ifndef OPENSSL_NO_SRP 1059 if (srp_client_arg.srplogin) 1060 { 1061 if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin)) 1062 { 1063 BIO_printf(bio_err,"Unable to set SRP username\n"); 1064 goto end; 1065 } 1066 SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg); 1067 SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb); 1068 /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/ 1069 } 1070 1071 if (srp_server_arg.expected_user != NULL) 1072 { 1073 SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback); 1074 SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg); 1075 SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb); 1076 } 1077#endif 1078 1079 c_ssl=SSL_new(c_ctx); 1080 s_ssl=SSL_new(s_ctx); 1081 1082#ifndef OPENSSL_NO_KRB5 1083 if (c_ssl && c_ssl->kssl_ctx) 1084 { 1085 char localhost[MAXHOSTNAMELEN+2]; 1086 1087 if (gethostname(localhost, sizeof localhost-1) == 0) 1088 { 1089 localhost[sizeof localhost-1]='\0'; 1090 if(strlen(localhost) == sizeof localhost-1) 1091 { 1092 BIO_printf(bio_err,"localhost name too long\n"); 1093 goto end; 1094 } 1095 kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER, 1096 localhost); 1097 } 1098 } 1099#endif /* OPENSSL_NO_KRB5 */ 1100 1101 for (i=0; i<number; i++) 1102 { 1103 if (!reuse) SSL_set_session(c_ssl,NULL); 1104 if (bio_pair) 1105 ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time); 1106 else 1107 ret=doit(s_ssl,c_ssl,bytes); 1108 } 1109 1110 if (!verbose) 1111 { 1112 print_details(c_ssl, ""); 1113 } 1114 if ((number > 1) || (bytes > 1L)) 1115 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes); 1116 if (print_time) 1117 { 1118#ifdef CLOCKS_PER_SEC 1119 /* "To determine the time in seconds, the value returned 1120 * by the clock function should be divided by the value 1121 * of the macro CLOCKS_PER_SEC." 1122 * -- ISO/IEC 9899 */ 1123 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n" 1124 "Approximate total client time: %6.2f s\n", 1125 (double)s_time/CLOCKS_PER_SEC, 1126 (double)c_time/CLOCKS_PER_SEC); 1127#else 1128 /* "`CLOCKS_PER_SEC' undeclared (first use this function)" 1129 * -- cc on NeXTstep/OpenStep */ 1130 BIO_printf(bio_stdout, 1131 "Approximate total server time: %6.2f units\n" 1132 "Approximate total client time: %6.2f units\n", 1133 (double)s_time, 1134 (double)c_time); 1135#endif 1136 } 1137 1138 SSL_free(s_ssl); 1139 SSL_free(c_ssl); 1140 1141end: 1142 if (s_ctx != NULL) SSL_CTX_free(s_ctx); 1143 if (c_ctx != NULL) SSL_CTX_free(c_ctx); 1144 1145 if (bio_stdout != NULL) BIO_free(bio_stdout); 1146 1147#ifndef OPENSSL_NO_RSA 1148 free_tmp_rsa(); 1149#endif 1150#ifndef OPENSSL_NO_ENGINE 1151 ENGINE_cleanup(); 1152#endif 1153 CRYPTO_cleanup_all_ex_data(); 1154 ERR_free_strings(); 1155 ERR_remove_thread_state(NULL); 1156 EVP_cleanup(); 1157 CRYPTO_mem_leaks(bio_err); 1158 if (bio_err != NULL) BIO_free(bio_err); 1159 EXIT(ret); 1160 return ret; 1161 } 1162 1163int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count, 1164 clock_t *s_time, clock_t *c_time) 1165 { 1166 long cw_num = count, cr_num = count, sw_num = count, sr_num = count; 1167 BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL; 1168 BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL; 1169 int ret = 1; 1170 1171 size_t bufsiz = 256; /* small buffer for testing */ 1172 1173 if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz)) 1174 goto err; 1175 if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz)) 1176 goto err; 1177 1178 s_ssl_bio = BIO_new(BIO_f_ssl()); 1179 if (!s_ssl_bio) 1180 goto err; 1181 1182 c_ssl_bio = BIO_new(BIO_f_ssl()); 1183 if (!c_ssl_bio) 1184 goto err; 1185 1186 SSL_set_connect_state(c_ssl); 1187 SSL_set_bio(c_ssl, client, client); 1188 (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE); 1189 1190 SSL_set_accept_state(s_ssl); 1191 SSL_set_bio(s_ssl, server, server); 1192 (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE); 1193 1194 do 1195 { 1196 /* c_ssl_bio: SSL filter BIO 1197 * 1198 * client: pseudo-I/O for SSL library 1199 * 1200 * client_io: client's SSL communication; usually to be 1201 * relayed over some I/O facility, but in this 1202 * test program, we're the server, too: 1203 * 1204 * server_io: server's SSL communication 1205 * 1206 * server: pseudo-I/O for SSL library 1207 * 1208 * s_ssl_bio: SSL filter BIO 1209 * 1210 * The client and the server each employ a "BIO pair": 1211 * client + client_io, server + server_io. 1212 * BIO pairs are symmetric. A BIO pair behaves similar 1213 * to a non-blocking socketpair (but both endpoints must 1214 * be handled by the same thread). 1215 * [Here we could connect client and server to the ends 1216 * of a single BIO pair, but then this code would be less 1217 * suitable as an example for BIO pairs in general.] 1218 * 1219 * Useful functions for querying the state of BIO pair endpoints: 1220 * 1221 * BIO_ctrl_pending(bio) number of bytes we can read now 1222 * BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil 1223 * other side's read attempt 1224 * BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now 1225 * 1226 * ..._read_request is never more than ..._write_guarantee; 1227 * it depends on the application which one you should use. 1228 */ 1229 1230 /* We have non-blocking behaviour throughout this test program, but 1231 * can be sure that there is *some* progress in each iteration; so 1232 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE 1233 * -- we just try everything in each iteration 1234 */ 1235 1236 { 1237 /* CLIENT */ 1238 1239 MS_STATIC char cbuf[1024*8]; 1240 int i, r; 1241 clock_t c_clock = clock(); 1242 1243 memset(cbuf, 0, sizeof(cbuf)); 1244 1245 if (debug) 1246 if (SSL_in_init(c_ssl)) 1247 printf("client waiting in SSL_connect - %s\n", 1248 SSL_state_string_long(c_ssl)); 1249 1250 if (cw_num > 0) 1251 { 1252 /* Write to server. */ 1253 1254 if (cw_num > (long)sizeof cbuf) 1255 i = sizeof cbuf; 1256 else 1257 i = (int)cw_num; 1258 r = BIO_write(c_ssl_bio, cbuf, i); 1259 if (r < 0) 1260 { 1261 if (!BIO_should_retry(c_ssl_bio)) 1262 { 1263 fprintf(stderr,"ERROR in CLIENT\n"); 1264 goto err; 1265 } 1266 /* BIO_should_retry(...) can just be ignored here. 1267 * The library expects us to call BIO_write with 1268 * the same arguments again, and that's what we will 1269 * do in the next iteration. */ 1270 } 1271 else if (r == 0) 1272 { 1273 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n"); 1274 goto err; 1275 } 1276 else 1277 { 1278 if (debug) 1279 printf("client wrote %d\n", r); 1280 cw_num -= r; 1281 } 1282 } 1283 1284 if (cr_num > 0) 1285 { 1286 /* Read from server. */ 1287 1288 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf)); 1289 if (r < 0) 1290 { 1291 if (!BIO_should_retry(c_ssl_bio)) 1292 { 1293 fprintf(stderr,"ERROR in CLIENT\n"); 1294 goto err; 1295 } 1296 /* Again, "BIO_should_retry" can be ignored. */ 1297 } 1298 else if (r == 0) 1299 { 1300 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n"); 1301 goto err; 1302 } 1303 else 1304 { 1305 if (debug) 1306 printf("client read %d\n", r); 1307 cr_num -= r; 1308 } 1309 } 1310 1311 /* c_time and s_time increments will typically be very small 1312 * (depending on machine speed and clock tick intervals), 1313 * but sampling over a large number of connections should 1314 * result in fairly accurate figures. We cannot guarantee 1315 * a lot, however -- if each connection lasts for exactly 1316 * one clock tick, it will be counted only for the client 1317 * or only for the server or even not at all. 1318 */ 1319 *c_time += (clock() - c_clock); 1320 } 1321 1322 { 1323 /* SERVER */ 1324 1325 MS_STATIC char sbuf[1024*8]; 1326 int i, r; 1327 clock_t s_clock = clock(); 1328 1329 memset(sbuf, 0, sizeof(sbuf)); 1330 1331 if (debug) 1332 if (SSL_in_init(s_ssl)) 1333 printf("server waiting in SSL_accept - %s\n", 1334 SSL_state_string_long(s_ssl)); 1335 1336 if (sw_num > 0) 1337 { 1338 /* Write to client. */ 1339 1340 if (sw_num > (long)sizeof sbuf) 1341 i = sizeof sbuf; 1342 else 1343 i = (int)sw_num; 1344 r = BIO_write(s_ssl_bio, sbuf, i); 1345 if (r < 0) 1346 { 1347 if (!BIO_should_retry(s_ssl_bio)) 1348 { 1349 fprintf(stderr,"ERROR in SERVER\n"); 1350 goto err; 1351 } 1352 /* Ignore "BIO_should_retry". */ 1353 } 1354 else if (r == 0) 1355 { 1356 fprintf(stderr,"SSL SERVER STARTUP FAILED\n"); 1357 goto err; 1358 } 1359 else 1360 { 1361 if (debug) 1362 printf("server wrote %d\n", r); 1363 sw_num -= r; 1364 } 1365 } 1366 1367 if (sr_num > 0) 1368 { 1369 /* Read from client. */ 1370 1371 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf)); 1372 if (r < 0) 1373 { 1374 if (!BIO_should_retry(s_ssl_bio)) 1375 { 1376 fprintf(stderr,"ERROR in SERVER\n"); 1377 goto err; 1378 } 1379 /* blah, blah */ 1380 } 1381 else if (r == 0) 1382 { 1383 fprintf(stderr,"SSL SERVER STARTUP FAILED\n"); 1384 goto err; 1385 } 1386 else 1387 { 1388 if (debug) 1389 printf("server read %d\n", r); 1390 sr_num -= r; 1391 } 1392 } 1393 1394 *s_time += (clock() - s_clock); 1395 } 1396 1397 { 1398 /* "I/O" BETWEEN CLIENT AND SERVER. */ 1399 1400 size_t r1, r2; 1401 BIO *io1 = server_io, *io2 = client_io; 1402 /* we use the non-copying interface for io1 1403 * and the standard BIO_write/BIO_read interface for io2 1404 */ 1405 1406 static int prev_progress = 1; 1407 int progress = 0; 1408 1409 /* io1 to io2 */ 1410 do 1411 { 1412 size_t num; 1413 int r; 1414 1415 r1 = BIO_ctrl_pending(io1); 1416 r2 = BIO_ctrl_get_write_guarantee(io2); 1417 1418 num = r1; 1419 if (r2 < num) 1420 num = r2; 1421 if (num) 1422 { 1423 char *dataptr; 1424 1425 if (INT_MAX < num) /* yeah, right */ 1426 num = INT_MAX; 1427 1428 r = BIO_nread(io1, &dataptr, (int)num); 1429 assert(r > 0); 1430 assert(r <= (int)num); 1431 /* possibly r < num (non-contiguous data) */ 1432 num = r; 1433 r = BIO_write(io2, dataptr, (int)num); 1434 if (r != (int)num) /* can't happen */ 1435 { 1436 fprintf(stderr, "ERROR: BIO_write could not write " 1437 "BIO_ctrl_get_write_guarantee() bytes"); 1438 goto err; 1439 } 1440 progress = 1; 1441 1442 if (debug) 1443 printf((io1 == client_io) ? 1444 "C->S relaying: %d bytes\n" : 1445 "S->C relaying: %d bytes\n", 1446 (int)num); 1447 } 1448 } 1449 while (r1 && r2); 1450 1451 /* io2 to io1 */ 1452 { 1453 size_t num; 1454 int r; 1455 1456 r1 = BIO_ctrl_pending(io2); 1457 r2 = BIO_ctrl_get_read_request(io1); 1458 /* here we could use ..._get_write_guarantee instead of 1459 * ..._get_read_request, but by using the latter 1460 * we test restartability of the SSL implementation 1461 * more thoroughly */ 1462 num = r1; 1463 if (r2 < num) 1464 num = r2; 1465 if (num) 1466 { 1467 char *dataptr; 1468 1469 if (INT_MAX < num) 1470 num = INT_MAX; 1471 1472 if (num > 1) 1473 --num; /* test restartability even more thoroughly */ 1474 1475 r = BIO_nwrite0(io1, &dataptr); 1476 assert(r > 0); 1477 if (r < (int)num) 1478 num = r; 1479 r = BIO_read(io2, dataptr, (int)num); 1480 if (r != (int)num) /* can't happen */ 1481 { 1482 fprintf(stderr, "ERROR: BIO_read could not read " 1483 "BIO_ctrl_pending() bytes"); 1484 goto err; 1485 } 1486 progress = 1; 1487 r = BIO_nwrite(io1, &dataptr, (int)num); 1488 if (r != (int)num) /* can't happen */ 1489 { 1490 fprintf(stderr, "ERROR: BIO_nwrite() did not accept " 1491 "BIO_nwrite0() bytes"); 1492 goto err; 1493 } 1494 1495 if (debug) 1496 printf((io2 == client_io) ? 1497 "C->S relaying: %d bytes\n" : 1498 "S->C relaying: %d bytes\n", 1499 (int)num); 1500 } 1501 } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */ 1502 1503 if (!progress && !prev_progress) 1504 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0) 1505 { 1506 fprintf(stderr, "ERROR: got stuck\n"); 1507 if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0) 1508 { 1509 fprintf(stderr, "This can happen for SSL2 because " 1510 "CLIENT-FINISHED and SERVER-VERIFY are written \n" 1511 "concurrently ..."); 1512 if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0 1513 && strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0) 1514 { 1515 fprintf(stderr, " ok.\n"); 1516 goto end; 1517 } 1518 } 1519 fprintf(stderr, " ERROR.\n"); 1520 goto err; 1521 } 1522 prev_progress = progress; 1523 } 1524 } 1525 while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0); 1526 1527 if (verbose) 1528 print_details(c_ssl, "DONE via BIO pair: "); 1529end: 1530 ret = 0; 1531 1532 err: 1533 ERR_print_errors(bio_err); 1534 1535 if (server) 1536 BIO_free(server); 1537 if (server_io) 1538 BIO_free(server_io); 1539 if (client) 1540 BIO_free(client); 1541 if (client_io) 1542 BIO_free(client_io); 1543 if (s_ssl_bio) 1544 BIO_free(s_ssl_bio); 1545 if (c_ssl_bio) 1546 BIO_free(c_ssl_bio); 1547 1548 return ret; 1549 } 1550 1551 1552#define W_READ 1 1553#define W_WRITE 2 1554#define C_DONE 1 1555#define S_DONE 2 1556 1557int doit(SSL *s_ssl, SSL *c_ssl, long count) 1558 { 1559 MS_STATIC char cbuf[1024*8],sbuf[1024*8]; 1560 long cw_num=count,cr_num=count; 1561 long sw_num=count,sr_num=count; 1562 int ret=1; 1563 BIO *c_to_s=NULL; 1564 BIO *s_to_c=NULL; 1565 BIO *c_bio=NULL; 1566 BIO *s_bio=NULL; 1567 int c_r,c_w,s_r,s_w; 1568 int i,j; 1569 int done=0; 1570 int c_write,s_write; 1571 int do_server=0,do_client=0; 1572 1573 memset(cbuf,0,sizeof(cbuf)); 1574 memset(sbuf,0,sizeof(sbuf)); 1575 1576 c_to_s=BIO_new(BIO_s_mem()); 1577 s_to_c=BIO_new(BIO_s_mem()); 1578 if ((s_to_c == NULL) || (c_to_s == NULL)) 1579 { 1580 ERR_print_errors(bio_err); 1581 goto err; 1582 } 1583 1584 c_bio=BIO_new(BIO_f_ssl()); 1585 s_bio=BIO_new(BIO_f_ssl()); 1586 if ((c_bio == NULL) || (s_bio == NULL)) 1587 { 1588 ERR_print_errors(bio_err); 1589 goto err; 1590 } 1591 1592 SSL_set_connect_state(c_ssl); 1593 SSL_set_bio(c_ssl,s_to_c,c_to_s); 1594 BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE); 1595 1596 SSL_set_accept_state(s_ssl); 1597 SSL_set_bio(s_ssl,c_to_s,s_to_c); 1598 BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE); 1599 1600 c_r=0; s_r=1; 1601 c_w=1; s_w=0; 1602 c_write=1,s_write=0; 1603 1604 /* We can always do writes */ 1605 for (;;) 1606 { 1607 do_server=0; 1608 do_client=0; 1609 1610 i=(int)BIO_pending(s_bio); 1611 if ((i && s_r) || s_w) do_server=1; 1612 1613 i=(int)BIO_pending(c_bio); 1614 if ((i && c_r) || c_w) do_client=1; 1615 1616 if (do_server && debug) 1617 { 1618 if (SSL_in_init(s_ssl)) 1619 printf("server waiting in SSL_accept - %s\n", 1620 SSL_state_string_long(s_ssl)); 1621/* else if (s_write) 1622 printf("server:SSL_write()\n"); 1623 else 1624 printf("server:SSL_read()\n"); */ 1625 } 1626 1627 if (do_client && debug) 1628 { 1629 if (SSL_in_init(c_ssl)) 1630 printf("client waiting in SSL_connect - %s\n", 1631 SSL_state_string_long(c_ssl)); 1632/* else if (c_write) 1633 printf("client:SSL_write()\n"); 1634 else 1635 printf("client:SSL_read()\n"); */ 1636 } 1637 1638 if (!do_client && !do_server) 1639 { 1640 fprintf(stdout,"ERROR IN STARTUP\n"); 1641 ERR_print_errors(bio_err); 1642 break; 1643 } 1644 if (do_client && !(done & C_DONE)) 1645 { 1646 if (c_write) 1647 { 1648 j = (cw_num > (long)sizeof(cbuf)) ? 1649 (int)sizeof(cbuf) : (int)cw_num; 1650 i=BIO_write(c_bio,cbuf,j); 1651 if (i < 0) 1652 { 1653 c_r=0; 1654 c_w=0; 1655 if (BIO_should_retry(c_bio)) 1656 { 1657 if (BIO_should_read(c_bio)) 1658 c_r=1; 1659 if (BIO_should_write(c_bio)) 1660 c_w=1; 1661 } 1662 else 1663 { 1664 fprintf(stderr,"ERROR in CLIENT\n"); 1665 ERR_print_errors(bio_err); 1666 goto err; 1667 } 1668 } 1669 else if (i == 0) 1670 { 1671 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n"); 1672 goto err; 1673 } 1674 else 1675 { 1676 if (debug) 1677 printf("client wrote %d\n",i); 1678 /* ok */ 1679 s_r=1; 1680 c_write=0; 1681 cw_num-=i; 1682 } 1683 } 1684 else 1685 { 1686 i=BIO_read(c_bio,cbuf,sizeof(cbuf)); 1687 if (i < 0) 1688 { 1689 c_r=0; 1690 c_w=0; 1691 if (BIO_should_retry(c_bio)) 1692 { 1693 if (BIO_should_read(c_bio)) 1694 c_r=1; 1695 if (BIO_should_write(c_bio)) 1696 c_w=1; 1697 } 1698 else 1699 { 1700 fprintf(stderr,"ERROR in CLIENT\n"); 1701 ERR_print_errors(bio_err); 1702 goto err; 1703 } 1704 } 1705 else if (i == 0) 1706 { 1707 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n"); 1708 goto err; 1709 } 1710 else 1711 { 1712 if (debug) 1713 printf("client read %d\n",i); 1714 cr_num-=i; 1715 if (sw_num > 0) 1716 { 1717 s_write=1; 1718 s_w=1; 1719 } 1720 if (cr_num <= 0) 1721 { 1722 s_write=1; 1723 s_w=1; 1724 done=S_DONE|C_DONE; 1725 } 1726 } 1727 } 1728 } 1729 1730 if (do_server && !(done & S_DONE)) 1731 { 1732 if (!s_write) 1733 { 1734 i=BIO_read(s_bio,sbuf,sizeof(cbuf)); 1735 if (i < 0) 1736 { 1737 s_r=0; 1738 s_w=0; 1739 if (BIO_should_retry(s_bio)) 1740 { 1741 if (BIO_should_read(s_bio)) 1742 s_r=1; 1743 if (BIO_should_write(s_bio)) 1744 s_w=1; 1745 } 1746 else 1747 { 1748 fprintf(stderr,"ERROR in SERVER\n"); 1749 ERR_print_errors(bio_err); 1750 goto err; 1751 } 1752 } 1753 else if (i == 0) 1754 { 1755 ERR_print_errors(bio_err); 1756 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n"); 1757 goto err; 1758 } 1759 else 1760 { 1761 if (debug) 1762 printf("server read %d\n",i); 1763 sr_num-=i; 1764 if (cw_num > 0) 1765 { 1766 c_write=1; 1767 c_w=1; 1768 } 1769 if (sr_num <= 0) 1770 { 1771 s_write=1; 1772 s_w=1; 1773 c_write=0; 1774 } 1775 } 1776 } 1777 else 1778 { 1779 j = (sw_num > (long)sizeof(sbuf)) ? 1780 (int)sizeof(sbuf) : (int)sw_num; 1781 i=BIO_write(s_bio,sbuf,j); 1782 if (i < 0) 1783 { 1784 s_r=0; 1785 s_w=0; 1786 if (BIO_should_retry(s_bio)) 1787 { 1788 if (BIO_should_read(s_bio)) 1789 s_r=1; 1790 if (BIO_should_write(s_bio)) 1791 s_w=1; 1792 } 1793 else 1794 { 1795 fprintf(stderr,"ERROR in SERVER\n"); 1796 ERR_print_errors(bio_err); 1797 goto err; 1798 } 1799 } 1800 else if (i == 0) 1801 { 1802 ERR_print_errors(bio_err); 1803 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n"); 1804 goto err; 1805 } 1806 else 1807 { 1808 if (debug) 1809 printf("server wrote %d\n",i); 1810 sw_num-=i; 1811 s_write=0; 1812 c_r=1; 1813 if (sw_num <= 0) 1814 done|=S_DONE; 1815 } 1816 } 1817 } 1818 1819 if ((done & S_DONE) && (done & C_DONE)) break; 1820 } 1821 1822 if (verbose) 1823 print_details(c_ssl, "DONE: "); 1824 ret=0; 1825err: 1826 /* We have to set the BIO's to NULL otherwise they will be 1827 * OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and 1828 * again when c_ssl is SSL_free()ed. 1829 * This is a hack required because s_ssl and c_ssl are sharing the same 1830 * BIO structure and SSL_set_bio() and SSL_free() automatically 1831 * BIO_free non NULL entries. 1832 * You should not normally do this or be required to do this */ 1833 if (s_ssl != NULL) 1834 { 1835 s_ssl->rbio=NULL; 1836 s_ssl->wbio=NULL; 1837 } 1838 if (c_ssl != NULL) 1839 { 1840 c_ssl->rbio=NULL; 1841 c_ssl->wbio=NULL; 1842 } 1843 1844 if (c_to_s != NULL) BIO_free(c_to_s); 1845 if (s_to_c != NULL) BIO_free(s_to_c); 1846 if (c_bio != NULL) BIO_free_all(c_bio); 1847 if (s_bio != NULL) BIO_free_all(s_bio); 1848 return(ret); 1849 } 1850 1851static int get_proxy_auth_ex_data_idx(void) 1852 { 1853 static volatile int idx = -1; 1854 if (idx < 0) 1855 { 1856 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 1857 if (idx < 0) 1858 { 1859 idx = X509_STORE_CTX_get_ex_new_index(0, 1860 "SSLtest for verify callback", NULL,NULL,NULL); 1861 } 1862 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 1863 } 1864 return idx; 1865 } 1866 1867static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx) 1868 { 1869 char *s,buf[256]; 1870 1871 s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf, 1872 sizeof buf); 1873 if (s != NULL) 1874 { 1875 if (ok) 1876 fprintf(stderr,"depth=%d %s\n", 1877 ctx->error_depth,buf); 1878 else 1879 { 1880 fprintf(stderr,"depth=%d error=%d %s\n", 1881 ctx->error_depth,ctx->error,buf); 1882 } 1883 } 1884 1885 if (ok == 0) 1886 { 1887 fprintf(stderr,"Error string: %s\n", 1888 X509_verify_cert_error_string(ctx->error)); 1889 switch (ctx->error) 1890 { 1891 case X509_V_ERR_CERT_NOT_YET_VALID: 1892 case X509_V_ERR_CERT_HAS_EXPIRED: 1893 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: 1894 fprintf(stderr," ... ignored.\n"); 1895 ok=1; 1896 } 1897 } 1898 1899 if (ok == 1) 1900 { 1901 X509 *xs = ctx->current_cert; 1902#if 0 1903 X509 *xi = ctx->current_issuer; 1904#endif 1905 1906 if (xs->ex_flags & EXFLAG_PROXY) 1907 { 1908 unsigned int *letters = 1909 X509_STORE_CTX_get_ex_data(ctx, 1910 get_proxy_auth_ex_data_idx()); 1911 1912 if (letters) 1913 { 1914 int found_any = 0; 1915 int i; 1916 PROXY_CERT_INFO_EXTENSION *pci = 1917 X509_get_ext_d2i(xs, NID_proxyCertInfo, 1918 NULL, NULL); 1919 1920 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage)) 1921 { 1922 case NID_Independent: 1923 /* Completely meaningless in this 1924 program, as there's no way to 1925 grant explicit rights to a 1926 specific PrC. Basically, using 1927 id-ppl-Independent is the perfect 1928 way to grant no rights at all. */ 1929 fprintf(stderr, " Independent proxy certificate"); 1930 for (i = 0; i < 26; i++) 1931 letters[i] = 0; 1932 break; 1933 case NID_id_ppl_inheritAll: 1934 /* This is basically a NOP, we 1935 simply let the current rights 1936 stand as they are. */ 1937 fprintf(stderr, " Proxy certificate inherits all"); 1938 break; 1939 default: 1940 s = (char *) 1941 pci->proxyPolicy->policy->data; 1942 i = pci->proxyPolicy->policy->length; 1943 1944 /* The algorithm works as follows: 1945 it is assumed that previous 1946 iterations or the initial granted 1947 rights has already set some elements 1948 of `letters'. What we need to do is 1949 to clear those that weren't granted 1950 by the current PrC as well. The 1951 easiest way to do this is to add 1 1952 to all the elements whose letters 1953 are given with the current policy. 1954 That way, all elements that are set 1955 by the current policy and were 1956 already set by earlier policies and 1957 through the original grant of rights 1958 will get the value 2 or higher. 1959 The last thing to do is to sweep 1960 through `letters' and keep the 1961 elements having the value 2 as set, 1962 and clear all the others. */ 1963 1964 fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s); 1965 while(i-- > 0) 1966 { 1967 int c = *s++; 1968 if (isascii(c) && isalpha(c)) 1969 { 1970 if (islower(c)) 1971 c = toupper(c); 1972 letters[c - 'A']++; 1973 } 1974 } 1975 for (i = 0; i < 26; i++) 1976 if (letters[i] < 2) 1977 letters[i] = 0; 1978 else 1979 letters[i] = 1; 1980 } 1981 1982 found_any = 0; 1983 fprintf(stderr, 1984 ", resulting proxy rights = "); 1985 for(i = 0; i < 26; i++) 1986 if (letters[i]) 1987 { 1988 fprintf(stderr, "%c", i + 'A'); 1989 found_any = 1; 1990 } 1991 if (!found_any) 1992 fprintf(stderr, "none"); 1993 fprintf(stderr, "\n"); 1994 1995 PROXY_CERT_INFO_EXTENSION_free(pci); 1996 } 1997 } 1998 } 1999 2000 return(ok); 2001 } 2002 2003static void process_proxy_debug(int indent, const char *format, ...) 2004 { 2005 static const char indentation[] = 2006 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 2007 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */ 2008 char my_format[256]; 2009 va_list args; 2010 2011 BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s", 2012 indent, indent, indentation, format); 2013 2014 va_start(args, format); 2015 vfprintf(stderr, my_format, args); 2016 va_end(args); 2017 } 2018/* Priority levels: 2019 0 [!]var, () 2020 1 & ^ 2021 2 | 2022*/ 2023static int process_proxy_cond_adders(unsigned int letters[26], 2024 const char *cond, const char **cond_end, int *pos, int indent); 2025static int process_proxy_cond_val(unsigned int letters[26], 2026 const char *cond, const char **cond_end, int *pos, int indent) 2027 { 2028 int c; 2029 int ok = 1; 2030 int negate = 0; 2031 2032 while(isspace((int)*cond)) 2033 { 2034 cond++; (*pos)++; 2035 } 2036 c = *cond; 2037 2038 if (debug) 2039 process_proxy_debug(indent, 2040 "Start process_proxy_cond_val at position %d: %s\n", 2041 *pos, cond); 2042 2043 while(c == '!') 2044 { 2045 negate = !negate; 2046 cond++; (*pos)++; 2047 while(isspace((int)*cond)) 2048 { 2049 cond++; (*pos)++; 2050 } 2051 c = *cond; 2052 } 2053 2054 if (c == '(') 2055 { 2056 cond++; (*pos)++; 2057 ok = process_proxy_cond_adders(letters, cond, cond_end, pos, 2058 indent + 1); 2059 cond = *cond_end; 2060 if (ok < 0) 2061 goto end; 2062 while(isspace((int)*cond)) 2063 { 2064 cond++; (*pos)++; 2065 } 2066 c = *cond; 2067 if (c != ')') 2068 { 2069 fprintf(stderr, 2070 "Weird condition character in position %d: " 2071 "%c\n", *pos, c); 2072 ok = -1; 2073 goto end; 2074 } 2075 cond++; (*pos)++; 2076 } 2077 else if (isascii(c) && isalpha(c)) 2078 { 2079 if (islower(c)) 2080 c = toupper(c); 2081 ok = letters[c - 'A']; 2082 cond++; (*pos)++; 2083 } 2084 else 2085 { 2086 fprintf(stderr, 2087 "Weird condition character in position %d: " 2088 "%c\n", *pos, c); 2089 ok = -1; 2090 goto end; 2091 } 2092 end: 2093 *cond_end = cond; 2094 if (ok >= 0 && negate) 2095 ok = !ok; 2096 2097 if (debug) 2098 process_proxy_debug(indent, 2099 "End process_proxy_cond_val at position %d: %s, returning %d\n", 2100 *pos, cond, ok); 2101 2102 return ok; 2103 } 2104static int process_proxy_cond_multipliers(unsigned int letters[26], 2105 const char *cond, const char **cond_end, int *pos, int indent) 2106 { 2107 int ok; 2108 char c; 2109 2110 if (debug) 2111 process_proxy_debug(indent, 2112 "Start process_proxy_cond_multipliers at position %d: %s\n", 2113 *pos, cond); 2114 2115 ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1); 2116 cond = *cond_end; 2117 if (ok < 0) 2118 goto end; 2119 2120 while(ok >= 0) 2121 { 2122 while(isspace((int)*cond)) 2123 { 2124 cond++; (*pos)++; 2125 } 2126 c = *cond; 2127 2128 switch(c) 2129 { 2130 case '&': 2131 case '^': 2132 { 2133 int save_ok = ok; 2134 2135 cond++; (*pos)++; 2136 ok = process_proxy_cond_val(letters, 2137 cond, cond_end, pos, indent + 1); 2138 cond = *cond_end; 2139 if (ok < 0) 2140 break; 2141 2142 switch(c) 2143 { 2144 case '&': 2145 ok &= save_ok; 2146 break; 2147 case '^': 2148 ok ^= save_ok; 2149 break; 2150 default: 2151 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!" 2152 " STOPPING\n"); 2153 EXIT(1); 2154 } 2155 } 2156 break; 2157 default: 2158 goto end; 2159 } 2160 } 2161 end: 2162 if (debug) 2163 process_proxy_debug(indent, 2164 "End process_proxy_cond_multipliers at position %d: %s, returning %d\n", 2165 *pos, cond, ok); 2166 2167 *cond_end = cond; 2168 return ok; 2169 } 2170static int process_proxy_cond_adders(unsigned int letters[26], 2171 const char *cond, const char **cond_end, int *pos, int indent) 2172 { 2173 int ok; 2174 char c; 2175 2176 if (debug) 2177 process_proxy_debug(indent, 2178 "Start process_proxy_cond_adders at position %d: %s\n", 2179 *pos, cond); 2180 2181 ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos, 2182 indent + 1); 2183 cond = *cond_end; 2184 if (ok < 0) 2185 goto end; 2186 2187 while(ok >= 0) 2188 { 2189 while(isspace((int)*cond)) 2190 { 2191 cond++; (*pos)++; 2192 } 2193 c = *cond; 2194 2195 switch(c) 2196 { 2197 case '|': 2198 { 2199 int save_ok = ok; 2200 2201 cond++; (*pos)++; 2202 ok = process_proxy_cond_multipliers(letters, 2203 cond, cond_end, pos, indent + 1); 2204 cond = *cond_end; 2205 if (ok < 0) 2206 break; 2207 2208 switch(c) 2209 { 2210 case '|': 2211 ok |= save_ok; 2212 break; 2213 default: 2214 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!" 2215 " STOPPING\n"); 2216 EXIT(1); 2217 } 2218 } 2219 break; 2220 default: 2221 goto end; 2222 } 2223 } 2224 end: 2225 if (debug) 2226 process_proxy_debug(indent, 2227 "End process_proxy_cond_adders at position %d: %s, returning %d\n", 2228 *pos, cond, ok); 2229 2230 *cond_end = cond; 2231 return ok; 2232 } 2233 2234static int process_proxy_cond(unsigned int letters[26], 2235 const char *cond, const char **cond_end) 2236 { 2237 int pos = 1; 2238 return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1); 2239 } 2240 2241static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg) 2242 { 2243 int ok=1; 2244 struct app_verify_arg *cb_arg = arg; 2245 unsigned int letters[26]; /* only used with proxy_auth */ 2246 2247 if (cb_arg->app_verify) 2248 { 2249 char *s = NULL,buf[256]; 2250 2251 fprintf(stderr, "In app_verify_callback, allowing cert. "); 2252 fprintf(stderr, "Arg is: %s\n", cb_arg->string); 2253 fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n", 2254 (void *)ctx, (void *)ctx->cert); 2255 if (ctx->cert) 2256 s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256); 2257 if (s != NULL) 2258 { 2259 fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf); 2260 } 2261 return(1); 2262 } 2263 if (cb_arg->proxy_auth) 2264 { 2265 int found_any = 0, i; 2266 char *sp; 2267 2268 for(i = 0; i < 26; i++) 2269 letters[i] = 0; 2270 for(sp = cb_arg->proxy_auth; *sp; sp++) 2271 { 2272 int c = *sp; 2273 if (isascii(c) && isalpha(c)) 2274 { 2275 if (islower(c)) 2276 c = toupper(c); 2277 letters[c - 'A'] = 1; 2278 } 2279 } 2280 2281 fprintf(stderr, 2282 " Initial proxy rights = "); 2283 for(i = 0; i < 26; i++) 2284 if (letters[i]) 2285 { 2286 fprintf(stderr, "%c", i + 'A'); 2287 found_any = 1; 2288 } 2289 if (!found_any) 2290 fprintf(stderr, "none"); 2291 fprintf(stderr, "\n"); 2292 2293 X509_STORE_CTX_set_ex_data(ctx, 2294 get_proxy_auth_ex_data_idx(),letters); 2295 } 2296 if (cb_arg->allow_proxy_certs) 2297 { 2298 X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS); 2299 } 2300 2301#ifndef OPENSSL_NO_X509_VERIFY 2302 ok = X509_verify_cert(ctx); 2303#endif 2304 2305 if (cb_arg->proxy_auth) 2306 { 2307 if (ok > 0) 2308 { 2309 const char *cond_end = NULL; 2310 2311 ok = process_proxy_cond(letters, 2312 cb_arg->proxy_cond, &cond_end); 2313 2314 if (ok < 0) 2315 EXIT(3); 2316 if (*cond_end) 2317 { 2318 fprintf(stderr, "Stopped processing condition before it's end.\n"); 2319 ok = 0; 2320 } 2321 if (!ok) 2322 fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n", 2323 cb_arg->proxy_cond); 2324 else 2325 fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n", 2326 cb_arg->proxy_cond); 2327 } 2328 } 2329 return(ok); 2330 } 2331 2332#ifndef OPENSSL_NO_RSA 2333static RSA *rsa_tmp=NULL; 2334 2335static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength) 2336 { 2337 BIGNUM *bn = NULL; 2338 if (rsa_tmp == NULL) 2339 { 2340 bn = BN_new(); 2341 rsa_tmp = RSA_new(); 2342 if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4)) 2343 { 2344 BIO_printf(bio_err, "Memory error..."); 2345 goto end; 2346 } 2347 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength); 2348 (void)BIO_flush(bio_err); 2349 if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL)) 2350 { 2351 BIO_printf(bio_err, "Error generating key."); 2352 RSA_free(rsa_tmp); 2353 rsa_tmp = NULL; 2354 } 2355end: 2356 BIO_printf(bio_err,"\n"); 2357 (void)BIO_flush(bio_err); 2358 } 2359 if(bn) BN_free(bn); 2360 return(rsa_tmp); 2361 } 2362 2363static void free_tmp_rsa(void) 2364 { 2365 if (rsa_tmp != NULL) 2366 { 2367 RSA_free(rsa_tmp); 2368 rsa_tmp = NULL; 2369 } 2370 } 2371#endif 2372 2373#ifndef OPENSSL_NO_DH 2374/* These DH parameters have been generated as follows: 2375 * $ openssl dhparam -C -noout 512 2376 * $ openssl dhparam -C -noout 1024 2377 * $ openssl dhparam -C -noout -dsaparam 1024 2378 * (The third function has been renamed to avoid name conflicts.) 2379 */ 2380static DH *get_dh512() 2381 { 2382 static unsigned char dh512_p[]={ 2383 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6, 2384 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0, 2385 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F, 2386 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8, 2387 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33, 2388 0x02,0xC5,0xAE,0x23, 2389 }; 2390 static unsigned char dh512_g[]={ 2391 0x02, 2392 }; 2393 DH *dh; 2394 2395 if ((dh=DH_new()) == NULL) return(NULL); 2396 dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL); 2397 dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL); 2398 if ((dh->p == NULL) || (dh->g == NULL)) 2399 { DH_free(dh); return(NULL); } 2400 return(dh); 2401 } 2402 2403static DH *get_dh1024() 2404 { 2405 static unsigned char dh1024_p[]={ 2406 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A, 2407 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2, 2408 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0, 2409 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2, 2410 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C, 2411 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8, 2412 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52, 2413 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1, 2414 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1, 2415 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB, 2416 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53, 2417 }; 2418 static unsigned char dh1024_g[]={ 2419 0x02, 2420 }; 2421 DH *dh; 2422 2423 if ((dh=DH_new()) == NULL) return(NULL); 2424 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); 2425 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); 2426 if ((dh->p == NULL) || (dh->g == NULL)) 2427 { DH_free(dh); return(NULL); } 2428 return(dh); 2429 } 2430 2431static DH *get_dh1024dsa() 2432 { 2433 static unsigned char dh1024_p[]={ 2434 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00, 2435 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19, 2436 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2, 2437 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55, 2438 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC, 2439 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97, 2440 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D, 2441 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB, 2442 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6, 2443 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E, 2444 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39, 2445 }; 2446 static unsigned char dh1024_g[]={ 2447 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05, 2448 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3, 2449 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9, 2450 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C, 2451 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65, 2452 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60, 2453 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6, 2454 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7, 2455 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1, 2456 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60, 2457 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2, 2458 }; 2459 DH *dh; 2460 2461 if ((dh=DH_new()) == NULL) return(NULL); 2462 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); 2463 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); 2464 if ((dh->p == NULL) || (dh->g == NULL)) 2465 { DH_free(dh); return(NULL); } 2466 dh->length = 160; 2467 return(dh); 2468 } 2469#endif 2470 2471#ifndef OPENSSL_NO_PSK 2472/* convert the PSK key (psk_key) in ascii to binary (psk) */ 2473static int psk_key2bn(const char *pskkey, unsigned char *psk, 2474 unsigned int max_psk_len) 2475 { 2476 int ret; 2477 BIGNUM *bn = NULL; 2478 2479 ret = BN_hex2bn(&bn, pskkey); 2480 if (!ret) 2481 { 2482 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey); 2483 if (bn) 2484 BN_free(bn); 2485 return 0; 2486 } 2487 if (BN_num_bytes(bn) > (int)max_psk_len) 2488 { 2489 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n", 2490 max_psk_len, BN_num_bytes(bn)); 2491 BN_free(bn); 2492 return 0; 2493 } 2494 ret = BN_bn2bin(bn, psk); 2495 BN_free(bn); 2496 return ret; 2497 } 2498 2499static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity, 2500 unsigned int max_identity_len, unsigned char *psk, 2501 unsigned int max_psk_len) 2502 { 2503 int ret; 2504 unsigned int psk_len = 0; 2505 2506 ret = BIO_snprintf(identity, max_identity_len, "Client_identity"); 2507 if (ret < 0) 2508 goto out_err; 2509 if (debug) 2510 fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret); 2511 ret = psk_key2bn(psk_key, psk, max_psk_len); 2512 if (ret < 0) 2513 goto out_err; 2514 psk_len = ret; 2515out_err: 2516 return psk_len; 2517 } 2518 2519static unsigned int psk_server_callback(SSL *ssl, const char *identity, 2520 unsigned char *psk, unsigned int max_psk_len) 2521 { 2522 unsigned int psk_len=0; 2523 2524 if (strcmp(identity, "Client_identity") != 0) 2525 { 2526 BIO_printf(bio_err, "server: PSK error: client identity not found\n"); 2527 return 0; 2528 } 2529 psk_len=psk_key2bn(psk_key, psk, max_psk_len); 2530 return psk_len; 2531 } 2532#endif 2533 2534static int do_test_cipherlist(void) 2535 { 2536 int i = 0; 2537 const SSL_METHOD *meth; 2538 const SSL_CIPHER *ci, *tci = NULL; 2539 2540#ifndef OPENSSL_NO_SSL2 2541 fprintf(stderr, "testing SSLv2 cipher list order: "); 2542 meth = SSLv2_method(); 2543 while ((ci = meth->get_cipher(i++)) != NULL) 2544 { 2545 if (tci != NULL) 2546 if (ci->id >= tci->id) 2547 { 2548 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); 2549 return 0; 2550 } 2551 tci = ci; 2552 } 2553 fprintf(stderr, "ok\n"); 2554#endif 2555#ifndef OPENSSL_NO_SSL3 2556 fprintf(stderr, "testing SSLv3 cipher list order: "); 2557 meth = SSLv3_method(); 2558 tci = NULL; 2559 while ((ci = meth->get_cipher(i++)) != NULL) 2560 { 2561 if (tci != NULL) 2562 if (ci->id >= tci->id) 2563 { 2564 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); 2565 return 0; 2566 } 2567 tci = ci; 2568 } 2569 fprintf(stderr, "ok\n"); 2570#endif 2571#ifndef OPENSSL_NO_TLS1 2572 fprintf(stderr, "testing TLSv1 cipher list order: "); 2573 meth = TLSv1_method(); 2574 tci = NULL; 2575 while ((ci = meth->get_cipher(i++)) != NULL) 2576 { 2577 if (tci != NULL) 2578 if (ci->id >= tci->id) 2579 { 2580 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); 2581 return 0; 2582 } 2583 tci = ci; 2584 } 2585 fprintf(stderr, "ok\n"); 2586#endif 2587 2588 return 1; 2589 } 2590