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