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
static char *cipher=NULL;
299
static int verbose=0;
308
static const char rnd_seed[] = "string to make the random number generator think it has entropy";
310
int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
311
int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
312
static int do_test_cipherlist(void);
313
static void sv_usage(void)
315
fprintf(stderr,"usage: ssltest [args ...]\n");
316
fprintf(stderr,"\n");
318
fprintf(stderr,"-F - run test in FIPS mode\n");
320
fprintf(stderr," -server_auth - check server certificate\n");
321
fprintf(stderr," -client_auth - do client authentication\n");
322
fprintf(stderr," -proxy - allow proxy certificates\n");
323
fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
324
fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
325
fprintf(stderr," -v - more output\n");
326
fprintf(stderr," -d - debug output\n");
327
fprintf(stderr," -reuse - use session-id reuse\n");
328
fprintf(stderr," -num <val> - number of connections to perform\n");
329
fprintf(stderr," -bytes <val> - number of bytes to swap between client/server\n");
330
#ifndef OPENSSL_NO_DH
331
fprintf(stderr," -dhe1024 - use 1024 bit key (safe prime) for DHE\n");
332
fprintf(stderr," -dhe1024dsa - use 1024 bit key (with 160-bit subprime) for DHE\n");
333
fprintf(stderr," -no_dhe - disable DHE\n");
335
#ifndef OPENSSL_NO_ECDH
336
fprintf(stderr," -no_ecdhe - disable ECDHE\n");
338
#ifndef OPENSSL_NO_PSK
339
fprintf(stderr," -psk arg - PSK in hex (without 0x)\n");
341
#ifndef OPENSSL_NO_SRP
342
fprintf(stderr," -srpuser user - SRP username to use\n");
343
fprintf(stderr," -srppass arg - password for 'user'\n");
345
#ifndef OPENSSL_NO_SSL2
346
fprintf(stderr," -ssl2 - use SSLv2\n");
348
#ifndef OPENSSL_NO_SSL3
349
fprintf(stderr," -ssl3 - use SSLv3\n");
351
#ifndef OPENSSL_NO_TLS1
352
fprintf(stderr," -tls1 - use TLSv1\n");
354
fprintf(stderr," -CApath arg - PEM format directory of CA's\n");
355
fprintf(stderr," -CAfile arg - PEM format file of CA's\n");
356
fprintf(stderr," -cert arg - Server certificate file\n");
357
fprintf(stderr," -key arg - Server key file (default: same as -cert)\n");
358
fprintf(stderr," -c_cert arg - Client certificate file\n");
359
fprintf(stderr," -c_key arg - Client key file (default: same as -c_cert)\n");
360
fprintf(stderr," -cipher arg - The cipher list\n");
361
fprintf(stderr," -bio_pair - Use BIO pairs\n");
362
fprintf(stderr," -f - Test even cases that can't work\n");
363
fprintf(stderr," -time - measure processor time used by client and server\n");
364
fprintf(stderr," -zlib - use zlib compression\n");
365
fprintf(stderr," -rle - use rle compression\n");
366
#ifndef OPENSSL_NO_ECDH
367
fprintf(stderr," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
368
" Use \"openssl ecparam -list_curves\" for all names\n" \
369
" (default is sect163r2).\n");
371
fprintf(stderr," -test_cipherlist - verifies the order of the ssl cipher lists\n");
374
static void print_details(SSL *c_ssl, const char *prefix)
376
const SSL_CIPHER *ciph;
379
ciph=SSL_get_current_cipher(c_ssl);
380
BIO_printf(bio_stdout,"%s%s, cipher %s %s",
382
SSL_get_version(c_ssl),
383
SSL_CIPHER_get_version(ciph),
384
SSL_CIPHER_get_name(ciph));
385
cert=SSL_get_peer_certificate(c_ssl);
388
EVP_PKEY *pkey = X509_get_pubkey(cert);
393
#ifndef OPENSSL_NO_RSA
394
else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
395
&& pkey->pkey.rsa->n != NULL)
397
BIO_printf(bio_stdout, ", %d bit RSA",
398
BN_num_bits(pkey->pkey.rsa->n));
401
#ifndef OPENSSL_NO_DSA
402
else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
403
&& pkey->pkey.dsa->p != NULL)
405
BIO_printf(bio_stdout, ", %d bit DSA",
406
BN_num_bits(pkey->pkey.dsa->p));
413
/* The SSL API does not allow us to look at temporary RSA/DH keys,
414
* otherwise we should print their lengths too */
415
BIO_printf(bio_stdout,"\n");
418
static void lock_dbg_cb(int mode, int type, const char *file, int line)
420
static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
421
const char *errstr = NULL;
424
rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
425
if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
427
errstr = "invalid mode";
431
if (type < 0 || type >= CRYPTO_NUM_LOCKS)
433
errstr = "type out of bounds";
437
if (mode & CRYPTO_LOCK)
441
errstr = "already locked";
442
/* must not happen in a single-threaded program
443
* (would deadlock) */
449
else if (mode & CRYPTO_UNLOCK)
453
errstr = "not locked";
457
if (modes[type] != rw)
459
errstr = (rw == CRYPTO_READ) ?
460
"CRYPTO_r_unlock on write lock" :
461
"CRYPTO_w_unlock on read lock";
468
errstr = "invalid mode";
475
/* we cannot use bio_err here */
476
fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
477
errstr, mode, type, file, line);
481
#ifdef TLSEXT_TYPE_opaque_prf_input
482
struct cb_info_st { void *input; size_t len; int ret; };
483
struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
484
struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
485
struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
486
struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
488
int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
490
struct cb_info_st *arg = arg_;
495
if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
501
int main(int argc, char *argv[])
503
char *CApath=NULL,*CAfile=NULL;
507
int tls1=0,ssl2=0,ssl3=0,ret=1;
510
struct app_verify_arg app_verify_arg =
511
{ APP_CALLBACK_STRING, 0, 0, NULL, NULL };
512
char *server_cert=TEST_SERVER_CERT;
513
char *server_key=NULL;
514
char *client_cert=TEST_CLIENT_CERT;
515
char *client_key=NULL;
516
#ifndef OPENSSL_NO_ECDH
517
char *named_curve = NULL;
521
const SSL_METHOD *meth=NULL;
523
int number=1,reuse=0;
525
#ifndef OPENSSL_NO_DH
527
int dhe1024 = 0, dhe1024dsa = 0;
529
#ifndef OPENSSL_NO_ECDH
532
#ifndef OPENSSL_NO_SRP
534
SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
536
SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
542
clock_t s_time = 0, c_time = 0;
544
#ifndef OPENSSL_NO_COMP
545
COMP_METHOD *cm = NULL;
547
STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
548
int test_cipherlist = 0;
557
bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);
559
CRYPTO_set_locking_callback(lock_dbg_cb);
561
/* enable memory leak checking unless explicitly disabled */
562
if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
564
CRYPTO_malloc_debug_init();
565
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
569
/* OPENSSL_DEBUG_MEMORY=off */
570
CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
572
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
574
RAND_seed(rnd_seed, sizeof rnd_seed);
576
bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
583
if(!strcmp(*argv,"-F"))
588
fprintf(stderr,"not compiled with FIPS support, so exitting without running.\n");
592
else if (strcmp(*argv,"-server_auth") == 0)
594
else if (strcmp(*argv,"-client_auth") == 0)
596
else if (strcmp(*argv,"-proxy_auth") == 0)
598
if (--argc < 1) goto bad;
599
app_verify_arg.proxy_auth= *(++argv);
601
else if (strcmp(*argv,"-proxy_cond") == 0)
603
if (--argc < 1) goto bad;
604
app_verify_arg.proxy_cond= *(++argv);
606
else if (strcmp(*argv,"-v") == 0)
608
else if (strcmp(*argv,"-d") == 0)
610
else if (strcmp(*argv,"-reuse") == 0)
612
else if (strcmp(*argv,"-dhe1024") == 0)
614
#ifndef OPENSSL_NO_DH
617
fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
620
else if (strcmp(*argv,"-dhe1024dsa") == 0)
622
#ifndef OPENSSL_NO_DH
625
fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
628
else if (strcmp(*argv,"-no_dhe") == 0)
630
else if (strcmp(*argv,"-no_ecdhe") == 0)
632
else if (strcmp(*argv,"-psk") == 0)
634
if (--argc < 1) goto bad;
636
#ifndef OPENSSL_NO_PSK
637
if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
639
BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
646
#ifndef OPENSSL_NO_SRP
647
else if (strcmp(*argv,"-srpuser") == 0)
649
if (--argc < 1) goto bad;
650
srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
653
else if (strcmp(*argv,"-srppass") == 0)
655
if (--argc < 1) goto bad;
656
srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
660
else if (strcmp(*argv,"-ssl2") == 0)
662
else if (strcmp(*argv,"-tls1") == 0)
664
else if (strcmp(*argv,"-ssl3") == 0)
666
else if (strncmp(*argv,"-num",4) == 0)
668
if (--argc < 1) goto bad;
669
number= atoi(*(++argv));
670
if (number == 0) number=1;
672
else if (strcmp(*argv,"-bytes") == 0)
674
if (--argc < 1) goto bad;
675
bytes= atol(*(++argv));
676
if (bytes == 0L) bytes=1L;
678
if (argv[0][i-1] == 'k') bytes*=1024L;
679
if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
681
else if (strcmp(*argv,"-cert") == 0)
683
if (--argc < 1) goto bad;
684
server_cert= *(++argv);
686
else if (strcmp(*argv,"-s_cert") == 0)
688
if (--argc < 1) goto bad;
689
server_cert= *(++argv);
691
else if (strcmp(*argv,"-key") == 0)
693
if (--argc < 1) goto bad;
694
server_key= *(++argv);
696
else if (strcmp(*argv,"-s_key") == 0)
698
if (--argc < 1) goto bad;
699
server_key= *(++argv);
701
else if (strcmp(*argv,"-c_cert") == 0)
703
if (--argc < 1) goto bad;
704
client_cert= *(++argv);
706
else if (strcmp(*argv,"-c_key") == 0)
708
if (--argc < 1) goto bad;
709
client_key= *(++argv);
711
else if (strcmp(*argv,"-cipher") == 0)
713
if (--argc < 1) goto bad;
716
else if (strcmp(*argv,"-CApath") == 0)
718
if (--argc < 1) goto bad;
721
else if (strcmp(*argv,"-CAfile") == 0)
723
if (--argc < 1) goto bad;
726
else if (strcmp(*argv,"-bio_pair") == 0)
730
else if (strcmp(*argv,"-f") == 0)
734
else if (strcmp(*argv,"-time") == 0)
738
else if (strcmp(*argv,"-zlib") == 0)
742
else if (strcmp(*argv,"-rle") == 0)
746
else if (strcmp(*argv,"-named_curve") == 0)
748
if (--argc < 1) goto bad;
749
#ifndef OPENSSL_NO_ECDH
750
named_curve = *(++argv);
752
fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
756
else if (strcmp(*argv,"-app_verify") == 0)
758
app_verify_arg.app_verify = 1;
760
else if (strcmp(*argv,"-proxy") == 0)
762
app_verify_arg.allow_proxy_certs = 1;
764
else if (strcmp(*argv,"-test_cipherlist") == 0)
770
fprintf(stderr,"unknown option %s\n",*argv);
784
if (test_cipherlist == 1)
786
/* ensure that the cipher list are correctly sorted and exit */
787
if (do_test_cipherlist() == 0)
793
if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
795
fprintf(stderr, "This case cannot work. Use -f to perform "
796
"the test anyway (and\n-d to see what happens), "
797
"or add one of -ssl2, -ssl3, -tls1, -reuse\n"
798
"to avoid protocol mismatch.\n");
805
if(!FIPS_mode_set(1))
807
ERR_load_crypto_strings();
808
ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
812
fprintf(stderr,"*** IN FIPS MODE ***\n");
820
fprintf(stderr, "Using BIO pair (-bio_pair)\n");
823
if (number < 50 && !force)
824
fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
827
/* if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
830
SSL_load_error_strings();
832
#ifndef OPENSSL_NO_COMP
833
if (comp == COMP_ZLIB) cm = COMP_zlib();
834
if (comp == COMP_RLE) cm = COMP_rle();
837
if (cm->type != NID_undef)
839
if (SSL_COMP_add_compression_method(comp, cm) != 0)
842
"Failed to add compression method\n");
843
ERR_print_errors_fp(stderr);
849
"Warning: %s compression not supported\n",
850
(comp == COMP_RLE ? "rle" :
851
(comp == COMP_ZLIB ? "zlib" :
853
ERR_print_errors_fp(stderr);
856
ssl_comp_methods = SSL_COMP_get_compression_methods();
857
fprintf(stderr, "Available compression methods:\n");
859
int j, n = sk_SSL_COMP_num(ssl_comp_methods);
861
fprintf(stderr, " NONE\n");
863
for (j = 0; j < n; j++)
865
SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
866
fprintf(stderr, " %d: %s\n", c->id, c->name);
871
#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
881
meth=SSLv23_method();
883
#ifdef OPENSSL_NO_SSL2
890
c_ctx=SSL_CTX_new(meth);
891
s_ctx=SSL_CTX_new(meth);
892
if ((c_ctx == NULL) || (s_ctx == NULL))
894
ERR_print_errors(bio_err);
900
SSL_CTX_set_cipher_list(c_ctx,cipher);
901
SSL_CTX_set_cipher_list(s_ctx,cipher);
904
#ifndef OPENSSL_NO_DH
909
/* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
910
SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
917
SSL_CTX_set_tmp_dh(s_ctx,dh);
924
#ifndef OPENSSL_NO_ECDH
929
if (named_curve != NULL)
931
nid = OBJ_sn2nid(named_curve);
934
BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
939
#ifdef OPENSSL_NO_EC2M
940
nid = NID_X9_62_prime256v1;
945
ecdh = EC_KEY_new_by_curve_name(nid);
948
BIO_printf(bio_err, "unable to create curve\n");
952
SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
953
SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
960
#ifndef OPENSSL_NO_RSA
961
SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
964
#ifdef TLSEXT_TYPE_opaque_prf_input
965
SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
966
SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
967
SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
968
SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
971
if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
973
ERR_print_errors(bio_err);
975
else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
976
(server_key?server_key:server_cert), SSL_FILETYPE_PEM))
978
ERR_print_errors(bio_err);
984
SSL_CTX_use_certificate_file(c_ctx,client_cert,
986
SSL_CTX_use_PrivateKey_file(c_ctx,
987
(client_key?client_key:client_cert),
991
if ( (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
992
(!SSL_CTX_set_default_verify_paths(s_ctx)) ||
993
(!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
994
(!SSL_CTX_set_default_verify_paths(c_ctx)))
996
/* fprintf(stderr,"SSL_load_verify_locations\n"); */
997
ERR_print_errors(bio_err);
1003
BIO_printf(bio_err,"client authentication\n");
1004
SSL_CTX_set_verify(s_ctx,
1005
SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1007
SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
1011
BIO_printf(bio_err,"server authentication\n");
1012
SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
1014
SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
1018
int session_id_context = 0;
1019
SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
1022
/* Use PSK only if PSK key is given */
1023
if (psk_key != NULL)
1025
/* no_psk is used to avoid putting psk command to openssl tool */
1028
/* if PSK is not compiled in and psk key is
1029
* given, do nothing and exit successfully */
1033
#ifndef OPENSSL_NO_PSK
1034
SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1035
SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1037
BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
1038
if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
1040
BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
1041
ERR_print_errors(bio_err);
1046
#ifndef OPENSSL_NO_SRP
1047
if (srp_client_arg.srplogin)
1049
if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
1051
BIO_printf(bio_err,"Unable to set SRP username\n");
1054
SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
1055
SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
1056
/*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
1059
if (srp_server_arg.expected_user != NULL)
1061
SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
1062
SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1063
SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1067
c_ssl=SSL_new(c_ctx);
1068
s_ssl=SSL_new(s_ctx);
1070
#ifndef OPENSSL_NO_KRB5
1071
if (c_ssl && c_ssl->kssl_ctx)
1073
char localhost[MAXHOSTNAMELEN+2];
1075
if (gethostname(localhost, sizeof localhost-1) == 0)
1077
localhost[sizeof localhost-1]='\0';
1078
if(strlen(localhost) == sizeof localhost-1)
1080
BIO_printf(bio_err,"localhost name too long\n");
1083
kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
1087
#endif /* OPENSSL_NO_KRB5 */
1089
for (i=0; i<number; i++)
1091
if (!reuse) SSL_set_session(c_ssl,NULL);
1093
ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
1095
ret=doit(s_ssl,c_ssl,bytes);
1100
print_details(c_ssl, "");
1102
if ((number > 1) || (bytes > 1L))
1103
BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
1106
#ifdef CLOCKS_PER_SEC
1107
/* "To determine the time in seconds, the value returned
1108
* by the clock function should be divided by the value
1109
* of the macro CLOCKS_PER_SEC."
1110
* -- ISO/IEC 9899 */
1111
BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1112
"Approximate total client time: %6.2f s\n",
1113
(double)s_time/CLOCKS_PER_SEC,
1114
(double)c_time/CLOCKS_PER_SEC);
1116
/* "`CLOCKS_PER_SEC' undeclared (first use this function)"
1117
* -- cc on NeXTstep/OpenStep */
1118
BIO_printf(bio_stdout,
1119
"Approximate total server time: %6.2f units\n"
1120
"Approximate total client time: %6.2f units\n",
1130
if (s_ctx != NULL) SSL_CTX_free(s_ctx);
1131
if (c_ctx != NULL) SSL_CTX_free(c_ctx);
1133
if (bio_stdout != NULL) BIO_free(bio_stdout);
1135
#ifndef OPENSSL_NO_RSA
1138
#ifndef OPENSSL_NO_ENGINE
1141
CRYPTO_cleanup_all_ex_data();
1143
ERR_remove_thread_state(NULL);
1145
CRYPTO_mem_leaks(bio_err);
1146
if (bio_err != NULL) BIO_free(bio_err);
1151
int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
1152
clock_t *s_time, clock_t *c_time)
1154
long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1155
BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1156
BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
1159
size_t bufsiz = 256; /* small buffer for testing */
1161
if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
1163
if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
1166
s_ssl_bio = BIO_new(BIO_f_ssl());
1170
c_ssl_bio = BIO_new(BIO_f_ssl());
1174
SSL_set_connect_state(c_ssl);
1175
SSL_set_bio(c_ssl, client, client);
1176
(void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1178
SSL_set_accept_state(s_ssl);
1179
SSL_set_bio(s_ssl, server, server);
1180
(void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1184
/* c_ssl_bio: SSL filter BIO
1186
* client: pseudo-I/O for SSL library
1188
* client_io: client's SSL communication; usually to be
1189
* relayed over some I/O facility, but in this
1190
* test program, we're the server, too:
1192
* server_io: server's SSL communication
1194
* server: pseudo-I/O for SSL library
1196
* s_ssl_bio: SSL filter BIO
1198
* The client and the server each employ a "BIO pair":
1199
* client + client_io, server + server_io.
1200
* BIO pairs are symmetric. A BIO pair behaves similar
1201
* to a non-blocking socketpair (but both endpoints must
1202
* be handled by the same thread).
1203
* [Here we could connect client and server to the ends
1204
* of a single BIO pair, but then this code would be less
1205
* suitable as an example for BIO pairs in general.]
1207
* Useful functions for querying the state of BIO pair endpoints:
1209
* BIO_ctrl_pending(bio) number of bytes we can read now
1210
* BIO_ctrl_get_read_request(bio) number of bytes needed to fulfil
1211
* other side's read attempt
1212
* BIO_ctrl_get_write_guarantee(bio) number of bytes we can write now
1214
* ..._read_request is never more than ..._write_guarantee;
1215
* it depends on the application which one you should use.
1218
/* We have non-blocking behaviour throughout this test program, but
1219
* can be sure that there is *some* progress in each iteration; so
1220
* we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
1221
* -- we just try everything in each iteration
1227
MS_STATIC char cbuf[1024*8];
1229
clock_t c_clock = clock();
1231
memset(cbuf, 0, sizeof(cbuf));
1234
if (SSL_in_init(c_ssl))
1235
printf("client waiting in SSL_connect - %s\n",
1236
SSL_state_string_long(c_ssl));
1240
/* Write to server. */
1242
if (cw_num > (long)sizeof cbuf)
1246
r = BIO_write(c_ssl_bio, cbuf, i);
1249
if (!BIO_should_retry(c_ssl_bio))
1251
fprintf(stderr,"ERROR in CLIENT\n");
1254
/* BIO_should_retry(...) can just be ignored here.
1255
* The library expects us to call BIO_write with
1256
* the same arguments again, and that's what we will
1257
* do in the next iteration. */
1261
fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1267
printf("client wrote %d\n", r);
1274
/* Read from server. */
1276
r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
1279
if (!BIO_should_retry(c_ssl_bio))
1281
fprintf(stderr,"ERROR in CLIENT\n");
1284
/* Again, "BIO_should_retry" can be ignored. */
1288
fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1294
printf("client read %d\n", r);
1299
/* c_time and s_time increments will typically be very small
1300
* (depending on machine speed and clock tick intervals),
1301
* but sampling over a large number of connections should
1302
* result in fairly accurate figures. We cannot guarantee
1303
* a lot, however -- if each connection lasts for exactly
1304
* one clock tick, it will be counted only for the client
1305
* or only for the server or even not at all.
1307
*c_time += (clock() - c_clock);
1313
MS_STATIC char sbuf[1024*8];
1315
clock_t s_clock = clock();
1317
memset(sbuf, 0, sizeof(sbuf));
1320
if (SSL_in_init(s_ssl))
1321
printf("server waiting in SSL_accept - %s\n",
1322
SSL_state_string_long(s_ssl));
1326
/* Write to client. */
1328
if (sw_num > (long)sizeof sbuf)
1332
r = BIO_write(s_ssl_bio, sbuf, i);
1335
if (!BIO_should_retry(s_ssl_bio))
1337
fprintf(stderr,"ERROR in SERVER\n");
1340
/* Ignore "BIO_should_retry". */
1344
fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1350
printf("server wrote %d\n", r);
1357
/* Read from client. */
1359
r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
1362
if (!BIO_should_retry(s_ssl_bio))
1364
fprintf(stderr,"ERROR in SERVER\n");
1371
fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
1377
printf("server read %d\n", r);
1382
*s_time += (clock() - s_clock);
1386
/* "I/O" BETWEEN CLIENT AND SERVER. */
1389
BIO *io1 = server_io, *io2 = client_io;
1390
/* we use the non-copying interface for io1
1391
* and the standard BIO_write/BIO_read interface for io2
1394
static int prev_progress = 1;
1403
r1 = BIO_ctrl_pending(io1);
1404
r2 = BIO_ctrl_get_write_guarantee(io2);
1413
if (INT_MAX < num) /* yeah, right */
1416
r = BIO_nread(io1, &dataptr, (int)num);
1418
assert(r <= (int)num);
1419
/* possibly r < num (non-contiguous data) */
1421
r = BIO_write(io2, dataptr, (int)num);
1422
if (r != (int)num) /* can't happen */
1424
fprintf(stderr, "ERROR: BIO_write could not write "
1425
"BIO_ctrl_get_write_guarantee() bytes");
1431
printf((io1 == client_io) ?
1432
"C->S relaying: %d bytes\n" :
1433
"S->C relaying: %d bytes\n",
1444
r1 = BIO_ctrl_pending(io2);
1445
r2 = BIO_ctrl_get_read_request(io1);
1446
/* here we could use ..._get_write_guarantee instead of
1447
* ..._get_read_request, but by using the latter
1448
* we test restartability of the SSL implementation
1449
* more thoroughly */
1461
--num; /* test restartability even more thoroughly */
1463
r = BIO_nwrite0(io1, &dataptr);
1467
r = BIO_read(io2, dataptr, (int)num);
1468
if (r != (int)num) /* can't happen */
1470
fprintf(stderr, "ERROR: BIO_read could not read "
1471
"BIO_ctrl_pending() bytes");
1475
r = BIO_nwrite(io1, &dataptr, (int)num);
1476
if (r != (int)num) /* can't happen */
1478
fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
1479
"BIO_nwrite0() bytes");
1484
printf((io2 == client_io) ?
1485
"C->S relaying: %d bytes\n" :
1486
"S->C relaying: %d bytes\n",
1489
} /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
1491
if (!progress && !prev_progress)
1492
if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
1494
fprintf(stderr, "ERROR: got stuck\n");
1495
if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
1497
fprintf(stderr, "This can happen for SSL2 because "
1498
"CLIENT-FINISHED and SERVER-VERIFY are written \n"
1499
"concurrently ...");
1500
if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
1501
&& strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
1503
fprintf(stderr, " ok.\n");
1507
fprintf(stderr, " ERROR.\n");
1510
prev_progress = progress;
1513
while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
1516
print_details(c_ssl, "DONE via BIO pair: ");
1521
ERR_print_errors(bio_err);
1526
BIO_free(server_io);
1530
BIO_free(client_io);
1532
BIO_free(s_ssl_bio);
1534
BIO_free(c_ssl_bio);
1545
int doit(SSL *s_ssl, SSL *c_ssl, long count)
1547
MS_STATIC char cbuf[1024*8],sbuf[1024*8];
1548
long cw_num=count,cr_num=count;
1549
long sw_num=count,sr_num=count;
1555
int c_r,c_w,s_r,s_w;
1558
int c_write,s_write;
1559
int do_server=0,do_client=0;
1561
memset(cbuf,0,sizeof(cbuf));
1562
memset(sbuf,0,sizeof(sbuf));
1564
c_to_s=BIO_new(BIO_s_mem());
1565
s_to_c=BIO_new(BIO_s_mem());
1566
if ((s_to_c == NULL) || (c_to_s == NULL))
1568
ERR_print_errors(bio_err);
1572
c_bio=BIO_new(BIO_f_ssl());
1573
s_bio=BIO_new(BIO_f_ssl());
1574
if ((c_bio == NULL) || (s_bio == NULL))
1576
ERR_print_errors(bio_err);
1580
SSL_set_connect_state(c_ssl);
1581
SSL_set_bio(c_ssl,s_to_c,c_to_s);
1582
BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
1584
SSL_set_accept_state(s_ssl);
1585
SSL_set_bio(s_ssl,c_to_s,s_to_c);
1586
BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
1590
c_write=1,s_write=0;
1592
/* We can always do writes */
1598
i=(int)BIO_pending(s_bio);
1599
if ((i && s_r) || s_w) do_server=1;
1601
i=(int)BIO_pending(c_bio);
1602
if ((i && c_r) || c_w) do_client=1;
1604
if (do_server && debug)
1606
if (SSL_in_init(s_ssl))
1607
printf("server waiting in SSL_accept - %s\n",
1608
SSL_state_string_long(s_ssl));
1609
/* else if (s_write)
1610
printf("server:SSL_write()\n");
1612
printf("server:SSL_read()\n"); */
1615
if (do_client && debug)
1617
if (SSL_in_init(c_ssl))
1618
printf("client waiting in SSL_connect - %s\n",
1619
SSL_state_string_long(c_ssl));
1620
/* else if (c_write)
1621
printf("client:SSL_write()\n");
1623
printf("client:SSL_read()\n"); */
1626
if (!do_client && !do_server)
1628
fprintf(stdout,"ERROR IN STARTUP\n");
1629
ERR_print_errors(bio_err);
1632
if (do_client && !(done & C_DONE))
1636
j = (cw_num > (long)sizeof(cbuf)) ?
1637
(int)sizeof(cbuf) : (int)cw_num;
1638
i=BIO_write(c_bio,cbuf,j);
1643
if (BIO_should_retry(c_bio))
1645
if (BIO_should_read(c_bio))
1647
if (BIO_should_write(c_bio))
1652
fprintf(stderr,"ERROR in CLIENT\n");
1653
ERR_print_errors(bio_err);
1659
fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1665
printf("client wrote %d\n",i);
1674
i=BIO_read(c_bio,cbuf,sizeof(cbuf));
1679
if (BIO_should_retry(c_bio))
1681
if (BIO_should_read(c_bio))
1683
if (BIO_should_write(c_bio))
1688
fprintf(stderr,"ERROR in CLIENT\n");
1689
ERR_print_errors(bio_err);
1695
fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1701
printf("client read %d\n",i);
1718
if (do_server && !(done & S_DONE))
1722
i=BIO_read(s_bio,sbuf,sizeof(cbuf));
1727
if (BIO_should_retry(s_bio))
1729
if (BIO_should_read(s_bio))
1731
if (BIO_should_write(s_bio))
1736
fprintf(stderr,"ERROR in SERVER\n");
1737
ERR_print_errors(bio_err);
1743
ERR_print_errors(bio_err);
1744
fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
1750
printf("server read %d\n",i);
1767
j = (sw_num > (long)sizeof(sbuf)) ?
1768
(int)sizeof(sbuf) : (int)sw_num;
1769
i=BIO_write(s_bio,sbuf,j);
1774
if (BIO_should_retry(s_bio))
1776
if (BIO_should_read(s_bio))
1778
if (BIO_should_write(s_bio))
1783
fprintf(stderr,"ERROR in SERVER\n");
1784
ERR_print_errors(bio_err);
1790
ERR_print_errors(bio_err);
1791
fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
1797
printf("server wrote %d\n",i);
1807
if ((done & S_DONE) && (done & C_DONE)) break;
1811
print_details(c_ssl, "DONE: ");
1814
/* We have to set the BIO's to NULL otherwise they will be
1815
* OPENSSL_free()ed twice. Once when th s_ssl is SSL_free()ed and
1816
* again when c_ssl is SSL_free()ed.
1817
* This is a hack required because s_ssl and c_ssl are sharing the same
1818
* BIO structure and SSL_set_bio() and SSL_free() automatically
1819
* BIO_free non NULL entries.
1820
* You should not normally do this or be required to do this */
1832
if (c_to_s != NULL) BIO_free(c_to_s);
1833
if (s_to_c != NULL) BIO_free(s_to_c);
1834
if (c_bio != NULL) BIO_free_all(c_bio);
1835
if (s_bio != NULL) BIO_free_all(s_bio);
1839
static int get_proxy_auth_ex_data_idx(void)
1841
static volatile int idx = -1;
1844
CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
1847
idx = X509_STORE_CTX_get_ex_new_index(0,
1848
"SSLtest for verify callback", NULL,NULL,NULL);
1850
CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
1855
static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
1859
s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
1864
fprintf(stderr,"depth=%d %s\n",
1865
ctx->error_depth,buf);
1868
fprintf(stderr,"depth=%d error=%d %s\n",
1869
ctx->error_depth,ctx->error,buf);
1875
fprintf(stderr,"Error string: %s\n",
1876
X509_verify_cert_error_string(ctx->error));
1879
case X509_V_ERR_CERT_NOT_YET_VALID:
1880
case X509_V_ERR_CERT_HAS_EXPIRED:
1881
case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
1882
fprintf(stderr," ... ignored.\n");
1889
X509 *xs = ctx->current_cert;
1891
X509 *xi = ctx->current_issuer;
1894
if (xs->ex_flags & EXFLAG_PROXY)
1896
unsigned int *letters =
1897
X509_STORE_CTX_get_ex_data(ctx,
1898
get_proxy_auth_ex_data_idx());
1904
PROXY_CERT_INFO_EXTENSION *pci =
1905
X509_get_ext_d2i(xs, NID_proxyCertInfo,
1908
switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
1910
case NID_Independent:
1911
/* Completely meaningless in this
1912
program, as there's no way to
1913
grant explicit rights to a
1914
specific PrC. Basically, using
1915
id-ppl-Independent is the perfect
1916
way to grant no rights at all. */
1917
fprintf(stderr, " Independent proxy certificate");
1918
for (i = 0; i < 26; i++)
1921
case NID_id_ppl_inheritAll:
1922
/* This is basically a NOP, we
1923
simply let the current rights
1924
stand as they are. */
1925
fprintf(stderr, " Proxy certificate inherits all");
1929
pci->proxyPolicy->policy->data;
1930
i = pci->proxyPolicy->policy->length;
1932
/* The algorithm works as follows:
1933
it is assumed that previous
1934
iterations or the initial granted
1935
rights has already set some elements
1936
of `letters'. What we need to do is
1937
to clear those that weren't granted
1938
by the current PrC as well. The
1939
easiest way to do this is to add 1
1940
to all the elements whose letters
1941
are given with the current policy.
1942
That way, all elements that are set
1943
by the current policy and were
1944
already set by earlier policies and
1945
through the original grant of rights
1946
will get the value 2 or higher.
1947
The last thing to do is to sweep
1948
through `letters' and keep the
1949
elements having the value 2 as set,
1950
and clear all the others. */
1952
fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s);
1956
if (isascii(c) && isalpha(c))
1963
for (i = 0; i < 26; i++)
1972
", resulting proxy rights = ");
1973
for(i = 0; i < 26; i++)
1976
fprintf(stderr, "%c", i + 'A');
1980
fprintf(stderr, "none");
1981
fprintf(stderr, "\n");
1983
PROXY_CERT_INFO_EXTENSION_free(pci);
1991
static void process_proxy_debug(int indent, const char *format, ...)
1993
static const char indentation[] =
1994
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
1995
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
1996
char my_format[256];
1999
BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2000
indent, indent, indentation, format);
2002
va_start(args, format);
2003
vfprintf(stderr, my_format, args);
2011
static int process_proxy_cond_adders(unsigned int letters[26],
2012
const char *cond, const char **cond_end, int *pos, int indent);
2013
static int process_proxy_cond_val(unsigned int letters[26],
2014
const char *cond, const char **cond_end, int *pos, int indent)
2020
while(isspace((int)*cond))
2027
process_proxy_debug(indent,
2028
"Start process_proxy_cond_val at position %d: %s\n",
2035
while(isspace((int)*cond))
2045
ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
2050
while(isspace((int)*cond))
2058
"Weird condition character in position %d: "
2065
else if (isascii(c) && isalpha(c))
2069
ok = letters[c - 'A'];
2075
"Weird condition character in position %d: "
2082
if (ok >= 0 && negate)
2086
process_proxy_debug(indent,
2087
"End process_proxy_cond_val at position %d: %s, returning %d\n",
2092
static int process_proxy_cond_multipliers(unsigned int letters[26],
2093
const char *cond, const char **cond_end, int *pos, int indent)
2099
process_proxy_debug(indent,
2100
"Start process_proxy_cond_multipliers at position %d: %s\n",
2103
ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
2110
while(isspace((int)*cond))
2124
ok = process_proxy_cond_val(letters,
2125
cond, cond_end, pos, indent + 1);
2139
fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2151
process_proxy_debug(indent,
2152
"End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
2158
static int process_proxy_cond_adders(unsigned int letters[26],
2159
const char *cond, const char **cond_end, int *pos, int indent)
2165
process_proxy_debug(indent,
2166
"Start process_proxy_cond_adders at position %d: %s\n",
2169
ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
2177
while(isspace((int)*cond))
2190
ok = process_proxy_cond_multipliers(letters,
2191
cond, cond_end, pos, indent + 1);
2202
fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2214
process_proxy_debug(indent,
2215
"End process_proxy_cond_adders at position %d: %s, returning %d\n",
2222
static int process_proxy_cond(unsigned int letters[26],
2223
const char *cond, const char **cond_end)
2226
return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
2229
static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
2232
struct app_verify_arg *cb_arg = arg;
2233
unsigned int letters[26]; /* only used with proxy_auth */
2235
if (cb_arg->app_verify)
2237
char *s = NULL,buf[256];
2239
fprintf(stderr, "In app_verify_callback, allowing cert. ");
2240
fprintf(stderr, "Arg is: %s\n", cb_arg->string);
2241
fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
2242
(void *)ctx, (void *)ctx->cert);
2244
s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
2247
fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
2251
if (cb_arg->proxy_auth)
2253
int found_any = 0, i;
2256
for(i = 0; i < 26; i++)
2258
for(sp = cb_arg->proxy_auth; *sp; sp++)
2261
if (isascii(c) && isalpha(c))
2265
letters[c - 'A'] = 1;
2270
" Initial proxy rights = ");
2271
for(i = 0; i < 26; i++)
2274
fprintf(stderr, "%c", i + 'A');
2278
fprintf(stderr, "none");
2279
fprintf(stderr, "\n");
2281
X509_STORE_CTX_set_ex_data(ctx,
2282
get_proxy_auth_ex_data_idx(),letters);
2284
if (cb_arg->allow_proxy_certs)
2286
X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
2289
#ifndef OPENSSL_NO_X509_VERIFY
2290
ok = X509_verify_cert(ctx);
2293
if (cb_arg->proxy_auth)
2297
const char *cond_end = NULL;
2299
ok = process_proxy_cond(letters,
2300
cb_arg->proxy_cond, &cond_end);
2306
fprintf(stderr, "Stopped processing condition before it's end.\n");
2310
fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
2311
cb_arg->proxy_cond);
2313
fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
2314
cb_arg->proxy_cond);
2320
#ifndef OPENSSL_NO_RSA
2321
static RSA *rsa_tmp=NULL;
2323
static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
2326
if (rsa_tmp == NULL)
2329
rsa_tmp = RSA_new();
2330
if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
2332
BIO_printf(bio_err, "Memory error...");
2335
BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
2336
(void)BIO_flush(bio_err);
2337
if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
2339
BIO_printf(bio_err, "Error generating key.");
2344
BIO_printf(bio_err,"\n");
2345
(void)BIO_flush(bio_err);
2351
static void free_tmp_rsa(void)
2353
if (rsa_tmp != NULL)
2361
#ifndef OPENSSL_NO_DH
2362
/* These DH parameters have been generated as follows:
2363
* $ openssl dhparam -C -noout 512
2364
* $ openssl dhparam -C -noout 1024
2365
* $ openssl dhparam -C -noout -dsaparam 1024
2366
* (The third function has been renamed to avoid name conflicts.)
2368
static DH *get_dh512()
2370
static unsigned char dh512_p[]={
2371
0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
2372
0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
2373
0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
2374
0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
2375
0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
2376
0x02,0xC5,0xAE,0x23,
2378
static unsigned char dh512_g[]={
2383
if ((dh=DH_new()) == NULL) return(NULL);
2384
dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
2385
dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
2386
if ((dh->p == NULL) || (dh->g == NULL))
2387
{ DH_free(dh); return(NULL); }
2391
static DH *get_dh1024()
2393
static unsigned char dh1024_p[]={
2394
0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
2395
0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
2396
0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
2397
0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
2398
0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
2399
0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
2400
0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
2401
0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
2402
0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
2403
0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
2404
0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
2406
static unsigned char dh1024_g[]={
2411
if ((dh=DH_new()) == NULL) return(NULL);
2412
dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
2413
dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
2414
if ((dh->p == NULL) || (dh->g == NULL))
2415
{ DH_free(dh); return(NULL); }
2419
static DH *get_dh1024dsa()
2421
static unsigned char dh1024_p[]={
2422
0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
2423
0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
2424
0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
2425
0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
2426
0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
2427
0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
2428
0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
2429
0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
2430
0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
2431
0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
2432
0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
2434
static unsigned char dh1024_g[]={
2435
0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
2436
0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
2437
0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
2438
0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
2439
0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
2440
0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
2441
0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
2442
0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
2443
0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
2444
0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
2445
0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
2449
if ((dh=DH_new()) == NULL) return(NULL);
2450
dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
2451
dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
2452
if ((dh->p == NULL) || (dh->g == NULL))
2453
{ DH_free(dh); return(NULL); }
2459
#ifndef OPENSSL_NO_PSK
2460
/* convert the PSK key (psk_key) in ascii to binary (psk) */
2461
static int psk_key2bn(const char *pskkey, unsigned char *psk,
2462
unsigned int max_psk_len)
2467
ret = BN_hex2bn(&bn, pskkey);
2470
BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey);
2475
if (BN_num_bytes(bn) > (int)max_psk_len)
2477
BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
2478
max_psk_len, BN_num_bytes(bn));
2482
ret = BN_bn2bin(bn, psk);
2487
static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
2488
unsigned int max_identity_len, unsigned char *psk,
2489
unsigned int max_psk_len)
2492
unsigned int psk_len = 0;
2494
ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
2498
fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
2499
ret = psk_key2bn(psk_key, psk, max_psk_len);
2507
static unsigned int psk_server_callback(SSL *ssl, const char *identity,
2508
unsigned char *psk, unsigned int max_psk_len)
2510
unsigned int psk_len=0;
2512
if (strcmp(identity, "Client_identity") != 0)
2514
BIO_printf(bio_err, "server: PSK error: client identity not found\n");
2517
psk_len=psk_key2bn(psk_key, psk, max_psk_len);
2522
static int do_test_cipherlist(void)
2525
const SSL_METHOD *meth;
2526
const SSL_CIPHER *ci, *tci = NULL;
2528
#ifndef OPENSSL_NO_SSL2
2529
fprintf(stderr, "testing SSLv2 cipher list order: ");
2530
meth = SSLv2_method();
2531
while ((ci = meth->get_cipher(i++)) != NULL)
2534
if (ci->id >= tci->id)
2536
fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
2541
fprintf(stderr, "ok\n");
2543
#ifndef OPENSSL_NO_SSL3
2544
fprintf(stderr, "testing SSLv3 cipher list order: ");
2545
meth = SSLv3_method();
2547
while ((ci = meth->get_cipher(i++)) != NULL)
2550
if (ci->id >= tci->id)
2552
fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
2557
fprintf(stderr, "ok\n");
2559
#ifndef OPENSSL_NO_TLS1
2560
fprintf(stderr, "testing TLSv1 cipher list order: ");
2561
meth = TLSv1_method();
2563
while ((ci = meth->get_cipher(i++)) != NULL)
2566
if (ci->id >= tci->id)
2568
fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
2573
fprintf(stderr, "ok\n");