2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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.
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).
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.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
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)"
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
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.]
58 /* ====================================================================
59 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
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
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/)"
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.
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.
87 * 6. Redistributions of any form whatsoever must retain the following
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
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 * ====================================================================
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).
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.
116 /* ====================================================================
117 * Copyright 2005 Nokia. All rights reserved.
119 * The portions of the attached software ("Contribution") is developed by
120 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
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.
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.
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.
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
143 #define _BSD_SOURCE 1 /* Or gethostname won't be declared properly
144 on Linux and GNU platforms. */
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). */
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>
173 #include <openssl/err.h>
174 #include <openssl/rand.h>
175 #ifndef OPENSSL_NO_RSA
176 #include <openssl/rsa.h>
178 #ifndef OPENSSL_NO_DSA
179 #include <openssl/dsa.h>
181 #ifndef OPENSSL_NO_DH
182 #include <openssl/dh.h>
184 #ifndef OPENSSL_NO_SRP
185 #include <openssl/srp.h>
187 #include <openssl/bn.h>
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
195 #ifdef OPENSSL_SYS_WINDOWS
198 #include OPENSSL_UNISTD
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"
211 # define TEST_SERVER_CERT "../apps/server.pem"
212 # define TEST_CLIENT_CERT "../apps/client.pem"
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 */
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);
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
231 int allow_proxy_certs;
236 #ifndef OPENSSL_NO_DH
237 static DH *get_dh512(void);
238 static DH *get_dh1024(void);
239 static DH *get_dh1024dsa(void);
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);
252 #ifndef OPENSSL_NO_SRP
254 /* This is a context that we pass to all callbacks */
255 typedef struct srp_client_arg_st
261 #define PWD_STRLEN 1024
263 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
265 SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
266 return BUF_strdup((char *)srp_client_arg->srppassin);
270 /* This is a context that we pass to SRP server callbacks */
271 typedef struct srp_server_arg_st
277 static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
279 SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;
281 if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0)
283 fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s));
284 return SSL3_AL_FATAL;
286 if (SSL_set_srp_server_param_pw(s,p->expected_user,p->pass,"1024")<0)
288 *ad = SSL_AD_INTERNAL_ERROR;
289 return SSL3_AL_FATAL;
291 return SSL_ERROR_NONE;
295 static BIO *bio_err=NULL;
296 static BIO *bio_stdout=NULL;
298 #define SCT_EXT_TYPE 18
300 /* WARNING : below extension types are *NOT* IETF assigned, and
301 could conflict if these types are reassigned and handled
302 specially by OpenSSL in the future */
303 #define TACK_EXT_TYPE 62208
304 #define CUSTOM_EXT_TYPE_0 1000
305 #define CUSTOM_EXT_TYPE_1 1001
306 #define CUSTOM_EXT_TYPE_2 1002
307 #define CUSTOM_EXT_TYPE_3 1003
309 const char custom_ext_cli_string[] = "abc";
310 const char custom_ext_srv_string[] = "defg";
312 /* These set from cmdline */
313 char* serverinfo_file = NULL;
314 int serverinfo_sct = 0;
315 int serverinfo_tack = 0;
317 /* These set based on extension callbacks */
318 int serverinfo_sct_seen = 0;
319 int serverinfo_tack_seen = 0;
320 int serverinfo_other_seen = 0;
322 /* This set from cmdline */
325 /* This set based on extension callbacks */
326 int custom_ext_error = 0;
328 static int serverinfo_cli_cb(SSL* s, unsigned short ext_type,
329 const unsigned char* in, unsigned short inlen,
332 if (ext_type == SCT_EXT_TYPE)
333 serverinfo_sct_seen++;
334 else if (ext_type == TACK_EXT_TYPE)
335 serverinfo_tack_seen++;
337 serverinfo_other_seen++;
341 static int verify_serverinfo()
343 if (serverinfo_sct != serverinfo_sct_seen)
345 if (serverinfo_tack != serverinfo_tack_seen)
347 if (serverinfo_other_seen)
352 /* Four test cases for custom extensions:
353 * 0 - no ClientHello extension or ServerHello response
354 * 1 - ClientHello with "abc", no response
355 * 2 - ClientHello with "abc", empty response
356 * 3 - ClientHello with "abc", "defg" response
359 static int custom_ext_0_cli_first_cb(SSL *s, unsigned short ext_type,
360 const unsigned char **out,
361 unsigned short *outlen, void *arg)
363 if (ext_type != CUSTOM_EXT_TYPE_0)
364 custom_ext_error = 1;
365 return -1; /* Don't send an extension */
368 static int custom_ext_0_cli_second_cb(SSL *s, unsigned short ext_type,
369 const unsigned char *in,
370 unsigned short inlen, int *al,
373 custom_ext_error = 1; /* Shouldn't be called */
377 static int custom_ext_1_cli_first_cb(SSL *s, unsigned short ext_type,
378 const unsigned char **out,
379 unsigned short *outlen, void *arg)
381 if (ext_type != CUSTOM_EXT_TYPE_1)
382 custom_ext_error = 1;
383 *out = (const unsigned char*)custom_ext_cli_string;
384 *outlen = strlen(custom_ext_cli_string);
385 return 1; /* Send "abc" */
388 static int custom_ext_1_cli_second_cb(SSL *s, unsigned short ext_type,
389 const unsigned char *in,
390 unsigned short inlen, int *al,
393 custom_ext_error = 1; /* Shouldn't be called */
397 static int custom_ext_2_cli_first_cb(SSL *s, unsigned short ext_type,
398 const unsigned char **out,
399 unsigned short *outlen, void *arg)
401 if (ext_type != CUSTOM_EXT_TYPE_2)
402 custom_ext_error = 1;
403 *out = (const unsigned char*)custom_ext_cli_string;
404 *outlen = strlen(custom_ext_cli_string);
405 return 1; /* Send "abc" */
408 static int custom_ext_2_cli_second_cb(SSL *s, unsigned short ext_type,
409 const unsigned char *in,
410 unsigned short inlen, int *al,
413 if (ext_type != CUSTOM_EXT_TYPE_2)
414 custom_ext_error = 1;
416 custom_ext_error = 1; /* Should be empty response */
420 static int custom_ext_3_cli_first_cb(SSL *s, unsigned short ext_type,
421 const unsigned char **out,
422 unsigned short *outlen, void *arg)
424 if (ext_type != CUSTOM_EXT_TYPE_3)
425 custom_ext_error = 1;
426 *out = (const unsigned char*)custom_ext_cli_string;
427 *outlen = strlen(custom_ext_cli_string);
428 return 1; /* Send "abc" */
431 static int custom_ext_3_cli_second_cb(SSL *s, unsigned short ext_type,
432 const unsigned char *in,
433 unsigned short inlen, int *al,
436 if (ext_type != CUSTOM_EXT_TYPE_3)
437 custom_ext_error = 1;
438 if (inlen != strlen(custom_ext_srv_string))
439 custom_ext_error = 1;
440 if (memcmp(custom_ext_srv_string, in, inlen) != 0)
441 custom_ext_error = 1; /* Check for "defg" */
446 static int custom_ext_0_srv_first_cb(SSL *s, unsigned short ext_type,
447 const unsigned char *in,
448 unsigned short inlen, int *al,
451 custom_ext_error = 1;
452 return 0; /* Shouldn't be called */
455 static int custom_ext_0_srv_second_cb(SSL *s, unsigned short ext_type,
456 const unsigned char **out,
457 unsigned short *outlen, void *arg)
459 custom_ext_error = 1;
460 return 0; /* Shouldn't be called */
463 static int custom_ext_1_srv_first_cb(SSL *s, unsigned short ext_type,
464 const unsigned char *in,
465 unsigned short inlen, int *al,
468 if (ext_type != CUSTOM_EXT_TYPE_1)
469 custom_ext_error = 1;
470 /* Check for "abc" */
471 if (inlen != strlen(custom_ext_cli_string))
472 custom_ext_error = 1;
473 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
474 custom_ext_error = 1;
478 static int custom_ext_1_srv_second_cb(SSL *s, unsigned short ext_type,
479 const unsigned char **out,
480 unsigned short *outlen, void *arg)
482 return -1; /* Don't send an extension */
485 static int custom_ext_2_srv_first_cb(SSL *s, unsigned short ext_type,
486 const unsigned char *in,
487 unsigned short inlen, int *al,
490 if (ext_type != CUSTOM_EXT_TYPE_2)
491 custom_ext_error = 1;
492 /* Check for "abc" */
493 if (inlen != strlen(custom_ext_cli_string))
494 custom_ext_error = 1;
495 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
496 custom_ext_error = 1;
500 static int custom_ext_2_srv_second_cb(SSL *s, unsigned short ext_type,
501 const unsigned char **out,
502 unsigned short *outlen, void *arg)
506 return 1; /* Send empty extension */
509 static int custom_ext_3_srv_first_cb(SSL *s, unsigned short ext_type,
510 const unsigned char *in,
511 unsigned short inlen, int *al,
514 if (ext_type != CUSTOM_EXT_TYPE_3)
515 custom_ext_error = 1;
516 /* Check for "abc" */
517 if (inlen != strlen(custom_ext_cli_string))
518 custom_ext_error = 1;
519 if (memcmp(in, custom_ext_cli_string, inlen) != 0)
520 custom_ext_error = 1;
524 static int custom_ext_3_srv_second_cb(SSL *s, unsigned short ext_type,
525 const unsigned char **out,
526 unsigned short *outlen, void *arg)
528 *out = (const unsigned char*)custom_ext_srv_string;
529 *outlen = strlen(custom_ext_srv_string);
530 return 1; /* Send "defg" */
534 static char *cipher=NULL;
535 static int verbose=0;
544 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
546 int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
547 int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
548 static int do_test_cipherlist(void);
549 static void sv_usage(void)
551 fprintf(stderr,"usage: ssltest [args ...]\n");
552 fprintf(stderr,"\n");
554 fprintf(stderr,"-F - run test in FIPS mode\n");
556 fprintf(stderr," -server_auth - check server certificate\n");
557 fprintf(stderr," -client_auth - do client authentication\n");
558 fprintf(stderr," -proxy - allow proxy certificates\n");
559 fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
560 fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
561 fprintf(stderr," -v - more output\n");
562 fprintf(stderr," -d - debug output\n");
563 fprintf(stderr," -reuse - use session-id reuse\n");
564 fprintf(stderr," -num <val> - number of connections to perform\n");
565 fprintf(stderr," -bytes <val> - number of bytes to swap between client/server\n");
566 #ifndef OPENSSL_NO_DH
567 fprintf(stderr," -dhe1024 - use 1024 bit key (safe prime) for DHE\n");
568 fprintf(stderr," -dhe1024dsa - use 1024 bit key (with 160-bit subprime) for DHE\n");
569 fprintf(stderr," -no_dhe - disable DHE\n");
571 #ifndef OPENSSL_NO_ECDH
572 fprintf(stderr," -no_ecdhe - disable ECDHE\n");
574 #ifndef OPENSSL_NO_PSK
575 fprintf(stderr," -psk arg - PSK in hex (without 0x)\n");
577 #ifndef OPENSSL_NO_SRP
578 fprintf(stderr," -srpuser user - SRP username to use\n");
579 fprintf(stderr," -srppass arg - password for 'user'\n");
581 #ifndef OPENSSL_NO_SSL2
582 fprintf(stderr," -ssl2 - use SSLv2\n");
584 #ifndef OPENSSL_NO_SSL3
585 fprintf(stderr," -ssl3 - use SSLv3\n");
587 #ifndef OPENSSL_NO_TLS1
588 fprintf(stderr," -tls1 - use TLSv1\n");
590 fprintf(stderr," -CApath arg - PEM format directory of CA's\n");
591 fprintf(stderr," -CAfile arg - PEM format file of CA's\n");
592 fprintf(stderr," -cert arg - Server certificate file\n");
593 fprintf(stderr," -key arg - Server key file (default: same as -cert)\n");
594 fprintf(stderr," -c_cert arg - Client certificate file\n");
595 fprintf(stderr," -c_key arg - Client key file (default: same as -c_cert)\n");
596 fprintf(stderr," -cipher arg - The cipher list\n");
597 fprintf(stderr," -bio_pair - Use BIO pairs\n");
598 fprintf(stderr," -f - Test even cases that can't work\n");
599 fprintf(stderr," -time - measure processor time used by client and server\n");
600 fprintf(stderr," -zlib - use zlib compression\n");
601 fprintf(stderr," -rle - use rle compression\n");
602 #ifndef OPENSSL_NO_ECDH
603 fprintf(stderr," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
604 " Use \"openssl ecparam -list_curves\" for all names\n" \
605 " (default is sect163r2).\n");
607 fprintf(stderr," -test_cipherlist - verifies the order of the ssl cipher lists\n");
608 #ifndef OPENSSL_NO_TLSEXT
609 fprintf(stderr," -server_authz arg - binary authz file for certificate\n");
610 fprintf(stderr," -c_support_proof - indicate client support for server_authz audit proofs\n");
611 fprintf(stderr," -c_require_proof - fail if no audit proof is sent\n");
613 fprintf(stderr," -serverinfo_file file - have server use this file\n");
614 fprintf(stderr," -serverinfo_sct - have client offer and expect SCT\n");
615 fprintf(stderr," -serverinfo_tack - have client offer and expect TACK\n");
616 fprintf(stderr," -custom_ext - try various custom extension callbacks\n");
619 static void print_details(SSL *c_ssl, const char *prefix)
621 const SSL_CIPHER *ciph;
624 ciph=SSL_get_current_cipher(c_ssl);
625 BIO_printf(bio_stdout,"%s%s, cipher %s %s",
627 SSL_get_version(c_ssl),
628 SSL_CIPHER_get_version(ciph),
629 SSL_CIPHER_get_name(ciph));
630 cert=SSL_get_peer_certificate(c_ssl);
633 EVP_PKEY *pkey = X509_get_pubkey(cert);
638 #ifndef OPENSSL_NO_RSA
639 else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
640 && pkey->pkey.rsa->n != NULL)
642 BIO_printf(bio_stdout, ", %d bit RSA",
643 BN_num_bits(pkey->pkey.rsa->n));
646 #ifndef OPENSSL_NO_DSA
647 else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
648 && pkey->pkey.dsa->p != NULL)
650 BIO_printf(bio_stdout, ", %d bit DSA",
651 BN_num_bits(pkey->pkey.dsa->p));
658 /* The SSL API does not allow us to look at temporary RSA/DH keys,
659 * otherwise we should print their lengths too */
660 BIO_printf(bio_stdout,"\n");
663 static void lock_dbg_cb(int mode, int type, const char *file, int line)
665 static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
666 const char *errstr = NULL;
669 rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
670 if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
672 errstr = "invalid mode";
676 if (type < 0 || type >= CRYPTO_NUM_LOCKS)
678 errstr = "type out of bounds";
682 if (mode & CRYPTO_LOCK)
686 errstr = "already locked";
687 /* must not happen in a single-threaded program
688 * (would deadlock) */
694 else if (mode & CRYPTO_UNLOCK)
698 errstr = "not locked";
702 if (modes[type] != rw)
704 errstr = (rw == CRYPTO_READ) ?
705 "CRYPTO_r_unlock on write lock" :
706 "CRYPTO_w_unlock on read lock";
713 errstr = "invalid mode";
720 /* we cannot use bio_err here */
721 fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
722 errstr, mode, type, file, line);
726 #ifdef TLSEXT_TYPE_opaque_prf_input
727 struct cb_info_st { void *input; size_t len; int ret; };
728 struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
729 struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
730 struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
731 struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
733 int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
735 struct cb_info_st *arg = arg_;
740 if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
746 #ifndef OPENSSL_NO_TLSEXT
747 struct audit_proof_cb_arg_st
749 unsigned char *expected_proof;
750 size_t expected_proof_length;
754 struct audit_proof_cb_arg_st c_expected = { NULL, 0, 0 };
756 static int audit_proof_cb(SSL *s, void *arg)
758 const unsigned char *proof;
760 SSL_SESSION *sess = SSL_get_session(s);
761 struct audit_proof_cb_arg_st *cb_arg = (struct audit_proof_cb_arg_st*)arg;
763 proof = SSL_SESSION_get_tlsext_authz_server_audit_proof(sess,
767 if (proof_len == cb_arg->expected_proof_length &&
768 cb_arg->expected_proof != NULL &&
769 memcmp(proof, cb_arg->expected_proof, proof_len) == 0)
771 BIO_printf(bio_stdout, "Audit proof OK (%lu bytes).\n",
777 BIO_printf(bio_stdout, "Audit proof mismatch.\n");
778 /* Cause handshake failure. */
783 else /* proof == NULL */
785 BIO_printf(bio_stdout, "No audit proof found.\n");
788 /* Cause handshake failure. */
796 int main(int argc, char *argv[])
798 char *CApath=NULL,*CAfile=NULL;
802 int tls1=0,ssl2=0,ssl3=0,ret=1;
805 struct app_verify_arg app_verify_arg =
806 { APP_CALLBACK_STRING, 0, 0, NULL, NULL };
807 char *server_cert=TEST_SERVER_CERT;
808 char *server_key=NULL;
809 char *client_cert=TEST_CLIENT_CERT;
810 char *client_key=NULL;
811 #ifndef OPENSSL_NO_ECDH
812 char *named_curve = NULL;
816 const SSL_METHOD *meth=NULL;
818 int number=1,reuse=0;
820 #ifndef OPENSSL_NO_DH
822 int dhe1024 = 0, dhe1024dsa = 0;
824 #ifndef OPENSSL_NO_ECDH
827 #ifndef OPENSSL_NO_SRP
829 SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
831 SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
837 clock_t s_time = 0, c_time = 0;
838 #ifndef OPENSSL_NO_COMP
840 COMP_METHOD *cm = NULL;
841 STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
843 int test_cipherlist = 0;
847 #ifndef OPENSSL_NO_TLSEXT
848 char *s_authz_file = NULL;
849 int c_support_proof = 0;
850 int c_require_proof = 0;
857 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);
859 CRYPTO_set_locking_callback(lock_dbg_cb);
861 /* enable memory leak checking unless explicitly disabled */
862 if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
864 CRYPTO_malloc_debug_init();
865 CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
869 /* OPENSSL_DEBUG_MEMORY=off */
870 CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
872 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
874 RAND_seed(rnd_seed, sizeof rnd_seed);
876 bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
883 if(!strcmp(*argv,"-F"))
888 fprintf(stderr,"not compiled with FIPS support, so exitting without running.\n");
892 else if (strcmp(*argv,"-server_auth") == 0)
894 else if (strcmp(*argv,"-client_auth") == 0)
896 else if (strcmp(*argv,"-proxy_auth") == 0)
898 if (--argc < 1) goto bad;
899 app_verify_arg.proxy_auth= *(++argv);
901 else if (strcmp(*argv,"-proxy_cond") == 0)
903 if (--argc < 1) goto bad;
904 app_verify_arg.proxy_cond= *(++argv);
906 else if (strcmp(*argv,"-v") == 0)
908 else if (strcmp(*argv,"-d") == 0)
910 else if (strcmp(*argv,"-reuse") == 0)
912 else if (strcmp(*argv,"-dhe1024") == 0)
914 #ifndef OPENSSL_NO_DH
917 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
920 else if (strcmp(*argv,"-dhe1024dsa") == 0)
922 #ifndef OPENSSL_NO_DH
925 fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
928 else if (strcmp(*argv,"-no_dhe") == 0)
930 else if (strcmp(*argv,"-no_ecdhe") == 0)
932 else if (strcmp(*argv,"-psk") == 0)
934 if (--argc < 1) goto bad;
936 #ifndef OPENSSL_NO_PSK
937 if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
939 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
946 #ifndef OPENSSL_NO_SRP
947 else if (strcmp(*argv,"-srpuser") == 0)
949 if (--argc < 1) goto bad;
950 srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
953 else if (strcmp(*argv,"-srppass") == 0)
955 if (--argc < 1) goto bad;
956 srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
960 else if (strcmp(*argv,"-ssl2") == 0)
962 else if (strcmp(*argv,"-tls1") == 0)
964 else if (strcmp(*argv,"-ssl3") == 0)
966 else if (strncmp(*argv,"-num",4) == 0)
968 if (--argc < 1) goto bad;
969 number= atoi(*(++argv));
970 if (number == 0) number=1;
972 else if (strcmp(*argv,"-bytes") == 0)
974 if (--argc < 1) goto bad;
975 bytes= atol(*(++argv));
976 if (bytes == 0L) bytes=1L;
978 if (argv[0][i-1] == 'k') bytes*=1024L;
979 if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
981 else if (strcmp(*argv,"-cert") == 0)
983 if (--argc < 1) goto bad;
984 server_cert= *(++argv);
986 else if (strcmp(*argv,"-s_cert") == 0)
988 if (--argc < 1) goto bad;
989 server_cert= *(++argv);
991 else if (strcmp(*argv,"-key") == 0)
993 if (--argc < 1) goto bad;
994 server_key= *(++argv);
996 else if (strcmp(*argv,"-s_key") == 0)
998 if (--argc < 1) goto bad;
999 server_key= *(++argv);
1001 else if (strcmp(*argv,"-c_cert") == 0)
1003 if (--argc < 1) goto bad;
1004 client_cert= *(++argv);
1006 else if (strcmp(*argv,"-c_key") == 0)
1008 if (--argc < 1) goto bad;
1009 client_key= *(++argv);
1011 else if (strcmp(*argv,"-cipher") == 0)
1013 if (--argc < 1) goto bad;
1016 else if (strcmp(*argv,"-CApath") == 0)
1018 if (--argc < 1) goto bad;
1021 else if (strcmp(*argv,"-CAfile") == 0)
1023 if (--argc < 1) goto bad;
1026 else if (strcmp(*argv,"-bio_pair") == 0)
1030 else if (strcmp(*argv,"-f") == 0)
1034 else if (strcmp(*argv,"-time") == 0)
1038 #ifndef OPENSSL_NO_COMP
1039 else if (strcmp(*argv,"-zlib") == 0)
1043 else if (strcmp(*argv,"-rle") == 0)
1048 else if (strcmp(*argv,"-named_curve") == 0)
1050 if (--argc < 1) goto bad;
1051 #ifndef OPENSSL_NO_ECDH
1052 named_curve = *(++argv);
1054 fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
1058 else if (strcmp(*argv,"-app_verify") == 0)
1060 app_verify_arg.app_verify = 1;
1062 else if (strcmp(*argv,"-proxy") == 0)
1064 app_verify_arg.allow_proxy_certs = 1;
1066 else if (strcmp(*argv,"-test_cipherlist") == 0)
1068 test_cipherlist = 1;
1070 #ifndef OPENSSL_NO_TLSEXT
1071 else if(strcmp(*argv,"-server_authz") == 0)
1073 if (--argc < 1) goto bad;
1074 s_authz_file = *(++argv);
1077 else if (strcmp(*argv,"-c_support_proof") == 0)
1079 c_support_proof = 1;
1082 else if (strcmp(*argv,"-c_require_proof") == 0)
1084 c_require_proof = 1;
1088 else if (strcmp(*argv,"-serverinfo_sct") == 0)
1092 else if (strcmp(*argv,"-serverinfo_tack") == 0)
1094 serverinfo_tack = 1;
1096 else if (strcmp(*argv,"-serverinfo_file") == 0)
1098 if (--argc < 1) goto bad;
1099 serverinfo_file = *(++argv);
1101 else if (strcmp(*argv,"-custom_ext") == 0)
1107 fprintf(stderr,"unknown option %s\n",*argv);
1121 if (test_cipherlist == 1)
1123 /* ensure that the cipher list are correctly sorted and exit */
1124 if (do_test_cipherlist() == 0)
1130 if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
1132 fprintf(stderr, "This case cannot work. Use -f to perform "
1133 "the test anyway (and\n-d to see what happens), "
1134 "or add one of -ssl2, -ssl3, -tls1, -reuse\n"
1135 "to avoid protocol mismatch.\n");
1138 if (c_require_proof && s_authz_file == NULL && !force)
1140 fprintf(stderr, "This case cannot work. -c_require_proof "
1141 "requires an audit proof, but none was supplied. "
1142 "Use -f to perform the test anyway (and\n-d to see "
1143 "what happens), or use -server_authz to supply an "
1151 if(!FIPS_mode_set(1))
1153 ERR_load_crypto_strings();
1154 ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
1158 fprintf(stderr,"*** IN FIPS MODE ***\n");
1166 fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1169 if (number < 50 && !force)
1170 fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1173 /* if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
1176 SSL_load_error_strings();
1178 #ifndef OPENSSL_NO_COMP
1179 if (comp == COMP_ZLIB) cm = COMP_zlib();
1180 if (comp == COMP_RLE) cm = COMP_rle();
1183 if (cm->type != NID_undef)
1185 if (SSL_COMP_add_compression_method(comp, cm) != 0)
1188 "Failed to add compression method\n");
1189 ERR_print_errors_fp(stderr);
1195 "Warning: %s compression not supported\n",
1196 (comp == COMP_RLE ? "rle" :
1197 (comp == COMP_ZLIB ? "zlib" :
1199 ERR_print_errors_fp(stderr);
1202 ssl_comp_methods = SSL_COMP_get_compression_methods();
1203 fprintf(stderr, "Available compression methods:\n");
1205 int j, n = sk_SSL_COMP_num(ssl_comp_methods);
1207 fprintf(stderr, " NONE\n");
1209 for (j = 0; j < n; j++)
1211 SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
1212 fprintf(stderr, " %d: %s\n", c->id, c->name);
1217 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
1219 meth=SSLv2_method();
1222 meth=TLSv1_method();
1225 meth=SSLv3_method();
1227 meth=SSLv23_method();
1229 #ifdef OPENSSL_NO_SSL2
1231 meth=TLSv1_method();
1234 meth=SSLv3_method();
1236 meth=SSLv23_method();
1238 meth=SSLv2_method();
1242 c_ctx=SSL_CTX_new(meth);
1243 s_ctx=SSL_CTX_new(meth);
1244 if ((c_ctx == NULL) || (s_ctx == NULL))
1246 ERR_print_errors(bio_err);
1252 SSL_CTX_set_cipher_list(c_ctx,cipher);
1253 SSL_CTX_set_cipher_list(s_ctx,cipher);
1256 #ifndef OPENSSL_NO_DH
1261 /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
1262 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
1269 SSL_CTX_set_tmp_dh(s_ctx,dh);
1276 #ifndef OPENSSL_NO_ECDH
1281 if (named_curve != NULL)
1283 nid = OBJ_sn2nid(named_curve);
1286 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1291 #ifdef OPENSSL_NO_EC2M
1292 nid = NID_X9_62_prime256v1;
1294 nid = NID_sect163r2;
1297 ecdh = EC_KEY_new_by_curve_name(nid);
1300 BIO_printf(bio_err, "unable to create curve\n");
1304 SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
1305 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
1312 #ifndef OPENSSL_NO_RSA
1313 SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
1316 #ifdef TLSEXT_TYPE_opaque_prf_input
1317 SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
1318 SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
1319 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
1320 SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
1323 if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
1325 ERR_print_errors(bio_err);
1327 else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
1328 (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
1330 ERR_print_errors(bio_err);
1336 SSL_CTX_use_certificate_file(c_ctx,client_cert,
1338 SSL_CTX_use_PrivateKey_file(c_ctx,
1339 (client_key?client_key:client_cert),
1343 if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
1344 (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1345 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
1346 (!SSL_CTX_set_default_verify_paths(c_ctx)))
1348 /* fprintf(stderr,"SSL_load_verify_locations\n"); */
1349 ERR_print_errors(bio_err);
1355 BIO_printf(bio_err,"client authentication\n");
1356 SSL_CTX_set_verify(s_ctx,
1357 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1359 SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
1363 BIO_printf(bio_err,"server authentication\n");
1364 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
1366 SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
1370 int session_id_context = 0;
1371 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
1374 /* Use PSK only if PSK key is given */
1375 if (psk_key != NULL)
1377 /* no_psk is used to avoid putting psk command to openssl tool */
1380 /* if PSK is not compiled in and psk key is
1381 * given, do nothing and exit successfully */
1385 #ifndef OPENSSL_NO_PSK
1386 SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1387 SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1389 BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
1390 if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
1392 BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
1393 ERR_print_errors(bio_err);
1398 #ifndef OPENSSL_NO_SRP
1399 if (srp_client_arg.srplogin)
1401 if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
1403 BIO_printf(bio_err,"Unable to set SRP username\n");
1406 SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
1407 SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
1408 /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
1411 if (srp_server_arg.expected_user != NULL)
1413 SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
1414 SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1415 SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1418 #ifndef OPENSSL_NO_TLSEXT
1419 if (s_authz_file != NULL)
1421 if(!SSL_CTX_use_authz_file(s_ctx, s_authz_file))
1423 BIO_printf(bio_err, "Unable to set authz data\n");
1427 if (c_support_proof || c_require_proof)
1429 size_t proof_length;
1430 const unsigned char *proof = SSL_CTX_get_authz_data(s_ctx,
1431 TLSEXT_AUTHZDATAFORMAT_audit_proof, &proof_length);
1434 /* Store a local copy. */
1435 c_expected.expected_proof = OPENSSL_malloc(proof_length);
1436 c_expected.expected_proof_length = proof_length;
1437 memcpy(c_expected.expected_proof, proof, proof_length);
1439 c_expected.require = c_require_proof;
1440 SSL_CTX_set_tlsext_authz_server_audit_proof_cb(c_ctx,
1442 SSL_CTX_set_tlsext_authz_server_audit_proof_cb_arg(c_ctx,
1448 SSL_CTX_set_custom_cli_ext(c_ctx, SCT_EXT_TYPE, NULL,
1449 serverinfo_cli_cb, NULL);
1450 if (serverinfo_tack)
1451 SSL_CTX_set_custom_cli_ext(c_ctx, TACK_EXT_TYPE, NULL,
1452 serverinfo_cli_cb, NULL);
1454 if (serverinfo_file)
1455 if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file))
1457 BIO_printf(bio_err, "missing serverinfo file\n");
1463 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_0,
1464 custom_ext_0_cli_first_cb,
1465 custom_ext_0_cli_second_cb, NULL);
1466 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_1,
1467 custom_ext_1_cli_first_cb,
1468 custom_ext_1_cli_second_cb, NULL);
1469 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_2,
1470 custom_ext_2_cli_first_cb,
1471 custom_ext_2_cli_second_cb, NULL);
1472 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_3,
1473 custom_ext_3_cli_first_cb,
1474 custom_ext_3_cli_second_cb, NULL);
1477 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_0,
1478 custom_ext_0_srv_first_cb,
1479 custom_ext_0_srv_second_cb, NULL);
1480 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_1,
1481 custom_ext_1_srv_first_cb,
1482 custom_ext_1_srv_second_cb, NULL);
1483 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_2,
1484 custom_ext_2_srv_first_cb,
1485 custom_ext_2_srv_second_cb, NULL);
1486 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_3,
1487 custom_ext_3_srv_first_cb,
1488 custom_ext_3_srv_second_cb, NULL);
1491 c_ssl=SSL_new(c_ctx);
1492 s_ssl=SSL_new(s_ctx);
1494 #ifndef OPENSSL_NO_KRB5
1495 if (c_ssl && c_ssl->kssl_ctx)
1497 char localhost[MAXHOSTNAMELEN+2];
1499 if (gethostname(localhost, sizeof localhost-1) == 0)
1501 localhost[sizeof localhost-1]='\0';
1502 if(strlen(localhost) == sizeof localhost-1)
1504 BIO_printf(bio_err,"localhost name too long\n");
1507 kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
1511 #endif /* OPENSSL_NO_KRB5 */
1513 for (i=0; i<number; i++)
1515 if (!reuse) SSL_set_session(c_ssl,NULL);
1517 ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
1519 ret=doit(s_ssl,c_ssl,bytes);
1524 print_details(c_ssl, "");
1526 if ((number > 1) || (bytes > 1L))
1527 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
1530 #ifdef CLOCKS_PER_SEC
1531 /* "To determine the time in seconds, the value returned
1532 * by the clock function should be divided by the value
1533 * of the macro CLOCKS_PER_SEC."
1534 * -- ISO/IEC 9899 */
1535 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1536 "Approximate total client time: %6.2f s\n",
1537 (double)s_time/CLOCKS_PER_SEC,
1538 (double)c_time/CLOCKS_PER_SEC);
1540 /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
1541 * -- cc on NeXTstep/OpenStep */
1542 BIO_printf(bio_stdout,
1543 "Approximate total server time: %6.2f units\n"
1544 "Approximate total client time: %6.2f units\n",
1554 if (s_ctx != NULL) SSL_CTX_free(s_ctx);
1555 if (c_ctx != NULL) SSL_CTX_free(c_ctx);
1557 if (bio_stdout != NULL) BIO_free(bio_stdout);
1559 #ifndef OPENSSL_NO_RSA
1562 #ifndef OPENSSL_NO_ENGINE
1565 #ifndef OPENSSL_NO_TLSEXT
1566 if (c_expected.expected_proof != NULL)
1567 OPENSSL_free(c_expected.expected_proof);
1569 CRYPTO_cleanup_all_ex_data();
1571 ERR_remove_thread_state(NULL);
1573 CRYPTO_mem_leaks(bio_err);
1574 if (bio_err != NULL) BIO_free(bio_err);
1579 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
1580 clock_t *s_time, clock_t *c_time)
1582 long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1583 BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1584 BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
1587 size_t bufsiz = 256; /* small buffer for testing */
1589 if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
1591 if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
1594 s_ssl_bio = BIO_new(BIO_f_ssl());
1598 c_ssl_bio = BIO_new(BIO_f_ssl());
1602 SSL_set_connect_state(c_ssl);
1603 SSL_set_bio(c_ssl, client, client);
1604 (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1606 SSL_set_accept_state(s_ssl);
1607 SSL_set_bio(s_ssl, server, server);
1608 (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1612 /* c_ssl_bio: SSL filter BIO
1614 * client: pseudo-I/O for SSL library
1616 * client_io: client's SSL communication; usually to be
1617 * relayed over some I/O facility, but in this
1618 * test program, we're the server, too:
1620 * server_io: server's SSL communication
1622 * server: pseudo-I/O for SSL library
1624 * s_ssl_bio: SSL filter BIO
1626 * The client and the server each employ a "BIO pair":
1627 * client + client_io, server + server_io.
1628 * BIO pairs are symmetric. A BIO pair behaves similar
1629 * to a non-blocking socketpair (but both endpoints must
1630 * be handled by the same thread).
1631 * [Here we could connect client and server to the ends
1632 * of a single BIO pair, but then this code would be less
1633 * suitable as an example for BIO pairs in general.]
1635 * Useful functions for querying the state of BIO pair endpoints:
1637 * BIO_ctrl_pending(bio) number of bytes we can read now
1638 * BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil
1639 * other side's read attempt
1640 * BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now
1642 * ..._read_request is never more than ..._write_guarantee;
1643 * it depends on the application which one you should use.
1646 /* We have non-blocking behaviour throughout this test program, but
1647 * can be sure that there is *some* progress in each iteration; so
1648 * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
1649 * -- we just try everything in each iteration
1655 MS_STATIC char cbuf[1024*8];
1657 clock_t c_clock = clock();
1659 memset(cbuf, 0, sizeof(cbuf));
1662 if (SSL_in_init(c_ssl))
1663 printf("client waiting in SSL_connect - %s\n",
1664 SSL_state_string_long(c_ssl));
1668 /* Write to server. */
1670 if (cw_num > (long)sizeof cbuf)
1674 r = BIO_write(c_ssl_bio, cbuf, i);
1677 if (!BIO_should_retry(c_ssl_bio))
1679 fprintf(stderr,"ERROR in CLIENT\n");
1682 /* BIO_should_retry(...) can just be ignored here.
1683 * The library expects us to call BIO_write with
1684 * the same arguments again, and that's what we will
1685 * do in the next iteration. */
1689 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1695 printf("client wrote %d\n", r);
1702 /* Read from server. */
1704 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
1707 if (!BIO_should_retry(c_ssl_bio))
1709 fprintf(stderr,"ERROR in CLIENT\n");
1712 /* Again, "BIO_should_retry" can be ignored. */
1716 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1722 printf("client read %d\n", r);
1727 /* c_time and s_time increments will typically be very small
1728 * (depending on machine speed and clock tick intervals),
1729 * but sampling over a large number of connections should
1730 * result in fairly accurate figures. We cannot guarantee
1731 * a lot, however -- if each connection lasts for exactly
1732 * one clock tick, it will be counted only for the client
1733 * or only for the server or even not at all.
1735 *c_time += (clock() - c_clock);
1741 MS_STATIC char sbuf[1024*8];
1743 clock_t s_clock = clock();
1745 memset(sbuf, 0, sizeof(sbuf));
1748 if (SSL_in_init(s_ssl))
1749 printf("server waiting in SSL_accept - %s\n",
1750 SSL_state_string_long(s_ssl));
1754 /* Write to client. */
1756 if (sw_num > (long)sizeof sbuf)
1760 r = BIO_write(s_ssl_bio, sbuf, i);
1763 if (!BIO_should_retry(s_ssl_bio))
1765 fprintf(stderr,"ERROR in SERVER\n");
1768 /* Ignore "BIO_should_retry". */
1772 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1778 printf("server wrote %d\n", r);
1785 /* Read from client. */
1787 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
1790 if (!BIO_should_retry(s_ssl_bio))
1792 fprintf(stderr,"ERROR in SERVER\n");
1799 fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1805 printf("server read %d\n", r);
1810 *s_time += (clock() - s_clock);
1814 /* "I/O" BETWEEN CLIENT AND SERVER. */
1817 BIO *io1 = server_io, *io2 = client_io;
1818 /* we use the non-copying interface for io1
1819 * and the standard BIO_write/BIO_read interface for io2
1822 static int prev_progress = 1;
1831 r1 = BIO_ctrl_pending(io1);
1832 r2 = BIO_ctrl_get_write_guarantee(io2);
1841 if (INT_MAX < num) /* yeah, right */
1844 r = BIO_nread(io1, &dataptr, (int)num);
1846 assert(r <= (int)num);
1847 /* possibly r < num (non-contiguous data) */
1849 r = BIO_write(io2, dataptr, (int)num);
1850 if (r != (int)num) /* can't happen */
1852 fprintf(stderr, "ERROR: BIO_write could not write "
1853 "BIO_ctrl_get_write_guarantee() bytes");
1859 printf((io1 == client_io) ?
1860 "C->S relaying: %d bytes\n" :
1861 "S->C relaying: %d bytes\n",
1872 r1 = BIO_ctrl_pending(io2);
1873 r2 = BIO_ctrl_get_read_request(io1);
1874 /* here we could use ..._get_write_guarantee instead of
1875 * ..._get_read_request, but by using the latter
1876 * we test restartability of the SSL implementation
1877 * more thoroughly */
1889 --num; /* test restartability even more thoroughly */
1891 r = BIO_nwrite0(io1, &dataptr);
1895 r = BIO_read(io2, dataptr, (int)num);
1896 if (r != (int)num) /* can't happen */
1898 fprintf(stderr, "ERROR: BIO_read could not read "
1899 "BIO_ctrl_pending() bytes");
1903 r = BIO_nwrite(io1, &dataptr, (int)num);
1904 if (r != (int)num) /* can't happen */
1906 fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
1907 "BIO_nwrite0() bytes");
1912 printf((io2 == client_io) ?
1913 "C->S relaying: %d bytes\n" :
1914 "S->C relaying: %d bytes\n",
1917 } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
1919 if (!progress && !prev_progress)
1920 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
1922 fprintf(stderr, "ERROR: got stuck\n");
1923 if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
1925 fprintf(stderr, "This can happen for SSL2 because "
1926 "CLIENT-FINISHED and SERVER-VERIFY are written \n"
1927 "concurrently ...");
1928 if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
1929 && strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
1931 fprintf(stderr, " ok.\n");
1935 fprintf(stderr, " ERROR.\n");
1938 prev_progress = progress;
1941 while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
1944 print_details(c_ssl, "DONE via BIO pair: ");
1946 if (verify_serverinfo() < 0)
1952 if (custom_ext_error)
1962 ERR_print_errors(bio_err);
1967 BIO_free(server_io);
1971 BIO_free(client_io);
1973 BIO_free(s_ssl_bio);
1975 BIO_free(c_ssl_bio);
1986 int doit(SSL *s_ssl, SSL *c_ssl, long count)
1988 MS_STATIC char cbuf[1024*8],sbuf[1024*8];
1989 long cw_num=count,cr_num=count;
1990 long sw_num=count,sr_num=count;
1996 int c_r,c_w,s_r,s_w;
1999 int c_write,s_write;
2000 int do_server=0,do_client=0;
2002 memset(cbuf,0,sizeof(cbuf));
2003 memset(sbuf,0,sizeof(sbuf));
2005 c_to_s=BIO_new(BIO_s_mem());
2006 s_to_c=BIO_new(BIO_s_mem());
2007 if ((s_to_c == NULL) || (c_to_s == NULL))
2009 ERR_print_errors(bio_err);
2013 c_bio=BIO_new(BIO_f_ssl());
2014 s_bio=BIO_new(BIO_f_ssl());
2015 if ((c_bio == NULL) || (s_bio == NULL))
2017 ERR_print_errors(bio_err);
2021 SSL_set_connect_state(c_ssl);
2022 SSL_set_bio(c_ssl,s_to_c,c_to_s);
2023 BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
2025 SSL_set_accept_state(s_ssl);
2026 SSL_set_bio(s_ssl,c_to_s,s_to_c);
2027 BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
2031 c_write=1,s_write=0;
2033 /* We can always do writes */
2039 i=(int)BIO_pending(s_bio);
2040 if ((i && s_r) || s_w) do_server=1;
2042 i=(int)BIO_pending(c_bio);
2043 if ((i && c_r) || c_w) do_client=1;
2045 if (do_server && debug)
2047 if (SSL_in_init(s_ssl))
2048 printf("server waiting in SSL_accept - %s\n",
2049 SSL_state_string_long(s_ssl));
2050 /* else if (s_write)
2051 printf("server:SSL_write()\n");
2053 printf("server:SSL_read()\n"); */
2056 if (do_client && debug)
2058 if (SSL_in_init(c_ssl))
2059 printf("client waiting in SSL_connect - %s\n",
2060 SSL_state_string_long(c_ssl));
2061 /* else if (c_write)
2062 printf("client:SSL_write()\n");
2064 printf("client:SSL_read()\n"); */
2067 if (!do_client && !do_server)
2069 fprintf(stdout,"ERROR IN STARTUP\n");
2070 ERR_print_errors(bio_err);
2073 if (do_client && !(done & C_DONE))
2077 j = (cw_num > (long)sizeof(cbuf)) ?
2078 (int)sizeof(cbuf) : (int)cw_num;
2079 i=BIO_write(c_bio,cbuf,j);
2084 if (BIO_should_retry(c_bio))
2086 if (BIO_should_read(c_bio))
2088 if (BIO_should_write(c_bio))
2093 fprintf(stderr,"ERROR in CLIENT\n");
2094 ERR_print_errors(bio_err);
2100 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2106 printf("client wrote %d\n",i);
2115 i=BIO_read(c_bio,cbuf,sizeof(cbuf));
2120 if (BIO_should_retry(c_bio))
2122 if (BIO_should_read(c_bio))
2124 if (BIO_should_write(c_bio))
2129 fprintf(stderr,"ERROR in CLIENT\n");
2130 ERR_print_errors(bio_err);
2136 fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2142 printf("client read %d\n",i);
2159 if (do_server && !(done & S_DONE))
2163 i=BIO_read(s_bio,sbuf,sizeof(cbuf));
2168 if (BIO_should_retry(s_bio))
2170 if (BIO_should_read(s_bio))
2172 if (BIO_should_write(s_bio))
2177 fprintf(stderr,"ERROR in SERVER\n");
2178 ERR_print_errors(bio_err);
2184 ERR_print_errors(bio_err);
2185 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
2191 printf("server read %d\n",i);
2208 j = (sw_num > (long)sizeof(sbuf)) ?
2209 (int)sizeof(sbuf) : (int)sw_num;
2210 i=BIO_write(s_bio,sbuf,j);
2215 if (BIO_should_retry(s_bio))
2217 if (BIO_should_read(s_bio))
2219 if (BIO_should_write(s_bio))
2224 fprintf(stderr,"ERROR in SERVER\n");
2225 ERR_print_errors(bio_err);
2231 ERR_print_errors(bio_err);
2232 fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
2238 printf("server wrote %d\n",i);
2248 if ((done & S_DONE) && (done & C_DONE)) break;
2252 print_details(c_ssl, "DONE: ");
2254 if (verify_serverinfo() < 0)
2259 if (custom_ext_error)
2266 /* We have to set the BIO's to NULL otherwise they will be
2267 * OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and
2268 * again when c_ssl is SSL_free()ed.
2269 * This is a hack required because s_ssl and c_ssl are sharing the same
2270 * BIO structure and SSL_set_bio() and SSL_free() automatically
2271 * BIO_free non NULL entries.
2272 * You should not normally do this or be required to do this */
2284 if (c_to_s != NULL) BIO_free(c_to_s);
2285 if (s_to_c != NULL) BIO_free(s_to_c);
2286 if (c_bio != NULL) BIO_free_all(c_bio);
2287 if (s_bio != NULL) BIO_free_all(s_bio);
2291 static int get_proxy_auth_ex_data_idx(void)
2293 static volatile int idx = -1;
2296 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
2299 idx = X509_STORE_CTX_get_ex_new_index(0,
2300 "SSLtest for verify callback", NULL,NULL,NULL);
2302 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
2307 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
2311 s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
2316 fprintf(stderr,"depth=%d %s\n",
2317 ctx->error_depth,buf);
2320 fprintf(stderr,"depth=%d error=%d %s\n",
2321 ctx->error_depth,ctx->error,buf);
2327 fprintf(stderr,"Error string: %s\n",
2328 X509_verify_cert_error_string(ctx->error));
2331 case X509_V_ERR_CERT_NOT_YET_VALID:
2332 case X509_V_ERR_CERT_HAS_EXPIRED:
2333 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
2334 fprintf(stderr," ... ignored.\n");
2341 X509 *xs = ctx->current_cert;
2343 X509 *xi = ctx->current_issuer;
2346 if (xs->ex_flags & EXFLAG_PROXY)
2348 unsigned int *letters =
2349 X509_STORE_CTX_get_ex_data(ctx,
2350 get_proxy_auth_ex_data_idx());
2356 PROXY_CERT_INFO_EXTENSION *pci =
2357 X509_get_ext_d2i(xs, NID_proxyCertInfo,
2360 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
2362 case NID_Independent:
2363 /* Completely meaningless in this
2364 program, as there's no way to
2365 grant explicit rights to a
2366 specific PrC. Basically, using
2367 id-ppl-Independent is the perfect
2368 way to grant no rights at all. */
2369 fprintf(stderr, " Independent proxy certificate");
2370 for (i = 0; i < 26; i++)
2373 case NID_id_ppl_inheritAll:
2374 /* This is basically a NOP, we
2375 simply let the current rights
2376 stand as they are. */
2377 fprintf(stderr, " Proxy certificate inherits all");
2381 pci->proxyPolicy->policy->data;
2382 i = pci->proxyPolicy->policy->length;
2384 /* The algorithm works as follows:
2385 it is assumed that previous
2386 iterations or the initial granted
2387 rights has already set some elements
2388 of `letters'. What we need to do is
2389 to clear those that weren't granted
2390 by the current PrC as well. The
2391 easiest way to do this is to add 1
2392 to all the elements whose letters
2393 are given with the current policy.
2394 That way, all elements that are set
2395 by the current policy and were
2396 already set by earlier policies and
2397 through the original grant of rights
2398 will get the value 2 or higher.
2399 The last thing to do is to sweep
2400 through `letters' and keep the
2401 elements having the value 2 as set,
2402 and clear all the others. */
2404 fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s);
2408 if (isascii(c) && isalpha(c))
2415 for (i = 0; i < 26; i++)
2424 ", resulting proxy rights = ");
2425 for(i = 0; i < 26; i++)
2428 fprintf(stderr, "%c", i + 'A');
2432 fprintf(stderr, "none");
2433 fprintf(stderr, "\n");
2435 PROXY_CERT_INFO_EXTENSION_free(pci);
2443 static void process_proxy_debug(int indent, const char *format, ...)
2445 static const char indentation[] =
2446 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
2447 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
2448 char my_format[256];
2451 BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2452 indent, indent, indentation, format);
2454 va_start(args, format);
2455 vfprintf(stderr, my_format, args);
2463 static int process_proxy_cond_adders(unsigned int letters[26],
2464 const char *cond, const char **cond_end, int *pos, int indent);
2465 static int process_proxy_cond_val(unsigned int letters[26],
2466 const char *cond, const char **cond_end, int *pos, int indent)
2472 while(isspace((int)*cond))
2479 process_proxy_debug(indent,
2480 "Start process_proxy_cond_val at position %d: %s\n",
2487 while(isspace((int)*cond))
2497 ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
2502 while(isspace((int)*cond))
2510 "Weird condition character in position %d: "
2517 else if (isascii(c) && isalpha(c))
2521 ok = letters[c - 'A'];
2527 "Weird condition character in position %d: "
2534 if (ok >= 0 && negate)
2538 process_proxy_debug(indent,
2539 "End process_proxy_cond_val at position %d: %s, returning %d\n",
2544 static int process_proxy_cond_multipliers(unsigned int letters[26],
2545 const char *cond, const char **cond_end, int *pos, int indent)
2551 process_proxy_debug(indent,
2552 "Start process_proxy_cond_multipliers at position %d: %s\n",
2555 ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
2562 while(isspace((int)*cond))
2576 ok = process_proxy_cond_val(letters,
2577 cond, cond_end, pos, indent + 1);
2591 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2603 process_proxy_debug(indent,
2604 "End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
2610 static int process_proxy_cond_adders(unsigned int letters[26],
2611 const char *cond, const char **cond_end, int *pos, int indent)
2617 process_proxy_debug(indent,
2618 "Start process_proxy_cond_adders at position %d: %s\n",
2621 ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
2629 while(isspace((int)*cond))
2642 ok = process_proxy_cond_multipliers(letters,
2643 cond, cond_end, pos, indent + 1);
2654 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2666 process_proxy_debug(indent,
2667 "End process_proxy_cond_adders at position %d: %s, returning %d\n",
2674 static int process_proxy_cond(unsigned int letters[26],
2675 const char *cond, const char **cond_end)
2678 return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
2681 static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
2684 struct app_verify_arg *cb_arg = arg;
2685 unsigned int letters[26]; /* only used with proxy_auth */
2687 if (cb_arg->app_verify)
2689 char *s = NULL,buf[256];
2691 fprintf(stderr, "In app_verify_callback, allowing cert. ");
2692 fprintf(stderr, "Arg is: %s\n", cb_arg->string);
2693 fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
2694 (void *)ctx, (void *)ctx->cert);
2696 s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
2699 fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
2703 if (cb_arg->proxy_auth)
2705 int found_any = 0, i;
2708 for(i = 0; i < 26; i++)
2710 for(sp = cb_arg->proxy_auth; *sp; sp++)
2713 if (isascii(c) && isalpha(c))
2717 letters[c - 'A'] = 1;
2722 " Initial proxy rights = ");
2723 for(i = 0; i < 26; i++)
2726 fprintf(stderr, "%c", i + 'A');
2730 fprintf(stderr, "none");
2731 fprintf(stderr, "\n");
2733 X509_STORE_CTX_set_ex_data(ctx,
2734 get_proxy_auth_ex_data_idx(),letters);
2736 if (cb_arg->allow_proxy_certs)
2738 X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
2741 #ifndef OPENSSL_NO_X509_VERIFY
2742 ok = X509_verify_cert(ctx);
2745 if (cb_arg->proxy_auth)
2749 const char *cond_end = NULL;
2751 ok = process_proxy_cond(letters,
2752 cb_arg->proxy_cond, &cond_end);
2758 fprintf(stderr, "Stopped processing condition before it's end.\n");
2762 fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
2763 cb_arg->proxy_cond);
2765 fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
2766 cb_arg->proxy_cond);
2772 #ifndef OPENSSL_NO_RSA
2773 static RSA *rsa_tmp=NULL;
2775 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
2778 if (rsa_tmp == NULL)
2781 rsa_tmp = RSA_new();
2782 if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
2784 BIO_printf(bio_err, "Memory error...");
2787 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
2788 (void)BIO_flush(bio_err);
2789 if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
2791 BIO_printf(bio_err, "Error generating key.");
2796 BIO_printf(bio_err,"\n");
2797 (void)BIO_flush(bio_err);
2803 static void free_tmp_rsa(void)
2805 if (rsa_tmp != NULL)
2813 #ifndef OPENSSL_NO_DH
2814 /* These DH parameters have been generated as follows:
2815 * $ openssl dhparam -C -noout 512
2816 * $ openssl dhparam -C -noout 1024
2817 * $ openssl dhparam -C -noout -dsaparam 1024
2818 * (The third function has been renamed to avoid name conflicts.)
2820 static DH *get_dh512()
2822 static unsigned char dh512_p[]={
2823 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
2824 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
2825 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
2826 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
2827 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
2828 0x02,0xC5,0xAE,0x23,
2830 static unsigned char dh512_g[]={
2835 if ((dh=DH_new()) == NULL) return(NULL);
2836 dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
2837 dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
2838 if ((dh->p == NULL) || (dh->g == NULL))
2839 { DH_free(dh); return(NULL); }
2843 static DH *get_dh1024()
2845 static unsigned char dh1024_p[]={
2846 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
2847 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
2848 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
2849 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
2850 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
2851 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
2852 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
2853 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
2854 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
2855 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
2856 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
2858 static unsigned char dh1024_g[]={
2863 if ((dh=DH_new()) == NULL) return(NULL);
2864 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
2865 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
2866 if ((dh->p == NULL) || (dh->g == NULL))
2867 { DH_free(dh); return(NULL); }
2871 static DH *get_dh1024dsa()
2873 static unsigned char dh1024_p[]={
2874 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
2875 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
2876 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
2877 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
2878 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
2879 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
2880 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
2881 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
2882 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
2883 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
2884 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
2886 static unsigned char dh1024_g[]={
2887 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
2888 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
2889 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
2890 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
2891 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
2892 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
2893 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
2894 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
2895 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
2896 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
2897 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
2901 if ((dh=DH_new()) == NULL) return(NULL);
2902 dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
2903 dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
2904 if ((dh->p == NULL) || (dh->g == NULL))
2905 { DH_free(dh); return(NULL); }
2911 #ifndef OPENSSL_NO_PSK
2912 /* convert the PSK key (psk_key) in ascii to binary (psk) */
2913 static int psk_key2bn(const char *pskkey, unsigned char *psk,
2914 unsigned int max_psk_len)
2919 ret = BN_hex2bn(&bn, pskkey);
2922 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey);
2927 if (BN_num_bytes(bn) > (int)max_psk_len)
2929 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
2930 max_psk_len, BN_num_bytes(bn));
2934 ret = BN_bn2bin(bn, psk);
2939 static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
2940 unsigned int max_identity_len, unsigned char *psk,
2941 unsigned int max_psk_len)
2944 unsigned int psk_len = 0;
2946 ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
2950 fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
2951 ret = psk_key2bn(psk_key, psk, max_psk_len);
2959 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
2960 unsigned char *psk, unsigned int max_psk_len)
2962 unsigned int psk_len=0;
2964 if (strcmp(identity, "Client_identity") != 0)
2966 BIO_printf(bio_err, "server: PSK error: client identity not found\n");
2969 psk_len=psk_key2bn(psk_key, psk, max_psk_len);
2974 static int do_test_cipherlist(void)
2977 const SSL_METHOD *meth;
2978 const SSL_CIPHER *ci, *tci = NULL;
2980 #ifndef OPENSSL_NO_SSL2
2981 fprintf(stderr, "testing SSLv2 cipher list order: ");
2982 meth = SSLv2_method();
2983 while ((ci = meth->get_cipher(i++)) != NULL)
2986 if (ci->id >= tci->id)
2988 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
2993 fprintf(stderr, "ok\n");
2995 #ifndef OPENSSL_NO_SSL3
2996 fprintf(stderr, "testing SSLv3 cipher list order: ");
2997 meth = SSLv3_method();
2999 while ((ci = meth->get_cipher(i++)) != NULL)
3002 if (ci->id >= tci->id)
3004 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3009 fprintf(stderr, "ok\n");
3011 #ifndef OPENSSL_NO_TLS1
3012 fprintf(stderr, "testing TLSv1 cipher list order: ");
3013 meth = TLSv1_method();
3015 while ((ci = meth->get_cipher(i++)) != NULL)
3018 if (ci->id >= tci->id)
3020 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3025 fprintf(stderr, "ok\n");