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