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