Update custom TLS extension and supplemental data 'generate' callbacks to support...
[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 #ifndef OPENSSL_NO_SRP
185 #include <openssl/srp.h>
186 #endif
187 #include <openssl/bn.h>
188
189 #define _XOPEN_SOURCE_EXTENDED  1 /* Or gethostname won't be declared properly
190                                      on Compaq platforms (at least with DEC C).
191                                      Do not try to put it earlier, or IPv6 includes
192                                      get screwed...
193                                   */
194
195 #ifdef OPENSSL_SYS_WINDOWS
196 #include <winsock.h>
197 #else
198 #include OPENSSL_UNISTD
199 #endif
200
201 #ifdef OPENSSL_SYS_VMS
202 #  define TEST_SERVER_CERT "SYS$DISK:[-.APPS]SERVER.PEM"
203 #  define TEST_CLIENT_CERT "SYS$DISK:[-.APPS]CLIENT.PEM"
204 #elif defined(OPENSSL_SYS_WINCE)
205 #  define TEST_SERVER_CERT "\\OpenSSL\\server.pem"
206 #  define TEST_CLIENT_CERT "\\OpenSSL\\client.pem"
207 #elif defined(OPENSSL_SYS_NETWARE)
208 #  define TEST_SERVER_CERT "\\openssl\\apps\\server.pem"
209 #  define TEST_CLIENT_CERT "\\openssl\\apps\\client.pem"
210 #else
211 #  define TEST_SERVER_CERT "../apps/server.pem"
212 #  define TEST_CLIENT_CERT "../apps/client.pem"
213 #endif
214
215 /* There is really no standard for this, so let's assign some tentative
216    numbers.  In any case, these numbers are only for this test */
217 #define COMP_RLE        255
218 #define COMP_ZLIB       1
219
220 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
221 #ifndef OPENSSL_NO_RSA
222 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
223 static void free_tmp_rsa(void);
224 #endif
225 static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg);
226 #define APP_CALLBACK_STRING "Test Callback Argument"
227 struct app_verify_arg
228         {
229         char *string;
230         int app_verify;
231         int allow_proxy_certs;
232         char *proxy_auth;
233         char *proxy_cond;
234         };
235
236 #ifndef OPENSSL_NO_DH
237 static DH *get_dh512(void);
238 static DH *get_dh1024(void);
239 static DH *get_dh1024dsa(void);
240 #endif
241
242
243 static char *psk_key=NULL; /* by default PSK is not used */
244 #ifndef OPENSSL_NO_PSK
245 static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
246         unsigned int max_identity_len, unsigned char *psk,
247         unsigned int max_psk_len);
248 static unsigned int psk_server_callback(SSL *ssl, const char *identity, unsigned char *psk,
249         unsigned int max_psk_len);
250 #endif
251
252 #ifndef OPENSSL_NO_SRP
253 /* SRP client */
254 /* This is a context that we pass to all callbacks */
255 typedef struct srp_client_arg_st
256         {
257         char *srppassin;
258         char *srplogin;
259         } SRP_CLIENT_ARG;
260
261 #define PWD_STRLEN 1024
262
263 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
264         {
265         SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
266         return BUF_strdup((char *)srp_client_arg->srppassin);
267         }
268
269 /* SRP server */
270 /* This is a context that we pass to SRP server callbacks */
271 typedef struct srp_server_arg_st
272         {
273         char *expected_user;
274         char *pass;
275         } SRP_SERVER_ARG;
276
277 static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
278         {
279         SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;
280
281         if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0)
282                 {
283                 fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s));
284                 return SSL3_AL_FATAL;
285                 }
286         if (SSL_set_srp_server_param_pw(s,p->expected_user,p->pass,"1024")<0)
287                 {
288                 *ad = SSL_AD_INTERNAL_ERROR;
289                 return SSL3_AL_FATAL;
290                 }
291         return SSL_ERROR_NONE;
292         }
293 #endif
294
295 static BIO *bio_err=NULL;
296 static BIO *bio_stdout=NULL;
297
298 static const char *alpn_client;
299 static const char *alpn_server;
300 static const char *alpn_expected;
301 static unsigned char *alpn_selected;
302
303 /* next_protos_parse parses a comma separated list of strings into a string
304  * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
305  *   outlen: (output) set to the length of the resulting buffer on success.
306  *   err: (maybe NULL) on failure, an error message line is written to this BIO.
307  *   in: a NUL termianted string like "abc,def,ghi"
308  *
309  *   returns: a malloced buffer or NULL on failure.
310  */
311 static unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
312         {
313         size_t len;
314         unsigned char *out;
315         size_t i, start = 0;
316
317         len = strlen(in);
318         if (len >= 65535)
319                 return NULL;
320
321         out = OPENSSL_malloc(strlen(in) + 1);
322         if (!out)
323                 return NULL;
324
325         for (i = 0; i <= len; ++i)
326                 {
327                 if (i == len || in[i] == ',')
328                         {
329                         if (i - start > 255)
330                                 {
331                                 OPENSSL_free(out);
332                                 return NULL;
333                                 }
334                         out[start] = i - start;
335                         start = i + 1;
336                         }
337                 else
338                         out[i+1] = in[i];
339                 }
340
341         *outlen = len + 1;
342         return out;
343         }
344
345 static int cb_server_alpn(SSL *s, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
346         {
347         unsigned char *protos;
348         unsigned short protos_len;
349
350         protos = next_protos_parse(&protos_len, alpn_server);
351         if (protos == NULL)
352                 {
353                 fprintf(stderr, "failed to parser ALPN server protocol string: %s\n", alpn_server);
354                 abort();
355                 }
356
357         if (SSL_select_next_proto((unsigned char**) out, outlen, protos, protos_len, in, inlen) !=
358             OPENSSL_NPN_NEGOTIATED)
359                 {
360                 OPENSSL_free(protos);
361                 return SSL_TLSEXT_ERR_NOACK;
362                 }
363
364         /* Make a copy of the selected protocol which will be freed in verify_alpn. */
365         alpn_selected = OPENSSL_malloc(*outlen);
366         memcpy(alpn_selected, *out, *outlen);
367         *out = alpn_selected;
368
369         OPENSSL_free(protos);
370         return SSL_TLSEXT_ERR_OK;
371         }
372
373 static int verify_alpn(SSL *client, SSL *server)
374         {
375         const unsigned char *client_proto, *server_proto;
376         unsigned int client_proto_len = 0, server_proto_len = 0;
377         SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
378         SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
379
380         if (alpn_selected != NULL)
381                 {
382                 OPENSSL_free(alpn_selected);
383                 alpn_selected = NULL;
384                 }
385
386         if (client_proto_len != server_proto_len ||
387             memcmp(client_proto, server_proto, client_proto_len) != 0)
388                 {
389                 BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
390                 goto err;
391                 }
392
393         if (client_proto_len > 0 && alpn_expected == NULL)
394                 {
395                 BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
396                 goto err;
397                 }
398
399         if (alpn_expected != NULL &&
400             (client_proto_len != strlen(alpn_expected) ||
401              memcmp(client_proto, alpn_expected, client_proto_len) != 0))
402                 {
403                 BIO_printf(bio_stdout, "ALPN selected protocols not equal to expected protocol: %s\n", alpn_expected);
404                 goto err;
405                 }
406
407         return 0;
408
409 err:
410         BIO_printf(bio_stdout, "ALPN results: client: '");
411         BIO_write(bio_stdout, client_proto, client_proto_len);
412         BIO_printf(bio_stdout, "', server: '");
413         BIO_write(bio_stdout, server_proto, server_proto_len);
414         BIO_printf(bio_stdout, "'\n");
415         BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '%s'\n", alpn_client, alpn_server);
416         return -1;
417         }
418
419 #define SCT_EXT_TYPE 18
420
421 /* WARNING : below extension types are *NOT* IETF assigned, and 
422    could conflict if these types are reassigned and handled 
423    specially by OpenSSL in the future */
424 #define TACK_EXT_TYPE 62208
425 #define CUSTOM_EXT_TYPE_0 1000
426 #define CUSTOM_EXT_TYPE_1 1001
427 #define CUSTOM_EXT_TYPE_2 1002
428 #define CUSTOM_EXT_TYPE_3 1003
429
430 const char custom_ext_cli_string[] = "abc";
431 const char custom_ext_srv_string[] = "defg";
432
433 /* These set from cmdline */
434 char* serverinfo_file = NULL;
435 int serverinfo_sct = 0;
436 int serverinfo_tack = 0;
437
438 /* These set based on extension callbacks */
439 int serverinfo_sct_seen = 0;
440 int serverinfo_tack_seen = 0;
441 int serverinfo_other_seen = 0;
442
443 /* This set from cmdline */
444 int custom_ext = 0;
445
446 /* This set based on extension callbacks */
447 int custom_ext_error = 0;
448
449 /*Not IETF assigned supplemental data types*/
450 #define CUSTOM_SUPP_DATA_TYPE_0 100
451 #define CUSTOM_SUPP_DATA_TYPE_1 101
452 #define CUSTOM_SUPP_DATA_TYPE_2 102
453
454 const char supp_data_0_string[] = "00000";
455
456 int suppdata = 0;
457 int suppdata_error = 0;
458
459 static int serverinfo_cli_cb(SSL* s, unsigned short ext_type,
460                              const unsigned char* in, unsigned short inlen, 
461                              int* al, void* arg)
462         {
463         if (ext_type == SCT_EXT_TYPE)
464                 serverinfo_sct_seen++;
465         else if (ext_type == TACK_EXT_TYPE)
466                 serverinfo_tack_seen++;
467         else
468                 serverinfo_other_seen++;
469         return 1;
470         }
471
472 static int verify_serverinfo()
473         {
474         if (serverinfo_sct != serverinfo_sct_seen)
475                 return -1;
476         if (serverinfo_tack != serverinfo_tack_seen)
477                 return -1;
478         if (serverinfo_other_seen)
479                 return -1;
480         return 0;
481         }
482
483 /* Four test cases for custom extensions:
484  * 0 - no ClientHello extension or ServerHello response
485  * 1 - ClientHello with "abc", no response
486  * 2 - ClientHello with "abc", empty response
487  * 3 - ClientHello with "abc", "defg" response
488  */
489
490 static int custom_ext_0_cli_first_cb(SSL *s, unsigned short ext_type,
491                                      const unsigned char **out,
492                                      unsigned short *outlen, int *al, void *arg)
493         {
494         if (ext_type != CUSTOM_EXT_TYPE_0)
495                 custom_ext_error = 1;
496         return -1;  /* Don't send an extension */
497         }
498
499 static int custom_ext_0_cli_second_cb(SSL *s, unsigned short ext_type,
500                                       const unsigned char *in,
501                                       unsigned short inlen, int *al,
502                                       void *arg)
503         {
504         custom_ext_error = 1; /* Shouldn't be called */
505         return 0;
506         }
507
508 static int custom_ext_1_cli_first_cb(SSL *s, unsigned short ext_type,
509                                      const unsigned char **out,
510                                      unsigned short *outlen, int *al, void *arg)
511         {
512         if (ext_type != CUSTOM_EXT_TYPE_1)
513                 custom_ext_error = 1;
514         *out = (const unsigned char*)custom_ext_cli_string;
515         *outlen = strlen(custom_ext_cli_string);
516         return 1; /* Send "abc" */
517         }
518
519 static int custom_ext_1_cli_second_cb(SSL *s, unsigned short ext_type,
520                                       const unsigned char *in,
521                                       unsigned short inlen, int *al,
522                                       void *arg)
523         {
524         custom_ext_error = 1; /* Shouldn't be called */
525         return 0;
526         }
527
528 static int custom_ext_2_cli_first_cb(SSL *s, unsigned short ext_type,
529                                      const unsigned char **out,
530                                      unsigned short *outlen, int *al, void *arg)
531         {
532         if (ext_type != CUSTOM_EXT_TYPE_2)
533                 custom_ext_error = 1;
534         *out = (const unsigned char*)custom_ext_cli_string;
535         *outlen = strlen(custom_ext_cli_string);
536         return 1; /* Send "abc" */
537         }
538
539 static int custom_ext_2_cli_second_cb(SSL *s, unsigned short ext_type,
540                                       const unsigned char *in,
541                                       unsigned short inlen, int *al,
542                                       void *arg)
543         {
544         if (ext_type != CUSTOM_EXT_TYPE_2)
545                 custom_ext_error = 1;
546         if (inlen != 0)
547                 custom_ext_error = 1; /* Should be empty response */
548         return 1;
549         }
550
551 static int custom_ext_3_cli_first_cb(SSL *s, unsigned short ext_type,
552                                      const unsigned char **out,
553                                      unsigned short *outlen, int *al, void *arg)
554         {
555         if (ext_type != CUSTOM_EXT_TYPE_3)
556                 custom_ext_error = 1;
557         *out = (const unsigned char*)custom_ext_cli_string;
558         *outlen = strlen(custom_ext_cli_string);
559         return 1; /* Send "abc" */
560         }
561
562 static int custom_ext_3_cli_second_cb(SSL *s, unsigned short ext_type,
563                                       const unsigned char *in,
564                                       unsigned short inlen, int *al,
565                                       void *arg)
566         {
567         if (ext_type != CUSTOM_EXT_TYPE_3)
568                 custom_ext_error = 1;
569         if (inlen != strlen(custom_ext_srv_string))
570                 custom_ext_error = 1;
571         if (memcmp(custom_ext_srv_string, in, inlen) != 0)
572                 custom_ext_error = 1; /* Check for "defg" */
573         return 1;
574         }
575
576 //custom_ext_0_cli_first_cb returns -1 - the server won't receive a callback for this extension
577 static int custom_ext_0_srv_first_cb(SSL *s, unsigned short ext_type,
578                                      const unsigned char *in,
579                                      unsigned short inlen, int *al,
580                                      void *arg)
581         {
582         custom_ext_error = 1;
583         return 0; /* Shouldn't be called */
584         }
585
586 //'generate' callbacks are always called, even if the 'receive' callback isn't called
587 static int custom_ext_0_srv_second_cb(SSL *s, unsigned short ext_type,
588                                       const unsigned char **out,
589                                       unsigned short *outlen, int *al, void *arg)
590         {
591         return -1; /* Don't send an extension */
592         }
593
594 static int custom_ext_1_srv_first_cb(SSL *s, unsigned short ext_type,
595                                      const unsigned char *in,
596                                      unsigned short inlen, int *al,
597                                      void *arg)
598         {
599         if (ext_type != CUSTOM_EXT_TYPE_1)
600                 custom_ext_error = 1;           
601          /* Check for "abc" */
602         if (inlen != strlen(custom_ext_cli_string))
603                 custom_ext_error = 1;
604         if (memcmp(in, custom_ext_cli_string, inlen) != 0)
605                 custom_ext_error = 1;
606         return 1;
607         }
608
609 static int custom_ext_1_srv_second_cb(SSL *s, unsigned short ext_type,
610                                       const unsigned char **out,
611                                       unsigned short *outlen, int *al, void *arg)
612         {
613         return -1; /* Don't send an extension */
614         }
615
616 static int custom_ext_2_srv_first_cb(SSL *s, unsigned short ext_type,
617                                      const unsigned char *in,
618                                      unsigned short inlen, int *al,
619                                      void *arg)
620         {
621         if (ext_type != CUSTOM_EXT_TYPE_2)
622                 custom_ext_error = 1;           
623          /* Check for "abc" */
624         if (inlen != strlen(custom_ext_cli_string))
625                 custom_ext_error = 1;
626         if (memcmp(in, custom_ext_cli_string, inlen) != 0)
627                 custom_ext_error = 1;
628         return 1;
629         }
630
631 static int custom_ext_2_srv_second_cb(SSL *s, unsigned short ext_type,
632                                       const unsigned char **out,
633                                       unsigned short *outlen, int *al, void *arg)
634         {
635         *out = NULL;
636         *outlen = 0;
637         return 1; /* Send empty extension */
638         }
639
640 static int custom_ext_3_srv_first_cb(SSL *s, unsigned short ext_type,
641                                      const unsigned char *in,
642                                      unsigned short inlen, int *al,
643                                      void *arg)
644         {
645         if (ext_type != CUSTOM_EXT_TYPE_3)
646                 custom_ext_error = 1;           
647          /* Check for "abc" */  
648         if (inlen != strlen(custom_ext_cli_string))
649                 custom_ext_error = 1;
650         if (memcmp(in, custom_ext_cli_string, inlen) != 0)
651                 custom_ext_error = 1;
652         return 1;
653         }
654
655 static int custom_ext_3_srv_second_cb(SSL *s, unsigned short ext_type,
656                                       const unsigned char **out,
657                                       unsigned short *outlen, int *al, void *arg)
658         {
659         *out = (const unsigned char*)custom_ext_srv_string;
660         *outlen = strlen(custom_ext_srv_string);
661         return 1; /* Send "defg" */
662         }
663
664 static int supp_data_0_srv_first_cb(SSL *s, unsigned short supp_data_type,
665                                     const unsigned char **out,
666                                     unsigned short *outlen, int *al, void *arg)
667         {
668         *out = (const unsigned char*)supp_data_0_string;
669         *outlen = strlen(supp_data_0_string);
670         if (arg != s)
671                 suppdata_error = 1;
672         return 1;
673         }
674
675 static int supp_data_0_srv_second_cb(SSL *s, unsigned short supp_data_type,
676                                      const unsigned char *in,
677                                      unsigned short inlen, int *al,
678                                      void *arg)
679         {
680         if (supp_data_type != CUSTOM_SUPP_DATA_TYPE_0)
681                 suppdata_error = 1;
682         if (inlen != strlen(supp_data_0_string))
683                 suppdata_error = 1;
684         if (memcmp(in, supp_data_0_string, inlen) != 0)
685                 suppdata_error = 1;
686         if (arg != s)
687                 suppdata_error = 1;
688         return 1;
689         }
690
691 static int supp_data_1_srv_first_cb(SSL *s, unsigned short supp_data_type,
692                                     const unsigned char **out,
693                                     unsigned short *outlen, int *al, void *arg)
694         {
695         return -1;
696         }
697
698 static int supp_data_1_srv_second_cb(SSL *s, unsigned short supp_data_type,
699                                      const unsigned char *in,
700                                      unsigned short inlen, int *al,
701                                      void *arg)
702         {
703         suppdata_error = 1;
704         return 1;
705         }
706
707 static int supp_data_2_srv_second_cb(SSL *s, unsigned short supp_data_type,
708                                      const unsigned char *in,
709                                      unsigned short inlen, int *al,
710                                      void *arg)
711         {
712         suppdata_error = 1;
713         return 1;
714         }
715
716 static int supp_data_0_cli_first_cb(SSL *s, unsigned short supp_data_type,
717                                     const unsigned char *in,
718                                     unsigned short inlen, int *al,
719                                     void *arg)
720         {
721         if (supp_data_type != CUSTOM_SUPP_DATA_TYPE_0)
722                 suppdata_error = 1;
723         if (inlen != strlen(supp_data_0_string))
724                 suppdata_error = 1;
725         if (memcmp(in, supp_data_0_string, inlen) != 0)
726                 suppdata_error = 1;
727         if (arg != s)
728                 suppdata_error = 1;
729         return 1;
730         }
731
732 static int supp_data_0_cli_second_cb(SSL *s, unsigned short supp_data_type,
733                                      const unsigned char **out,
734                                      unsigned short *outlen, int *al, void *arg)
735         {
736         *out = (const unsigned char*)supp_data_0_string;
737         *outlen = strlen(supp_data_0_string);
738         if (arg != s)
739                 suppdata_error = 1;
740         return 1;
741         }
742
743 static int supp_data_1_cli_first_cb(SSL *s, unsigned short supp_data_type,
744                                     const unsigned char *in,
745                                     unsigned short inlen, int *al,
746                                     void *arg)
747         {
748         suppdata_error = 1;
749         return 1;
750         }
751
752 static int supp_data_1_cli_second_cb(SSL *s, unsigned short supp_data_type,
753                                      const unsigned char **out,
754                                      unsigned short *outlen, int *al, void *arg)
755         {
756         return -1;
757         }
758
759 static int supp_data_2_cli_first_cb(SSL *s, unsigned short supp_data_type,
760                                     const unsigned char *in,
761                                     unsigned short inlen, int *al,
762                                     void *arg)
763         {
764         suppdata_error = 1;
765         return 1;
766         }
767
768 static char *cipher=NULL;
769 static int verbose=0;
770 static int debug=0;
771 #if 0
772 /* Not used yet. */
773 #ifdef FIONBIO
774 static int s_nbio=0;
775 #endif
776 #endif
777
778 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
779
780 int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
781 int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
782 static int do_test_cipherlist(void);
783 static void sv_usage(void)
784         {
785         fprintf(stderr,"usage: ssltest [args ...]\n");
786         fprintf(stderr,"\n");
787 #ifdef OPENSSL_FIPS
788         fprintf(stderr,"-F             - run test in FIPS mode\n");
789 #endif
790         fprintf(stderr," -server_auth  - check server certificate\n");
791         fprintf(stderr," -client_auth  - do client authentication\n");
792         fprintf(stderr," -proxy        - allow proxy certificates\n");
793         fprintf(stderr," -proxy_auth <val> - set proxy policy rights\n");
794         fprintf(stderr," -proxy_cond <val> - experssion to test proxy policy rights\n");
795         fprintf(stderr," -v            - more output\n");
796         fprintf(stderr," -d            - debug output\n");
797         fprintf(stderr," -reuse        - use session-id reuse\n");
798         fprintf(stderr," -num <val>    - number of connections to perform\n");
799         fprintf(stderr," -bytes <val>  - number of bytes to swap between client/server\n");
800 #ifndef OPENSSL_NO_DH
801         fprintf(stderr," -dhe1024      - use 1024 bit key (safe prime) for DHE\n");
802         fprintf(stderr," -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
803         fprintf(stderr," -no_dhe       - disable DHE\n");
804 #endif
805 #ifndef OPENSSL_NO_ECDH
806         fprintf(stderr," -no_ecdhe     - disable ECDHE\n");
807 #endif
808 #ifndef OPENSSL_NO_PSK
809         fprintf(stderr," -psk arg      - PSK in hex (without 0x)\n");
810 #endif
811 #ifndef OPENSSL_NO_SRP
812         fprintf(stderr," -srpuser user  - SRP username to use\n");
813         fprintf(stderr," -srppass arg   - password for 'user'\n");
814 #endif
815 #ifndef OPENSSL_NO_SSL2
816         fprintf(stderr," -ssl2         - use SSLv2\n");
817 #endif
818 #ifndef OPENSSL_NO_SSL3
819         fprintf(stderr," -ssl3         - use SSLv3\n");
820 #endif
821 #ifndef OPENSSL_NO_TLS1
822         fprintf(stderr," -tls1         - use TLSv1\n");
823 #endif
824         fprintf(stderr," -CApath arg   - PEM format directory of CA's\n");
825         fprintf(stderr," -CAfile arg   - PEM format file of CA's\n");
826         fprintf(stderr," -cert arg     - Server certificate file\n");
827         fprintf(stderr," -key arg      - Server key file (default: same as -cert)\n");
828         fprintf(stderr," -c_cert arg   - Client certificate file\n");
829         fprintf(stderr," -c_key arg    - Client key file (default: same as -c_cert)\n");
830         fprintf(stderr," -cipher arg   - The cipher list\n");
831         fprintf(stderr," -bio_pair     - Use BIO pairs\n");
832         fprintf(stderr," -f            - Test even cases that can't work\n");
833         fprintf(stderr," -time         - measure processor time used by client and server\n");
834         fprintf(stderr," -zlib         - use zlib compression\n");
835         fprintf(stderr," -rle          - use rle compression\n");
836 #ifndef OPENSSL_NO_ECDH
837         fprintf(stderr," -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n" \
838                        "                 Use \"openssl ecparam -list_curves\" for all names\n"  \
839                        "                 (default is sect163r2).\n");
840 #endif
841         fprintf(stderr," -test_cipherlist - verifies the order of the ssl cipher lists\n");
842 #ifndef OPENSSL_NO_TLSEXT
843         fprintf(stderr," -server_authz arg - binary authz file for certificate\n");
844         fprintf(stderr," -c_support_proof  - indicate client support for server_authz audit proofs\n");
845         fprintf(stderr," -c_require_proof  - fail if no audit proof is sent\n");
846 #endif
847         fprintf(stderr," -serverinfo_file file - have server use this file\n");
848         fprintf(stderr," -serverinfo_sct  - have client offer and expect SCT\n");
849         fprintf(stderr," -serverinfo_tack - have client offer and expect TACK\n");
850         fprintf(stderr," -custom_ext - try various custom extension callbacks\n");
851         fprintf(stderr," -alpn_client <string> - have client side offer ALPN\n");
852         fprintf(stderr," -alpn_server <string> - have server side offer ALPN\n");
853         fprintf(stderr," -alpn_expected <string> - the ALPN protocol that should be negotiated\n");
854         fprintf(stderr, "-suppdata - exercise supplemental data callbacks\n");
855         }
856
857 static void print_details(SSL *c_ssl, const char *prefix)
858         {
859         const SSL_CIPHER *ciph;
860         X509 *cert;
861                 
862         ciph=SSL_get_current_cipher(c_ssl);
863         BIO_printf(bio_stdout,"%s%s, cipher %s %s",
864                 prefix,
865                 SSL_get_version(c_ssl),
866                 SSL_CIPHER_get_version(ciph),
867                 SSL_CIPHER_get_name(ciph));
868         cert=SSL_get_peer_certificate(c_ssl);
869         if (cert != NULL)
870                 {
871                 EVP_PKEY *pkey = X509_get_pubkey(cert);
872                 if (pkey != NULL)
873                         {
874                         if (0) 
875                                 ;
876 #ifndef OPENSSL_NO_RSA
877                         else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
878                                 && pkey->pkey.rsa->n != NULL)
879                                 {
880                                 BIO_printf(bio_stdout, ", %d bit RSA",
881                                         BN_num_bits(pkey->pkey.rsa->n));
882                                 }
883 #endif
884 #ifndef OPENSSL_NO_DSA
885                         else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
886                                 && pkey->pkey.dsa->p != NULL)
887                                 {
888                                 BIO_printf(bio_stdout, ", %d bit DSA",
889                                         BN_num_bits(pkey->pkey.dsa->p));
890                                 }
891 #endif
892                         EVP_PKEY_free(pkey);
893                         }
894                 X509_free(cert);
895                 }
896         /* The SSL API does not allow us to look at temporary RSA/DH keys,
897          * otherwise we should print their lengths too */
898         BIO_printf(bio_stdout,"\n");
899         }
900
901 static void lock_dbg_cb(int mode, int type, const char *file, int line)
902         {
903         static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */
904         const char *errstr = NULL;
905         int rw;
906         
907         rw = mode & (CRYPTO_READ|CRYPTO_WRITE);
908         if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE)))
909                 {
910                 errstr = "invalid mode";
911                 goto err;
912                 }
913
914         if (type < 0 || type >= CRYPTO_NUM_LOCKS)
915                 {
916                 errstr = "type out of bounds";
917                 goto err;
918                 }
919
920         if (mode & CRYPTO_LOCK)
921                 {
922                 if (modes[type])
923                         {
924                         errstr = "already locked";
925                         /* must not happen in a single-threaded program
926                          * (would deadlock) */
927                         goto err;
928                         }
929
930                 modes[type] = rw;
931                 }
932         else if (mode & CRYPTO_UNLOCK)
933                 {
934                 if (!modes[type])
935                         {
936                         errstr = "not locked";
937                         goto err;
938                         }
939                 
940                 if (modes[type] != rw)
941                         {
942                         errstr = (rw == CRYPTO_READ) ?
943                                 "CRYPTO_r_unlock on write lock" :
944                                 "CRYPTO_w_unlock on read lock";
945                         }
946
947                 modes[type] = 0;
948                 }
949         else
950                 {
951                 errstr = "invalid mode";
952                 goto err;
953                 }
954
955  err:
956         if (errstr)
957                 {
958                 /* we cannot use bio_err here */
959                 fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n",
960                         errstr, mode, type, file, line);
961                 }
962         }
963
964 #ifdef TLSEXT_TYPE_opaque_prf_input
965 struct cb_info_st { void *input; size_t len; int ret; };
966 struct cb_info_st co1 = { "C", 1, 1 }; /* try to negotiate oqaque PRF input */
967 struct cb_info_st co2 = { "C", 1, 2 }; /* insist on oqaque PRF input */
968 struct cb_info_st so1 = { "S", 1, 1 }; /* try to negotiate oqaque PRF input */
969 struct cb_info_st so2 = { "S", 1, 2 }; /* insist on oqaque PRF input */
970
971 int opaque_prf_input_cb(SSL *ssl, void *peerinput, size_t len, void *arg_)
972         {
973         struct cb_info_st *arg = arg_;
974
975         if (arg == NULL)
976                 return 1;
977         
978         if (!SSL_set_tlsext_opaque_prf_input(ssl, arg->input, arg->len))
979                 return 0;
980         return arg->ret;
981         }
982 #endif
983
984 #ifndef OPENSSL_NO_TLSEXT
985 struct audit_proof_cb_arg_st
986         {
987         unsigned char *expected_proof;
988         size_t expected_proof_length;
989         int require;
990         };
991
992 struct audit_proof_cb_arg_st c_expected = { NULL, 0, 0 };
993
994 static int audit_proof_cb(SSL *s, void *arg)
995         {
996         const unsigned char *proof;
997         size_t proof_len;
998         SSL_SESSION *sess = SSL_get_session(s);
999         struct audit_proof_cb_arg_st *cb_arg = (struct audit_proof_cb_arg_st*)arg;
1000
1001         proof = SSL_SESSION_get_tlsext_authz_server_audit_proof(sess,
1002                 &proof_len);
1003         if (proof != NULL)
1004                 {
1005                 if (proof_len == cb_arg->expected_proof_length &&
1006                         cb_arg->expected_proof != NULL &&
1007                         memcmp(proof, cb_arg->expected_proof, proof_len) == 0)
1008                         {
1009                         BIO_printf(bio_stdout, "Audit proof OK (%lu bytes).\n",
1010                                    (long)proof_len);
1011                         return 1;
1012                         }
1013                 else
1014                         {
1015                         BIO_printf(bio_stdout, "Audit proof mismatch.\n");
1016                         /* Cause handshake failure. */
1017                         return 0;
1018                         }
1019                 }
1020
1021         else /* proof == NULL */
1022                 {
1023                 BIO_printf(bio_stdout, "No audit proof found.\n");
1024                 if (cb_arg->require)
1025                         {
1026                         /* Cause handshake failure. */
1027                         return 0;
1028                         }
1029                 return 1;
1030                 }
1031         }
1032 #endif
1033
1034 int main(int argc, char *argv[])
1035         {
1036         char *CApath=NULL,*CAfile=NULL;
1037         int badop=0;
1038         int bio_pair=0;
1039         int force=0;
1040         int tls1=0,ssl2=0,ssl3=0,ret=1;
1041         int client_auth=0;
1042         int server_auth=0,i;
1043         struct app_verify_arg app_verify_arg =
1044                 { APP_CALLBACK_STRING, 0, 0, NULL, NULL };
1045         char *server_cert=TEST_SERVER_CERT;
1046         char *server_key=NULL;
1047         char *client_cert=TEST_CLIENT_CERT;
1048         char *client_key=NULL;
1049 #ifndef OPENSSL_NO_ECDH
1050         char *named_curve = NULL;
1051 #endif
1052         SSL_CTX *s_ctx=NULL;
1053         SSL_CTX *c_ctx=NULL;
1054         const SSL_METHOD *meth=NULL;
1055         SSL *c_ssl,*s_ssl;
1056         int number=1,reuse=0;
1057         long bytes=256L;
1058 #ifndef OPENSSL_NO_DH
1059         DH *dh;
1060         int dhe1024 = 0, dhe1024dsa = 0;
1061 #endif
1062 #ifndef OPENSSL_NO_ECDH
1063         EC_KEY *ecdh = NULL;
1064 #endif
1065 #ifndef OPENSSL_NO_SRP
1066         /* client */
1067         SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
1068         /* server */
1069         SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
1070 #endif
1071         int no_dhe = 0;
1072         int no_ecdhe = 0;
1073         int no_psk = 0;
1074         int print_time = 0;
1075         clock_t s_time = 0, c_time = 0;
1076 #ifndef OPENSSL_NO_COMP
1077         int comp = 0;
1078         COMP_METHOD *cm = NULL;
1079         STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
1080 #endif
1081         int test_cipherlist = 0;
1082 #ifdef OPENSSL_FIPS
1083         int fips_mode=0;
1084 #endif
1085 #ifndef OPENSSL_NO_TLSEXT
1086         char *s_authz_file = NULL;
1087         int c_support_proof = 0;
1088         int c_require_proof = 0;
1089 #endif
1090
1091         verbose = 0;
1092         debug = 0;
1093         cipher = 0;
1094
1095         bio_err=BIO_new_fp(stderr,BIO_NOCLOSE|BIO_FP_TEXT);     
1096
1097         CRYPTO_set_locking_callback(lock_dbg_cb);
1098
1099         /* enable memory leak checking unless explicitly disabled */
1100         if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) && (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))))
1101                 {
1102                 CRYPTO_malloc_debug_init();
1103                 CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
1104                 }
1105         else
1106                 {
1107                 /* OPENSSL_DEBUG_MEMORY=off */
1108                 CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
1109                 }
1110         CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
1111
1112         RAND_seed(rnd_seed, sizeof rnd_seed);
1113
1114         bio_stdout=BIO_new_fp(stdout,BIO_NOCLOSE|BIO_FP_TEXT);
1115
1116         argc--;
1117         argv++;
1118
1119         while (argc >= 1)
1120                 {
1121                 if(!strcmp(*argv,"-F"))
1122                         {
1123 #ifdef OPENSSL_FIPS
1124                         fips_mode=1;
1125 #else
1126                         fprintf(stderr,"not compiled with FIPS support, so exitting without running.\n");
1127                         EXIT(0);
1128 #endif
1129                         }
1130                 else if (strcmp(*argv,"-server_auth") == 0)
1131                         server_auth=1;
1132                 else if (strcmp(*argv,"-client_auth") == 0)
1133                         client_auth=1;
1134                 else if (strcmp(*argv,"-proxy_auth") == 0)
1135                         {
1136                         if (--argc < 1) goto bad;
1137                         app_verify_arg.proxy_auth= *(++argv);
1138                         }
1139                 else if (strcmp(*argv,"-proxy_cond") == 0)
1140                         {
1141                         if (--argc < 1) goto bad;
1142                         app_verify_arg.proxy_cond= *(++argv);
1143                         }
1144                 else if (strcmp(*argv,"-v") == 0)
1145                         verbose=1;
1146                 else if (strcmp(*argv,"-d") == 0)
1147                         debug=1;
1148                 else if (strcmp(*argv,"-reuse") == 0)
1149                         reuse=1;
1150                 else if (strcmp(*argv,"-dhe1024") == 0)
1151                         {
1152 #ifndef OPENSSL_NO_DH
1153                         dhe1024=1;
1154 #else
1155                         fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
1156 #endif
1157                         }
1158                 else if (strcmp(*argv,"-dhe1024dsa") == 0)
1159                         {
1160 #ifndef OPENSSL_NO_DH
1161                         dhe1024dsa=1;
1162 #else
1163                         fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n");
1164 #endif
1165                         }
1166                 else if (strcmp(*argv,"-no_dhe") == 0)
1167                         no_dhe=1;
1168                 else if (strcmp(*argv,"-no_ecdhe") == 0)
1169                         no_ecdhe=1;
1170                 else if (strcmp(*argv,"-psk") == 0)
1171                         {
1172                         if (--argc < 1) goto bad;
1173                         psk_key=*(++argv);
1174 #ifndef OPENSSL_NO_PSK
1175                         if (strspn(psk_key, "abcdefABCDEF1234567890") != strlen(psk_key))
1176                                 {
1177                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
1178                                 goto bad;
1179                                 }
1180 #else
1181                         no_psk=1;
1182 #endif
1183                         }
1184 #ifndef OPENSSL_NO_SRP
1185                 else if (strcmp(*argv,"-srpuser") == 0)
1186                         {
1187                         if (--argc < 1) goto bad;
1188                         srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
1189                         tls1=1;
1190                         }
1191                 else if (strcmp(*argv,"-srppass") == 0)
1192                         {
1193                         if (--argc < 1) goto bad;
1194                         srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
1195                         tls1=1;
1196                         }
1197 #endif
1198                 else if (strcmp(*argv,"-ssl2") == 0)
1199                         ssl2=1;
1200                 else if (strcmp(*argv,"-tls1") == 0)
1201                         tls1=1;
1202                 else if (strcmp(*argv,"-ssl3") == 0)
1203                         ssl3=1;
1204                 else if (strncmp(*argv,"-num",4) == 0)
1205                         {
1206                         if (--argc < 1) goto bad;
1207                         number= atoi(*(++argv));
1208                         if (number == 0) number=1;
1209                         }
1210                 else if (strcmp(*argv,"-bytes") == 0)
1211                         {
1212                         if (--argc < 1) goto bad;
1213                         bytes= atol(*(++argv));
1214                         if (bytes == 0L) bytes=1L;
1215                         i=strlen(argv[0]);
1216                         if (argv[0][i-1] == 'k') bytes*=1024L;
1217                         if (argv[0][i-1] == 'm') bytes*=1024L*1024L;
1218                         }
1219                 else if (strcmp(*argv,"-cert") == 0)
1220                         {
1221                         if (--argc < 1) goto bad;
1222                         server_cert= *(++argv);
1223                         }
1224                 else if (strcmp(*argv,"-s_cert") == 0)
1225                         {
1226                         if (--argc < 1) goto bad;
1227                         server_cert= *(++argv);
1228                         }
1229                 else if (strcmp(*argv,"-key") == 0)
1230                         {
1231                         if (--argc < 1) goto bad;
1232                         server_key= *(++argv);
1233                         }
1234                 else if (strcmp(*argv,"-s_key") == 0)
1235                         {
1236                         if (--argc < 1) goto bad;
1237                         server_key= *(++argv);
1238                         }
1239                 else if (strcmp(*argv,"-c_cert") == 0)
1240                         {
1241                         if (--argc < 1) goto bad;
1242                         client_cert= *(++argv);
1243                         }
1244                 else if (strcmp(*argv,"-c_key") == 0)
1245                         {
1246                         if (--argc < 1) goto bad;
1247                         client_key= *(++argv);
1248                         }
1249                 else if (strcmp(*argv,"-cipher") == 0)
1250                         {
1251                         if (--argc < 1) goto bad;
1252                         cipher= *(++argv);
1253                         }
1254                 else if (strcmp(*argv,"-CApath") == 0)
1255                         {
1256                         if (--argc < 1) goto bad;
1257                         CApath= *(++argv);
1258                         }
1259                 else if (strcmp(*argv,"-CAfile") == 0)
1260                         {
1261                         if (--argc < 1) goto bad;
1262                         CAfile= *(++argv);
1263                         }
1264                 else if (strcmp(*argv,"-bio_pair") == 0)
1265                         {
1266                         bio_pair = 1;
1267                         }
1268                 else if (strcmp(*argv,"-f") == 0)
1269                         {
1270                         force = 1;
1271                         }
1272                 else if (strcmp(*argv,"-time") == 0)
1273                         {
1274                         print_time = 1;
1275                         }
1276 #ifndef OPENSSL_NO_COMP
1277                 else if (strcmp(*argv,"-zlib") == 0)
1278                         {
1279                         comp = COMP_ZLIB;
1280                         }
1281                 else if (strcmp(*argv,"-rle") == 0)
1282                         {
1283                         comp = COMP_RLE;
1284                         }
1285 #endif
1286                 else if (strcmp(*argv,"-named_curve") == 0)
1287                         {
1288                         if (--argc < 1) goto bad;
1289 #ifndef OPENSSL_NO_ECDH         
1290                         named_curve = *(++argv);
1291 #else
1292                         fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n");
1293                         ++argv;
1294 #endif
1295                         }
1296                 else if (strcmp(*argv,"-app_verify") == 0)
1297                         {
1298                         app_verify_arg.app_verify = 1;
1299                         }
1300                 else if (strcmp(*argv,"-proxy") == 0)
1301                         {
1302                         app_verify_arg.allow_proxy_certs = 1;
1303                         }
1304                 else if (strcmp(*argv,"-test_cipherlist") == 0)
1305                         {
1306                         test_cipherlist = 1;
1307                         }
1308 #ifndef OPENSSL_NO_TLSEXT
1309                 else if(strcmp(*argv,"-server_authz") == 0)
1310                         {
1311                         if (--argc < 1) goto bad;
1312                         s_authz_file = *(++argv);
1313                         tls1 = 1;
1314                         }
1315                 else if (strcmp(*argv,"-c_support_proof") == 0)
1316                         {
1317                         c_support_proof = 1;
1318                         tls1 = 1;
1319                         }
1320                 else if (strcmp(*argv,"-c_require_proof") == 0)
1321                         {
1322                         c_require_proof = 1;
1323                         tls1 = 1;
1324                         }
1325 #endif
1326                 else if (strcmp(*argv,"-serverinfo_sct") == 0)
1327                         {
1328                         serverinfo_sct = 1;
1329                         }
1330                 else if (strcmp(*argv,"-serverinfo_tack") == 0)
1331                         {
1332                         serverinfo_tack = 1;
1333                         }
1334                 else if (strcmp(*argv,"-serverinfo_file") == 0)
1335                         {
1336                         if (--argc < 1) goto bad;
1337                         serverinfo_file = *(++argv);
1338                         }
1339                 else if (strcmp(*argv,"-custom_ext") == 0)
1340                         {
1341                         custom_ext = 1;
1342                         }
1343                 else if (strcmp(*argv,"-alpn_client") == 0)
1344                         {
1345                         if (--argc < 1) goto bad;
1346                         alpn_client = *(++argv);
1347                         }
1348                 else if (strcmp(*argv,"-alpn_server") == 0)
1349                         {
1350                         if (--argc < 1) goto bad;
1351                         alpn_server = *(++argv);
1352                         }
1353                 else if (strcmp(*argv,"-alpn_expected") == 0)
1354                         {
1355                         if (--argc < 1) goto bad;
1356                         alpn_expected = *(++argv);
1357                         }
1358                 else if (strcmp(*argv,"-suppdata") == 0)
1359                         {
1360                         suppdata = 1;
1361                         }
1362                 else
1363                         {
1364                         fprintf(stderr,"unknown option %s\n",*argv);
1365                         badop=1;
1366                         break;
1367                         }
1368                 argc--;
1369                 argv++;
1370                 }
1371         if (badop)
1372                 {
1373 bad:
1374                 sv_usage();
1375                 goto end;
1376                 }
1377
1378         if (test_cipherlist == 1)
1379                 {
1380                 /* ensure that the cipher list are correctly sorted and exit */
1381                 if (do_test_cipherlist() == 0)
1382                         EXIT(1);
1383                 ret = 0;
1384                 goto end;
1385                 }
1386
1387         if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
1388                 {
1389                 fprintf(stderr, "This case cannot work.  Use -f to perform "
1390                         "the test anyway (and\n-d to see what happens), "
1391                         "or add one of -ssl2, -ssl3, -tls1, -reuse\n"
1392                         "to avoid protocol mismatch.\n");
1393                 EXIT(1);
1394                 }
1395         if (c_require_proof && s_authz_file == NULL && !force)
1396                 {
1397                 fprintf(stderr, "This case cannot work. -c_require_proof "
1398                         "requires an audit proof, but none was supplied. "
1399                         "Use -f to perform the test anyway (and\n-d to see "
1400                         "what happens), or use -server_authz to supply an "
1401                         "audit proof.\n");
1402                 EXIT(1);
1403                 }
1404
1405 #ifdef OPENSSL_FIPS
1406         if(fips_mode)
1407                 {
1408                 if(!FIPS_mode_set(1))
1409                         {
1410                         ERR_load_crypto_strings();
1411                         ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
1412                         EXIT(1);
1413                         }
1414                 else
1415                         fprintf(stderr,"*** IN FIPS MODE ***\n");
1416                 }
1417 #endif
1418
1419         if (print_time)
1420                 {
1421                 if (!bio_pair)
1422                         {
1423                         fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1424                         bio_pair = 1;
1425                         }
1426                 if (number < 50 && !force)
1427                         fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1428                 }
1429
1430 /*      if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
1431
1432         SSL_library_init();
1433         SSL_load_error_strings();
1434
1435 #ifndef OPENSSL_NO_COMP
1436         if (comp == COMP_ZLIB) cm = COMP_zlib();
1437         if (comp == COMP_RLE) cm = COMP_rle();
1438         if (cm != NULL)
1439                 {
1440                 if (cm->type != NID_undef)
1441                         {
1442                         if (SSL_COMP_add_compression_method(comp, cm) != 0)
1443                                 {
1444                                 fprintf(stderr,
1445                                         "Failed to add compression method\n");
1446                                 ERR_print_errors_fp(stderr);
1447                                 }
1448                         }
1449                 else
1450                         {
1451                         fprintf(stderr,
1452                                 "Warning: %s compression not supported\n",
1453                                 (comp == COMP_RLE ? "rle" :
1454                                         (comp == COMP_ZLIB ? "zlib" :
1455                                                 "unknown")));
1456                         ERR_print_errors_fp(stderr);
1457                         }
1458                 }
1459         ssl_comp_methods = SSL_COMP_get_compression_methods();
1460         fprintf(stderr, "Available compression methods:\n");
1461         {
1462         int j, n = sk_SSL_COMP_num(ssl_comp_methods);
1463         if (n == 0)
1464                 fprintf(stderr, "  NONE\n");
1465         else
1466                 for (j = 0; j < n; j++)
1467                         {
1468                         SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
1469                         fprintf(stderr, "  %d: %s\n", c->id, c->name);
1470                         }
1471         }
1472 #endif
1473
1474 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
1475         if (ssl2)
1476                 meth=SSLv2_method();
1477         else 
1478         if (tls1)
1479                 meth=TLSv1_method();
1480         else
1481         if (ssl3)
1482                 meth=SSLv3_method();
1483         else
1484                 meth=SSLv23_method();
1485 #else
1486 #ifdef OPENSSL_NO_SSL2
1487         if (tls1)
1488                 meth=TLSv1_method();
1489         else
1490         if (ssl3)
1491                 meth=SSLv3_method();
1492         else
1493                 meth=SSLv23_method();
1494 #else
1495         meth=SSLv2_method();
1496 #endif
1497 #endif
1498
1499         c_ctx=SSL_CTX_new(meth);
1500         s_ctx=SSL_CTX_new(meth);
1501         if ((c_ctx == NULL) || (s_ctx == NULL))
1502                 {
1503                 ERR_print_errors(bio_err);
1504                 goto end;
1505                 }
1506
1507         if (cipher != NULL)
1508                 {
1509                 SSL_CTX_set_cipher_list(c_ctx,cipher);
1510                 SSL_CTX_set_cipher_list(s_ctx,cipher);
1511                 }
1512
1513 #ifndef OPENSSL_NO_DH
1514         if (!no_dhe)
1515                 {
1516                 if (dhe1024dsa)
1517                         {
1518                         /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
1519                         SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
1520                         dh=get_dh1024dsa();
1521                         }
1522                 else if (dhe1024)
1523                         dh=get_dh1024();
1524                 else
1525                         dh=get_dh512();
1526                 SSL_CTX_set_tmp_dh(s_ctx,dh);
1527                 DH_free(dh);
1528                 }
1529 #else
1530         (void)no_dhe;
1531 #endif
1532
1533 #ifndef OPENSSL_NO_ECDH
1534         if (!no_ecdhe)
1535                 {
1536                 int nid;
1537
1538                 if (named_curve != NULL)
1539                         {
1540                         nid = OBJ_sn2nid(named_curve);
1541                         if (nid == 0)
1542                         {
1543                                 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1544                                 goto end;
1545                                 }
1546                         }
1547                 else
1548 #ifdef OPENSSL_NO_EC2M
1549                         nid = NID_X9_62_prime256v1;
1550 #else
1551                         nid = NID_sect163r2;
1552 #endif
1553
1554                 ecdh = EC_KEY_new_by_curve_name(nid);
1555                 if (ecdh == NULL)
1556                         {
1557                         BIO_printf(bio_err, "unable to create curve\n");
1558                         goto end;
1559                         }
1560
1561                 SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
1562                 SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
1563                 EC_KEY_free(ecdh);
1564                 }
1565 #else
1566         (void)no_ecdhe;
1567 #endif
1568
1569 #ifndef OPENSSL_NO_RSA
1570         SSL_CTX_set_tmp_rsa_callback(s_ctx,tmp_rsa_cb);
1571 #endif
1572
1573 #ifdef TLSEXT_TYPE_opaque_prf_input
1574         SSL_CTX_set_tlsext_opaque_prf_input_callback(c_ctx, opaque_prf_input_cb);
1575         SSL_CTX_set_tlsext_opaque_prf_input_callback(s_ctx, opaque_prf_input_cb);
1576         SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(c_ctx, &co1); /* or &co2 or NULL */
1577         SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(s_ctx, &so1); /* or &so2 or NULL */
1578 #endif
1579
1580         if (!SSL_CTX_use_certificate_file(s_ctx,server_cert,SSL_FILETYPE_PEM))
1581                 {
1582                 ERR_print_errors(bio_err);
1583                 }
1584         else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
1585                 (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
1586                 {
1587                 ERR_print_errors(bio_err);
1588                 goto end;
1589                 }
1590
1591         if (client_auth)
1592                 {
1593                 SSL_CTX_use_certificate_file(c_ctx,client_cert,
1594                         SSL_FILETYPE_PEM);
1595                 SSL_CTX_use_PrivateKey_file(c_ctx,
1596                         (client_key?client_key:client_cert),
1597                         SSL_FILETYPE_PEM);
1598                 }
1599
1600         if (    (!SSL_CTX_load_verify_locations(s_ctx,CAfile,CApath)) ||
1601                 (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1602                 (!SSL_CTX_load_verify_locations(c_ctx,CAfile,CApath)) ||
1603                 (!SSL_CTX_set_default_verify_paths(c_ctx)))
1604                 {
1605                 /* fprintf(stderr,"SSL_load_verify_locations\n"); */
1606                 ERR_print_errors(bio_err);
1607                 /* goto end; */
1608                 }
1609
1610         if (client_auth)
1611                 {
1612                 BIO_printf(bio_err,"client authentication\n");
1613                 SSL_CTX_set_verify(s_ctx,
1614                         SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1615                         verify_callback);
1616                 SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback, &app_verify_arg);
1617                 }
1618         if (server_auth)
1619                 {
1620                 BIO_printf(bio_err,"server authentication\n");
1621                 SSL_CTX_set_verify(c_ctx,SSL_VERIFY_PEER,
1622                         verify_callback);
1623                 SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback, &app_verify_arg);
1624                 }
1625         
1626         {
1627                 int session_id_context = 0;
1628                 SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context, sizeof session_id_context);
1629         }
1630
1631         /* Use PSK only if PSK key is given */
1632         if (psk_key != NULL)
1633                 {
1634                 /* no_psk is used to avoid putting psk command to openssl tool */
1635                 if (no_psk)
1636                         {
1637                         /* if PSK is not compiled in and psk key is
1638                          * given, do nothing and exit successfully */
1639                         ret=0;
1640                         goto end;
1641                         }
1642 #ifndef OPENSSL_NO_PSK
1643                 SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1644                 SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1645                 if (debug)
1646                         BIO_printf(bio_err,"setting PSK identity hint to s_ctx\n");
1647                 if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint"))
1648                         {
1649                         BIO_printf(bio_err,"error setting PSK identity hint to s_ctx\n");
1650                         ERR_print_errors(bio_err);
1651                         goto end;
1652                         }
1653 #endif
1654                 }
1655 #ifndef OPENSSL_NO_SRP
1656         if (srp_client_arg.srplogin)
1657                 {
1658                 if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
1659                         {
1660                         BIO_printf(bio_err,"Unable to set SRP username\n");
1661                         goto end;
1662                         }
1663                 SSL_CTX_set_srp_cb_arg(c_ctx,&srp_client_arg);
1664                 SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
1665                 /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
1666                 }
1667
1668         if (srp_server_arg.expected_user != NULL)
1669                 {
1670                 SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
1671                 SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1672                 SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1673                 }
1674 #endif
1675 #ifndef OPENSSL_NO_TLSEXT
1676         if (s_authz_file != NULL)
1677                 {
1678                 if(!SSL_CTX_use_authz_file(s_ctx, s_authz_file))
1679                         {
1680                         BIO_printf(bio_err, "Unable to set authz data\n");
1681                         goto end;
1682                         }
1683                 }
1684         if (c_support_proof || c_require_proof)
1685                 {
1686                 size_t proof_length;
1687                 const unsigned char *proof = SSL_CTX_get_authz_data(s_ctx,
1688                         TLSEXT_AUTHZDATAFORMAT_audit_proof, &proof_length);
1689                 if (proof != NULL)
1690                         {
1691                         /* Store a local copy. */
1692                         c_expected.expected_proof = OPENSSL_malloc(proof_length);
1693                         c_expected.expected_proof_length = proof_length;
1694                         memcpy(c_expected.expected_proof, proof, proof_length);
1695                         }
1696                 c_expected.require = c_require_proof;
1697                 SSL_CTX_set_tlsext_authz_server_audit_proof_cb(c_ctx,
1698                         audit_proof_cb);
1699                 SSL_CTX_set_tlsext_authz_server_audit_proof_cb_arg(c_ctx,
1700                         &c_expected);
1701                 }
1702 #endif
1703
1704         if (serverinfo_sct)
1705                 SSL_CTX_set_custom_cli_ext(c_ctx, SCT_EXT_TYPE, NULL, 
1706                                            serverinfo_cli_cb, NULL);
1707         if (serverinfo_tack)
1708                 SSL_CTX_set_custom_cli_ext(c_ctx, TACK_EXT_TYPE, NULL,
1709                                            serverinfo_cli_cb, NULL);
1710
1711         if (serverinfo_file)
1712                 if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file))
1713                         {
1714                         BIO_printf(bio_err, "missing serverinfo file\n");
1715                         goto end;
1716                         }
1717
1718         if (custom_ext)
1719                 {
1720                 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_0, 
1721                                            custom_ext_0_cli_first_cb, 
1722                                            custom_ext_0_cli_second_cb, NULL);
1723                 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_1, 
1724                                            custom_ext_1_cli_first_cb, 
1725                                            custom_ext_1_cli_second_cb, NULL);
1726                 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_2, 
1727                                            custom_ext_2_cli_first_cb, 
1728                                            custom_ext_2_cli_second_cb, NULL);
1729                 SSL_CTX_set_custom_cli_ext(c_ctx, CUSTOM_EXT_TYPE_3, 
1730                                            custom_ext_3_cli_first_cb, 
1731                                            custom_ext_3_cli_second_cb, NULL);
1732
1733
1734                 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_0, 
1735                                            custom_ext_0_srv_first_cb, 
1736                                            custom_ext_0_srv_second_cb, NULL);
1737                 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_1, 
1738                                            custom_ext_1_srv_first_cb, 
1739                                            custom_ext_1_srv_second_cb, NULL);
1740                 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_2, 
1741                                            custom_ext_2_srv_first_cb, 
1742                                            custom_ext_2_srv_second_cb, NULL);
1743                 SSL_CTX_set_custom_srv_ext(s_ctx, CUSTOM_EXT_TYPE_3, 
1744                                            custom_ext_3_srv_first_cb, 
1745                                            custom_ext_3_srv_second_cb, NULL);
1746                 }
1747
1748         if (alpn_server)
1749                 SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, NULL);
1750
1751         if (alpn_client)
1752                 {
1753                 unsigned short alpn_len;
1754                 unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
1755
1756                 if (alpn == NULL)
1757                         {
1758                         BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
1759                         goto end;
1760                         }
1761                 SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len);
1762                 OPENSSL_free(alpn);
1763                 }
1764
1765         c_ssl=SSL_new(c_ctx);
1766         s_ssl=SSL_new(s_ctx);
1767
1768         if (suppdata)
1769                 {
1770                 //TEST CASES
1771                 //client and server both send and receive, verify additional arg passed back
1772                 SSL_CTX_set_srv_supp_data(s_ctx, CUSTOM_SUPP_DATA_TYPE_0, supp_data_0_srv_first_cb, supp_data_0_srv_second_cb, s_ssl);
1773                 SSL_CTX_set_cli_supp_data(c_ctx, CUSTOM_SUPP_DATA_TYPE_0, supp_data_0_cli_first_cb, supp_data_0_cli_second_cb, c_ssl);
1774
1775                 //-1 response from sending server/client doesn't receive, -1 response from sending client/server doesn't receive
1776                 SSL_CTX_set_srv_supp_data(s_ctx, CUSTOM_SUPP_DATA_TYPE_1, supp_data_1_srv_first_cb, supp_data_1_srv_second_cb, NULL);
1777                 SSL_CTX_set_cli_supp_data(c_ctx, CUSTOM_SUPP_DATA_TYPE_1, supp_data_1_cli_first_cb, supp_data_1_cli_second_cb, NULL);
1778
1779                 //null sending server/client doesn't receive, null sending client/server doesn't receive
1780                 SSL_CTX_set_srv_supp_data(s_ctx, CUSTOM_SUPP_DATA_TYPE_2, /*supp_data_2_srv_first_cb*/NULL, supp_data_2_srv_second_cb, NULL);
1781                 SSL_CTX_set_cli_supp_data(c_ctx, CUSTOM_SUPP_DATA_TYPE_2, supp_data_2_cli_first_cb, /*supp_data_2_cli_second_cb*/NULL, NULL);
1782
1783                 //alerts set to non-zero and zero return values not tested
1784                 }
1785 #ifndef OPENSSL_NO_KRB5
1786         if (c_ssl  &&  c_ssl->kssl_ctx)
1787                 {
1788                 char    localhost[MAXHOSTNAMELEN+2];
1789
1790                 if (gethostname(localhost, sizeof localhost-1) == 0)
1791                         {
1792                         localhost[sizeof localhost-1]='\0';
1793                         if(strlen(localhost) == sizeof localhost-1)
1794                                 {
1795                                 BIO_printf(bio_err,"localhost name too long\n");
1796                                 goto end;
1797                                 }
1798                         kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER,
1799                                 localhost);
1800                         }
1801                 }
1802 #endif    /* OPENSSL_NO_KRB5  */
1803
1804         for (i=0; i<number; i++)
1805                 {
1806                 if (!reuse) SSL_set_session(c_ssl,NULL);
1807                 if (bio_pair)
1808                         ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
1809                 else
1810                         ret=doit(s_ssl,c_ssl,bytes);
1811                 }
1812
1813         if (!verbose)
1814                 {
1815                 print_details(c_ssl, "");
1816                 }
1817         if ((number > 1) || (bytes > 1L))
1818                 BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
1819         if (print_time)
1820                 {
1821 #ifdef CLOCKS_PER_SEC
1822                 /* "To determine the time in seconds, the value returned
1823                  * by the clock function should be divided by the value
1824                  * of the macro CLOCKS_PER_SEC."
1825                  *                                       -- ISO/IEC 9899 */
1826                 BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1827                         "Approximate total client time: %6.2f s\n",
1828                         (double)s_time/CLOCKS_PER_SEC,
1829                         (double)c_time/CLOCKS_PER_SEC);
1830 #else
1831                 /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
1832                  *                            -- cc on NeXTstep/OpenStep */
1833                 BIO_printf(bio_stdout,
1834                         "Approximate total server time: %6.2f units\n"
1835                         "Approximate total client time: %6.2f units\n",
1836                         (double)s_time,
1837                         (double)c_time);
1838 #endif
1839                 }
1840
1841         SSL_free(s_ssl);
1842         SSL_free(c_ssl);
1843
1844 end:
1845         if (s_ctx != NULL) SSL_CTX_free(s_ctx);
1846         if (c_ctx != NULL) SSL_CTX_free(c_ctx);
1847
1848         if (bio_stdout != NULL) BIO_free(bio_stdout);
1849
1850 #ifndef OPENSSL_NO_RSA
1851         free_tmp_rsa();
1852 #endif
1853 #ifndef OPENSSL_NO_ENGINE
1854         ENGINE_cleanup();
1855 #endif
1856 #ifndef OPENSSL_NO_TLSEXT
1857         if (c_expected.expected_proof != NULL)
1858                 OPENSSL_free(c_expected.expected_proof);
1859 #endif
1860         CRYPTO_cleanup_all_ex_data();
1861         ERR_free_strings();
1862         ERR_remove_thread_state(NULL);
1863         EVP_cleanup();
1864         CRYPTO_mem_leaks(bio_err);
1865         if (bio_err != NULL) BIO_free(bio_err);
1866         EXIT(ret);
1867         return ret;
1868         }
1869
1870 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
1871         clock_t *s_time, clock_t *c_time)
1872         {
1873         long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1874         BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1875         BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
1876         int ret = 1;
1877         
1878         size_t bufsiz = 256; /* small buffer for testing */
1879
1880         if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
1881                 goto err;
1882         if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
1883                 goto err;
1884         
1885         s_ssl_bio = BIO_new(BIO_f_ssl());
1886         if (!s_ssl_bio)
1887                 goto err;
1888
1889         c_ssl_bio = BIO_new(BIO_f_ssl());
1890         if (!c_ssl_bio)
1891                 goto err;
1892
1893         SSL_set_connect_state(c_ssl);
1894         SSL_set_bio(c_ssl, client, client);
1895         (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1896
1897         SSL_set_accept_state(s_ssl);
1898         SSL_set_bio(s_ssl, server, server);
1899         (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1900
1901         do
1902                 {
1903                 /* c_ssl_bio:          SSL filter BIO
1904                  *
1905                  * client:             pseudo-I/O for SSL library
1906                  *
1907                  * client_io:          client's SSL communication; usually to be
1908                  *                     relayed over some I/O facility, but in this
1909                  *                     test program, we're the server, too:
1910                  *
1911                  * server_io:          server's SSL communication
1912                  *
1913                  * server:             pseudo-I/O for SSL library
1914                  *
1915                  * s_ssl_bio:          SSL filter BIO
1916                  *
1917                  * The client and the server each employ a "BIO pair":
1918                  * client + client_io, server + server_io.
1919                  * BIO pairs are symmetric.  A BIO pair behaves similar
1920                  * to a non-blocking socketpair (but both endpoints must
1921                  * be handled by the same thread).
1922                  * [Here we could connect client and server to the ends
1923                  * of a single BIO pair, but then this code would be less
1924                  * suitable as an example for BIO pairs in general.]
1925                  *
1926                  * Useful functions for querying the state of BIO pair endpoints:
1927                  *
1928                  * BIO_ctrl_pending(bio)              number of bytes we can read now
1929                  * BIO_ctrl_get_read_request(bio)     number of bytes needed to fulfil
1930                  *                                      other side's read attempt
1931                  * BIO_ctrl_get_write_guarantee(bio)   number of bytes we can write now
1932                  *
1933                  * ..._read_request is never more than ..._write_guarantee;
1934                  * it depends on the application which one you should use.
1935                  */
1936
1937                 /* We have non-blocking behaviour throughout this test program, but
1938                  * can be sure that there is *some* progress in each iteration; so
1939                  * we don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE
1940                  * -- we just try everything in each iteration
1941                  */
1942
1943                         {
1944                         /* CLIENT */
1945                 
1946                         MS_STATIC char cbuf[1024*8];
1947                         int i, r;
1948                         clock_t c_clock = clock();
1949
1950                         memset(cbuf, 0, sizeof(cbuf));
1951
1952                         if (debug)
1953                                 if (SSL_in_init(c_ssl))
1954                                         printf("client waiting in SSL_connect - %s\n",
1955                                                 SSL_state_string_long(c_ssl));
1956
1957                         if (cw_num > 0)
1958                                 {
1959                                 /* Write to server. */
1960                                 
1961                                 if (cw_num > (long)sizeof cbuf)
1962                                         i = sizeof cbuf;
1963                                 else
1964                                         i = (int)cw_num;
1965                                 r = BIO_write(c_ssl_bio, cbuf, i);
1966                                 if (r < 0)
1967                                         {
1968                                         if (!BIO_should_retry(c_ssl_bio))
1969                                                 {
1970                                                 fprintf(stderr,"ERROR in CLIENT\n");
1971                                                 goto err;
1972                                                 }
1973                                         /* BIO_should_retry(...) can just be ignored here.
1974                                          * The library expects us to call BIO_write with
1975                                          * the same arguments again, and that's what we will
1976                                          * do in the next iteration. */
1977                                         }
1978                                 else if (r == 0)
1979                                         {
1980                                         fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
1981                                         goto err;
1982                                         }
1983                                 else
1984                                         {
1985                                         if (debug)
1986                                                 printf("client wrote %d\n", r);
1987                                         cw_num -= r;                            
1988                                         }
1989                                 }
1990
1991                         if (cr_num > 0)
1992                                 {
1993                                 /* Read from server. */
1994
1995                                 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
1996                                 if (r < 0)
1997                                         {
1998                                         if (!BIO_should_retry(c_ssl_bio))
1999                                                 {
2000                                                 fprintf(stderr,"ERROR in CLIENT\n");
2001                                                 goto err;
2002                                                 }
2003                                         /* Again, "BIO_should_retry" can be ignored. */
2004                                         }
2005                                 else if (r == 0)
2006                                         {
2007                                         fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2008                                         goto err;
2009                                         }
2010                                 else
2011                                         {
2012                                         if (debug)
2013                                                 printf("client read %d\n", r);
2014                                         cr_num -= r;
2015                                         }
2016                                 }
2017
2018                         /* c_time and s_time increments will typically be very small
2019                          * (depending on machine speed and clock tick intervals),
2020                          * but sampling over a large number of connections should
2021                          * result in fairly accurate figures.  We cannot guarantee
2022                          * a lot, however -- if each connection lasts for exactly
2023                          * one clock tick, it will be counted only for the client
2024                          * or only for the server or even not at all.
2025                          */
2026                         *c_time += (clock() - c_clock);
2027                         }
2028
2029                         {
2030                         /* SERVER */
2031                 
2032                         MS_STATIC char sbuf[1024*8];
2033                         int i, r;
2034                         clock_t s_clock = clock();
2035
2036                         memset(sbuf, 0, sizeof(sbuf));
2037
2038                         if (debug)
2039                                 if (SSL_in_init(s_ssl))
2040                                         printf("server waiting in SSL_accept - %s\n",
2041                                                 SSL_state_string_long(s_ssl));
2042
2043                         if (sw_num > 0)
2044                                 {
2045                                 /* Write to client. */
2046                                 
2047                                 if (sw_num > (long)sizeof sbuf)
2048                                         i = sizeof sbuf;
2049                                 else
2050                                         i = (int)sw_num;
2051                                 r = BIO_write(s_ssl_bio, sbuf, i);
2052                                 if (r < 0)
2053                                         {
2054                                         if (!BIO_should_retry(s_ssl_bio))
2055                                                 {
2056                                                 fprintf(stderr,"ERROR in SERVER\n");
2057                                                 goto err;
2058                                                 }
2059                                         /* Ignore "BIO_should_retry". */
2060                                         }
2061                                 else if (r == 0)
2062                                         {
2063                                         fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
2064                                         goto err;
2065                                         }
2066                                 else
2067                                         {
2068                                         if (debug)
2069                                                 printf("server wrote %d\n", r);
2070                                         sw_num -= r;                            
2071                                         }
2072                                 }
2073
2074                         if (sr_num > 0)
2075                                 {
2076                                 /* Read from client. */
2077
2078                                 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2079                                 if (r < 0)
2080                                         {
2081                                         if (!BIO_should_retry(s_ssl_bio))
2082                                                 {
2083                                                 fprintf(stderr,"ERROR in SERVER\n");
2084                                                 goto err;
2085                                                 }
2086                                         /* blah, blah */
2087                                         }
2088                                 else if (r == 0)
2089                                         {
2090                                         fprintf(stderr,"SSL SERVER STARTUP FAILED\n");
2091                                         goto err;
2092                                         }
2093                                 else
2094                                         {
2095                                         if (debug)
2096                                                 printf("server read %d\n", r);
2097                                         sr_num -= r;
2098                                         }
2099                                 }
2100
2101                         *s_time += (clock() - s_clock);
2102                         }
2103                         
2104                         {
2105                         /* "I/O" BETWEEN CLIENT AND SERVER. */
2106
2107                         size_t r1, r2;
2108                         BIO *io1 = server_io, *io2 = client_io;
2109                         /* we use the non-copying interface for io1
2110                          * and the standard BIO_write/BIO_read interface for io2
2111                          */
2112                         
2113                         static int prev_progress = 1;
2114                         int progress = 0;
2115                         
2116                         /* io1 to io2 */
2117                         do
2118                                 {
2119                                 size_t num;
2120                                 int r;
2121
2122                                 r1 = BIO_ctrl_pending(io1);
2123                                 r2 = BIO_ctrl_get_write_guarantee(io2);
2124
2125                                 num = r1;
2126                                 if (r2 < num)
2127                                         num = r2;
2128                                 if (num)
2129                                         {
2130                                         char *dataptr;
2131
2132                                         if (INT_MAX < num) /* yeah, right */
2133                                                 num = INT_MAX;
2134                                         
2135                                         r = BIO_nread(io1, &dataptr, (int)num);
2136                                         assert(r > 0);
2137                                         assert(r <= (int)num);
2138                                         /* possibly r < num (non-contiguous data) */
2139                                         num = r;
2140                                         r = BIO_write(io2, dataptr, (int)num);
2141                                         if (r != (int)num) /* can't happen */
2142                                                 {
2143                                                 fprintf(stderr, "ERROR: BIO_write could not write "
2144                                                         "BIO_ctrl_get_write_guarantee() bytes");
2145                                                 goto err;
2146                                                 }
2147                                         progress = 1;
2148
2149                                         if (debug)
2150                                                 printf((io1 == client_io) ?
2151                                                         "C->S relaying: %d bytes\n" :
2152                                                         "S->C relaying: %d bytes\n",
2153                                                         (int)num);
2154                                         }
2155                                 }
2156                         while (r1 && r2);
2157
2158                         /* io2 to io1 */
2159                         {
2160                                 size_t num;
2161                                 int r;
2162
2163                                 r1 = BIO_ctrl_pending(io2);
2164                                 r2 = BIO_ctrl_get_read_request(io1);
2165                                 /* here we could use ..._get_write_guarantee instead of
2166                                  * ..._get_read_request, but by using the latter
2167                                  * we test restartability of the SSL implementation
2168                                  * more thoroughly */
2169                                 num = r1;
2170                                 if (r2 < num)
2171                                         num = r2;
2172                                 if (num)
2173                                         {
2174                                         char *dataptr;
2175                                         
2176                                         if (INT_MAX < num)
2177                                                 num = INT_MAX;
2178
2179                                         if (num > 1)
2180                                                 --num; /* test restartability even more thoroughly */
2181                                         
2182                                         r = BIO_nwrite0(io1, &dataptr);
2183                                         assert(r > 0);
2184                                         if (r < (int)num)
2185                                                 num = r;
2186                                         r = BIO_read(io2, dataptr, (int)num);
2187                                         if (r != (int)num) /* can't happen */
2188                                                 {
2189                                                 fprintf(stderr, "ERROR: BIO_read could not read "
2190                                                         "BIO_ctrl_pending() bytes");
2191                                                 goto err;
2192                                                 }
2193                                         progress = 1;
2194                                         r = BIO_nwrite(io1, &dataptr, (int)num);
2195                                         if (r != (int)num) /* can't happen */
2196                                                 {
2197                                                 fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
2198                                                         "BIO_nwrite0() bytes");
2199                                                 goto err;
2200                                                 }
2201                                         
2202                                         if (debug)
2203                                                 printf((io2 == client_io) ?
2204                                                         "C->S relaying: %d bytes\n" :
2205                                                         "S->C relaying: %d bytes\n",
2206                                                         (int)num);
2207                                         }
2208                         } /* no loop, BIO_ctrl_get_read_request now returns 0 anyway */
2209
2210                         if (!progress && !prev_progress)
2211                                 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0)
2212                                         {
2213                                         fprintf(stderr, "ERROR: got stuck\n");
2214                                         if (strcmp("SSLv2", SSL_get_version(c_ssl)) == 0)
2215                                                 {
2216                                                 fprintf(stderr, "This can happen for SSL2 because "
2217                                                         "CLIENT-FINISHED and SERVER-VERIFY are written \n"
2218                                                         "concurrently ...");
2219                                                 if (strncmp("2SCF", SSL_state_string(c_ssl), 4) == 0
2220                                                         && strncmp("2SSV", SSL_state_string(s_ssl), 4) == 0)
2221                                                         {
2222                                                         fprintf(stderr, " ok.\n");
2223                                                         goto end;
2224                                                         }
2225                                                 }
2226                                         fprintf(stderr, " ERROR.\n");
2227                                         goto err;
2228                                         }
2229                         prev_progress = progress;
2230                         }
2231                 }
2232         while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2233
2234         if (verbose)
2235                 print_details(c_ssl, "DONE via BIO pair: ");
2236
2237         if (verify_serverinfo() < 0)
2238                 {
2239                 ret = 1;
2240                 goto err;
2241                 }
2242         if (verify_alpn(c_ssl, s_ssl) < 0)
2243                 {
2244                 ret = 1;
2245                 goto err;
2246                 }
2247
2248         if (custom_ext_error)
2249                 {
2250                 ret = 1;
2251                 goto err;
2252                 }
2253
2254 end:
2255         ret = 0;
2256
2257  err:
2258         ERR_print_errors(bio_err);
2259         
2260         if (server)
2261                 BIO_free(server);
2262         if (server_io)
2263                 BIO_free(server_io);
2264         if (client)
2265                 BIO_free(client);
2266         if (client_io)
2267                 BIO_free(client_io);
2268         if (s_ssl_bio)
2269                 BIO_free(s_ssl_bio);
2270         if (c_ssl_bio)
2271                 BIO_free(c_ssl_bio);
2272
2273         return ret;
2274         }
2275
2276
2277 #define W_READ  1
2278 #define W_WRITE 2
2279 #define C_DONE  1
2280 #define S_DONE  2
2281
2282 int doit(SSL *s_ssl, SSL *c_ssl, long count)
2283         {
2284         MS_STATIC char cbuf[1024*8],sbuf[1024*8];
2285         long cw_num=count,cr_num=count;
2286         long sw_num=count,sr_num=count;
2287         int ret=1;
2288         BIO *c_to_s=NULL;
2289         BIO *s_to_c=NULL;
2290         BIO *c_bio=NULL;
2291         BIO *s_bio=NULL;
2292         int c_r,c_w,s_r,s_w;
2293         int i,j;
2294         int done=0;
2295         int c_write,s_write;
2296         int do_server=0,do_client=0;
2297
2298         memset(cbuf,0,sizeof(cbuf));
2299         memset(sbuf,0,sizeof(sbuf));
2300
2301         c_to_s=BIO_new(BIO_s_mem());
2302         s_to_c=BIO_new(BIO_s_mem());
2303         if ((s_to_c == NULL) || (c_to_s == NULL))
2304                 {
2305                 ERR_print_errors(bio_err);
2306                 goto err;
2307                 }
2308
2309         c_bio=BIO_new(BIO_f_ssl());
2310         s_bio=BIO_new(BIO_f_ssl());
2311         if ((c_bio == NULL) || (s_bio == NULL))
2312                 {
2313                 ERR_print_errors(bio_err);
2314                 goto err;
2315                 }
2316
2317         SSL_set_connect_state(c_ssl);
2318         SSL_set_bio(c_ssl,s_to_c,c_to_s);
2319         BIO_set_ssl(c_bio,c_ssl,BIO_NOCLOSE);
2320
2321         SSL_set_accept_state(s_ssl);
2322         SSL_set_bio(s_ssl,c_to_s,s_to_c);
2323         BIO_set_ssl(s_bio,s_ssl,BIO_NOCLOSE);
2324
2325         c_r=0; s_r=1;
2326         c_w=1; s_w=0;
2327         c_write=1,s_write=0;
2328
2329         /* We can always do writes */
2330         for (;;)
2331                 {
2332                 do_server=0;
2333                 do_client=0;
2334
2335                 i=(int)BIO_pending(s_bio);
2336                 if ((i && s_r) || s_w) do_server=1;
2337
2338                 i=(int)BIO_pending(c_bio);
2339                 if ((i && c_r) || c_w) do_client=1;
2340
2341                 if (do_server && debug)
2342                         {
2343                         if (SSL_in_init(s_ssl))
2344                                 printf("server waiting in SSL_accept - %s\n",
2345                                         SSL_state_string_long(s_ssl));
2346 /*                      else if (s_write)
2347                                 printf("server:SSL_write()\n");
2348                         else
2349                                 printf("server:SSL_read()\n"); */
2350                         }
2351
2352                 if (do_client && debug)
2353                         {
2354                         if (SSL_in_init(c_ssl))
2355                                 printf("client waiting in SSL_connect - %s\n",
2356                                         SSL_state_string_long(c_ssl));
2357 /*                      else if (c_write)
2358                                 printf("client:SSL_write()\n");
2359                         else
2360                                 printf("client:SSL_read()\n"); */
2361                         }
2362
2363                 if (!do_client && !do_server)
2364                         {
2365                         fprintf(stdout,"ERROR IN STARTUP\n");
2366                         ERR_print_errors(bio_err);
2367                         break;
2368                         }
2369                 if (do_client && !(done & C_DONE))
2370                         {
2371                         if (c_write)
2372                                 {
2373                                 j = (cw_num > (long)sizeof(cbuf)) ?
2374                                         (int)sizeof(cbuf) : (int)cw_num;
2375                                 i=BIO_write(c_bio,cbuf,j);
2376                                 if (i < 0)
2377                                         {
2378                                         c_r=0;
2379                                         c_w=0;
2380                                         if (BIO_should_retry(c_bio))
2381                                                 {
2382                                                 if (BIO_should_read(c_bio))
2383                                                         c_r=1;
2384                                                 if (BIO_should_write(c_bio))
2385                                                         c_w=1;
2386                                                 }
2387                                         else
2388                                                 {
2389                                                 fprintf(stderr,"ERROR in CLIENT\n");
2390                                                 ERR_print_errors(bio_err);
2391                                                 goto err;
2392                                                 }
2393                                         }
2394                                 else if (i == 0)
2395                                         {
2396                                         fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2397                                         goto err;
2398                                         }
2399                                 else
2400                                         {
2401                                         if (debug)
2402                                                 printf("client wrote %d\n",i);
2403                                         /* ok */
2404                                         s_r=1;
2405                                         c_write=0;
2406                                         cw_num-=i;
2407                                         }
2408                                 }
2409                         else
2410                                 {
2411                                 i=BIO_read(c_bio,cbuf,sizeof(cbuf));
2412                                 if (i < 0)
2413                                         {
2414                                         c_r=0;
2415                                         c_w=0;
2416                                         if (BIO_should_retry(c_bio))
2417                                                 {
2418                                                 if (BIO_should_read(c_bio))
2419                                                         c_r=1;
2420                                                 if (BIO_should_write(c_bio))
2421                                                         c_w=1;
2422                                                 }
2423                                         else
2424                                                 {
2425                                                 fprintf(stderr,"ERROR in CLIENT\n");
2426                                                 ERR_print_errors(bio_err);
2427                                                 goto err;
2428                                                 }
2429                                         }
2430                                 else if (i == 0)
2431                                         {
2432                                         fprintf(stderr,"SSL CLIENT STARTUP FAILED\n");
2433                                         goto err;
2434                                         }
2435                                 else
2436                                         {
2437                                         if (debug)
2438                                                 printf("client read %d\n",i);
2439                                         cr_num-=i;
2440                                         if (sw_num > 0)
2441                                                 {
2442                                                 s_write=1;
2443                                                 s_w=1;
2444                                                 }
2445                                         if (cr_num <= 0)
2446                                                 {
2447                                                 s_write=1;
2448                                                 s_w=1;
2449                                                 done=S_DONE|C_DONE;
2450                                                 }
2451                                         }
2452                                 }
2453                         }
2454
2455                 if (do_server && !(done & S_DONE))
2456                         {
2457                         if (!s_write)
2458                                 {
2459                                 i=BIO_read(s_bio,sbuf,sizeof(cbuf));
2460                                 if (i < 0)
2461                                         {
2462                                         s_r=0;
2463                                         s_w=0;
2464                                         if (BIO_should_retry(s_bio))
2465                                                 {
2466                                                 if (BIO_should_read(s_bio))
2467                                                         s_r=1;
2468                                                 if (BIO_should_write(s_bio))
2469                                                         s_w=1;
2470                                                 }
2471                                         else
2472                                                 {
2473                                                 fprintf(stderr,"ERROR in SERVER\n");
2474                                                 ERR_print_errors(bio_err);
2475                                                 goto err;
2476                                                 }
2477                                         }
2478                                 else if (i == 0)
2479                                         {
2480                                         ERR_print_errors(bio_err);
2481                                         fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_read\n");
2482                                         goto err;
2483                                         }
2484                                 else
2485                                         {
2486                                         if (debug)
2487                                                 printf("server read %d\n",i);
2488                                         sr_num-=i;
2489                                         if (cw_num > 0)
2490                                                 {
2491                                                 c_write=1;
2492                                                 c_w=1;
2493                                                 }
2494                                         if (sr_num <= 0)
2495                                                 {
2496                                                 s_write=1;
2497                                                 s_w=1;
2498                                                 c_write=0;
2499                                                 }
2500                                         }
2501                                 }
2502                         else
2503                                 {
2504                                 j = (sw_num > (long)sizeof(sbuf)) ?
2505                                         (int)sizeof(sbuf) : (int)sw_num;
2506                                 i=BIO_write(s_bio,sbuf,j);
2507                                 if (i < 0)
2508                                         {
2509                                         s_r=0;
2510                                         s_w=0;
2511                                         if (BIO_should_retry(s_bio))
2512                                                 {
2513                                                 if (BIO_should_read(s_bio))
2514                                                         s_r=1;
2515                                                 if (BIO_should_write(s_bio))
2516                                                         s_w=1;
2517                                                 }
2518                                         else
2519                                                 {
2520                                                 fprintf(stderr,"ERROR in SERVER\n");
2521                                                 ERR_print_errors(bio_err);
2522                                                 goto err;
2523                                                 }
2524                                         }
2525                                 else if (i == 0)
2526                                         {
2527                                         ERR_print_errors(bio_err);
2528                                         fprintf(stderr,"SSL SERVER STARTUP FAILED in SSL_write\n");
2529                                         goto err;
2530                                         }
2531                                 else
2532                                         {
2533                                         if (debug)
2534                                                 printf("server wrote %d\n",i);
2535                                         sw_num-=i;
2536                                         s_write=0;
2537                                         c_r=1;
2538                                         if (sw_num <= 0)
2539                                                 done|=S_DONE;
2540                                         }
2541                                 }
2542                         }
2543
2544                 if ((done & S_DONE) && (done & C_DONE)) break;
2545                 }
2546
2547         if (verbose)
2548                 print_details(c_ssl, "DONE: ");
2549         if (suppdata_error < 0)
2550                 {
2551                 ret = 1;
2552                 goto err;
2553                 }
2554         if (verify_serverinfo() < 0)
2555                 {
2556                 ret = 1;
2557                 goto err;
2558                 }
2559         if (custom_ext_error)
2560                 {
2561                 ret = 1;
2562                 goto err;
2563                 }
2564         ret=0;
2565 err:
2566         /* We have to set the BIO's to NULL otherwise they will be
2567          * OPENSSL_free()ed twice.  Once when th s_ssl is SSL_free()ed and
2568          * again when c_ssl is SSL_free()ed.
2569          * This is a hack required because s_ssl and c_ssl are sharing the same
2570          * BIO structure and SSL_set_bio() and SSL_free() automatically
2571          * BIO_free non NULL entries.
2572          * You should not normally do this or be required to do this */
2573         if (s_ssl != NULL)
2574                 {
2575                 s_ssl->rbio=NULL;
2576                 s_ssl->wbio=NULL;
2577                 }
2578         if (c_ssl != NULL)
2579                 {
2580                 c_ssl->rbio=NULL;
2581                 c_ssl->wbio=NULL;
2582                 }
2583
2584         if (c_to_s != NULL) BIO_free(c_to_s);
2585         if (s_to_c != NULL) BIO_free(s_to_c);
2586         if (c_bio != NULL) BIO_free_all(c_bio);
2587         if (s_bio != NULL) BIO_free_all(s_bio);
2588         return(ret);
2589         }
2590
2591 static int get_proxy_auth_ex_data_idx(void)
2592         {
2593         static volatile int idx = -1;
2594         if (idx < 0)
2595                 {
2596                 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
2597                 if (idx < 0)
2598                         {
2599                         idx = X509_STORE_CTX_get_ex_new_index(0,
2600                                 "SSLtest for verify callback", NULL,NULL,NULL);
2601                         }
2602                 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
2603                 }
2604         return idx;
2605         }
2606
2607 static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
2608         {
2609         char *s,buf[256];
2610
2611         s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,
2612                             sizeof buf);
2613         if (s != NULL)
2614                 {
2615                 if (ok)
2616                         fprintf(stderr,"depth=%d %s\n",
2617                                 ctx->error_depth,buf);
2618                 else
2619                         {
2620                         fprintf(stderr,"depth=%d error=%d %s\n",
2621                                 ctx->error_depth,ctx->error,buf);
2622                         }
2623                 }
2624
2625         if (ok == 0)
2626                 {
2627                 fprintf(stderr,"Error string: %s\n",
2628                         X509_verify_cert_error_string(ctx->error));
2629                 switch (ctx->error)
2630                         {
2631                 case X509_V_ERR_CERT_NOT_YET_VALID:
2632                 case X509_V_ERR_CERT_HAS_EXPIRED:
2633                 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
2634                         fprintf(stderr,"  ... ignored.\n");
2635                         ok=1;
2636                         }
2637                 }
2638
2639         if (ok == 1)
2640                 {
2641                 X509 *xs = ctx->current_cert;
2642 #if 0
2643                 X509 *xi = ctx->current_issuer;
2644 #endif
2645
2646                 if (xs->ex_flags & EXFLAG_PROXY)
2647                         {
2648                         unsigned int *letters =
2649                                 X509_STORE_CTX_get_ex_data(ctx,
2650                                         get_proxy_auth_ex_data_idx());
2651
2652                         if (letters)
2653                                 {
2654                                 int found_any = 0;
2655                                 int i;
2656                                 PROXY_CERT_INFO_EXTENSION *pci =
2657                                         X509_get_ext_d2i(xs, NID_proxyCertInfo,
2658                                                 NULL, NULL);
2659
2660                                 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage))
2661                                         {
2662                                 case NID_Independent:
2663                                         /* Completely meaningless in this
2664                                            program, as there's no way to
2665                                            grant explicit rights to a
2666                                            specific PrC.  Basically, using
2667                                            id-ppl-Independent is the perfect
2668                                            way to grant no rights at all. */
2669                                         fprintf(stderr, "  Independent proxy certificate");
2670                                         for (i = 0; i < 26; i++)
2671                                                 letters[i] = 0;
2672                                         break;
2673                                 case NID_id_ppl_inheritAll:
2674                                         /* This is basically a NOP, we
2675                                            simply let the current rights
2676                                            stand as they are. */
2677                                         fprintf(stderr, "  Proxy certificate inherits all");
2678                                         break;
2679                                 default:
2680                                         s = (char *)
2681                                                 pci->proxyPolicy->policy->data;
2682                                         i = pci->proxyPolicy->policy->length;
2683
2684                                         /* The algorithm works as follows:
2685                                            it is assumed that previous
2686                                            iterations or the initial granted
2687                                            rights has already set some elements
2688                                            of `letters'.  What we need to do is
2689                                            to clear those that weren't granted
2690                                            by the current PrC as well.  The
2691                                            easiest way to do this is to add 1
2692                                            to all the elements whose letters
2693                                            are given with the current policy.
2694                                            That way, all elements that are set
2695                                            by the current policy and were
2696                                            already set by earlier policies and
2697                                            through the original grant of rights
2698                                            will get the value 2 or higher.
2699                                            The last thing to do is to sweep
2700                                            through `letters' and keep the
2701                                            elements having the value 2 as set,
2702                                            and clear all the others. */
2703
2704                                         fprintf(stderr, "  Certificate proxy rights = %*.*s", i, i, s);
2705                                         while(i-- > 0)
2706                                                 {
2707                                                 int c = *s++;
2708                                                 if (isascii(c) && isalpha(c))
2709                                                         {
2710                                                         if (islower(c))
2711                                                                 c = toupper(c);
2712                                                         letters[c - 'A']++;
2713                                                         }
2714                                                 }
2715                                         for (i = 0; i < 26; i++)
2716                                                 if (letters[i] < 2)
2717                                                         letters[i] = 0;
2718                                                 else
2719                                                         letters[i] = 1;
2720                                         }
2721
2722                                 found_any = 0;
2723                                 fprintf(stderr,
2724                                         ", resulting proxy rights = ");
2725                                 for(i = 0; i < 26; i++)
2726                                         if (letters[i])
2727                                                 {
2728                                                 fprintf(stderr, "%c", i + 'A');
2729                                                 found_any = 1;
2730                                                 }
2731                                 if (!found_any)
2732                                         fprintf(stderr, "none");
2733                                 fprintf(stderr, "\n");
2734
2735                                 PROXY_CERT_INFO_EXTENSION_free(pci);
2736                                 }
2737                         }
2738                 }
2739
2740         return(ok);
2741         }
2742
2743 static void process_proxy_debug(int indent, const char *format, ...)
2744         {
2745         static const char indentation[] =
2746                 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
2747                 ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */
2748         char my_format[256];
2749         va_list args;
2750
2751         BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2752                 indent, indent, indentation, format);
2753
2754         va_start(args, format);
2755         vfprintf(stderr, my_format, args);
2756         va_end(args);
2757         }
2758 /* Priority levels:
2759    0    [!]var, ()
2760    1    & ^
2761    2    |
2762 */
2763 static int process_proxy_cond_adders(unsigned int letters[26],
2764         const char *cond, const char **cond_end, int *pos, int indent);
2765 static int process_proxy_cond_val(unsigned int letters[26],
2766         const char *cond, const char **cond_end, int *pos, int indent)
2767         {
2768         int c;
2769         int ok = 1;
2770         int negate = 0;
2771
2772         while(isspace((int)*cond))
2773                 {
2774                 cond++; (*pos)++;
2775                 }
2776         c = *cond;
2777
2778         if (debug)
2779                 process_proxy_debug(indent,
2780                         "Start process_proxy_cond_val at position %d: %s\n",
2781                         *pos, cond);
2782
2783         while(c == '!')
2784                 {
2785                 negate = !negate;
2786                 cond++; (*pos)++;
2787                 while(isspace((int)*cond))
2788                         {
2789                         cond++; (*pos)++;
2790                         }
2791                 c = *cond;
2792                 }
2793
2794         if (c == '(')
2795                 {
2796                 cond++; (*pos)++;
2797                 ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
2798                         indent + 1);
2799                 cond = *cond_end;
2800                 if (ok < 0)
2801                         goto end;
2802                 while(isspace((int)*cond))
2803                         {
2804                         cond++; (*pos)++;
2805                         }
2806                 c = *cond;
2807                 if (c != ')')
2808                         {
2809                         fprintf(stderr,
2810                                 "Weird condition character in position %d: "
2811                                 "%c\n", *pos, c);
2812                         ok = -1;
2813                         goto end;
2814                         }
2815                 cond++; (*pos)++;
2816                 }
2817         else if (isascii(c) && isalpha(c))
2818                 {
2819                 if (islower(c))
2820                         c = toupper(c);
2821                 ok = letters[c - 'A'];
2822                 cond++; (*pos)++;
2823                 }
2824         else
2825                 {
2826                 fprintf(stderr,
2827                         "Weird condition character in position %d: "
2828                         "%c\n", *pos, c);
2829                 ok = -1;
2830                 goto end;
2831                 }
2832  end:
2833         *cond_end = cond;
2834         if (ok >= 0 && negate)
2835                 ok = !ok;
2836
2837         if (debug)
2838                 process_proxy_debug(indent,
2839                         "End process_proxy_cond_val at position %d: %s, returning %d\n",
2840                         *pos, cond, ok);
2841
2842         return ok;
2843         }
2844 static int process_proxy_cond_multipliers(unsigned int letters[26],
2845         const char *cond, const char **cond_end, int *pos, int indent)
2846         {
2847         int ok;
2848         char c;
2849
2850         if (debug)
2851                 process_proxy_debug(indent,
2852                         "Start process_proxy_cond_multipliers at position %d: %s\n",
2853                         *pos, cond);
2854
2855         ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
2856         cond = *cond_end;
2857         if (ok < 0)
2858                 goto end;
2859
2860         while(ok >= 0)
2861                 {
2862                 while(isspace((int)*cond))
2863                         {
2864                         cond++; (*pos)++;
2865                         }
2866                 c = *cond;
2867
2868                 switch(c)
2869                         {
2870                 case '&':
2871                 case '^':
2872                         {
2873                         int save_ok = ok;
2874
2875                         cond++; (*pos)++;
2876                         ok = process_proxy_cond_val(letters,
2877                                 cond, cond_end, pos, indent + 1);
2878                         cond = *cond_end;
2879                         if (ok < 0)
2880                                 break;
2881
2882                         switch(c)
2883                                 {
2884                         case '&':
2885                                 ok &= save_ok;
2886                                 break;
2887                         case '^':
2888                                 ok ^= save_ok;
2889                                 break;
2890                         default:
2891                                 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2892                                         " STOPPING\n");
2893                                 EXIT(1);
2894                                 }
2895                         }
2896                         break;
2897                 default:
2898                         goto end;
2899                         }
2900                 }
2901  end:
2902         if (debug)
2903                 process_proxy_debug(indent,
2904                         "End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
2905                         *pos, cond, ok);
2906
2907         *cond_end = cond;
2908         return ok;
2909         }
2910 static int process_proxy_cond_adders(unsigned int letters[26],
2911         const char *cond, const char **cond_end, int *pos, int indent)
2912         {
2913         int ok;
2914         char c;
2915
2916         if (debug)
2917                 process_proxy_debug(indent,
2918                         "Start process_proxy_cond_adders at position %d: %s\n",
2919                         *pos, cond);
2920
2921         ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
2922                 indent + 1);
2923         cond = *cond_end;
2924         if (ok < 0)
2925                 goto end;
2926
2927         while(ok >= 0)
2928                 {
2929                 while(isspace((int)*cond))
2930                         {
2931                         cond++; (*pos)++;
2932                         }
2933                 c = *cond;
2934
2935                 switch(c)
2936                         {
2937                 case '|':
2938                         {
2939                         int save_ok = ok;
2940
2941                         cond++; (*pos)++;
2942                         ok = process_proxy_cond_multipliers(letters,
2943                                 cond, cond_end, pos, indent + 1);
2944                         cond = *cond_end;
2945                         if (ok < 0)
2946                                 break;
2947
2948                         switch(c)
2949                                 {
2950                         case '|':
2951                                 ok |= save_ok;
2952                                 break;
2953                         default:
2954                                 fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
2955                                         " STOPPING\n");
2956                                 EXIT(1);
2957                                 }
2958                         }
2959                         break;
2960                 default:
2961                         goto end;
2962                         }
2963                 }
2964  end:
2965         if (debug)
2966                 process_proxy_debug(indent,
2967                         "End process_proxy_cond_adders at position %d: %s, returning %d\n",
2968                         *pos, cond, ok);
2969
2970         *cond_end = cond;
2971         return ok;
2972         }
2973
2974 static int process_proxy_cond(unsigned int letters[26],
2975         const char *cond, const char **cond_end)
2976         {
2977         int pos = 1;
2978         return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
2979         }
2980
2981 static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
2982         {
2983         int ok=1;
2984         struct app_verify_arg *cb_arg = arg;
2985         unsigned int letters[26]; /* only used with proxy_auth */
2986
2987         if (cb_arg->app_verify)
2988                 {
2989                 char *s = NULL,buf[256];
2990
2991                 fprintf(stderr, "In app_verify_callback, allowing cert. ");
2992                 fprintf(stderr, "Arg is: %s\n", cb_arg->string);
2993                 fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
2994                         (void *)ctx, (void *)ctx->cert);
2995                 if (ctx->cert)
2996                         s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256);
2997                 if (s != NULL)
2998                         {
2999                         fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf);
3000                         }
3001                 return(1);
3002                 }
3003         if (cb_arg->proxy_auth)
3004                 {
3005                 int found_any = 0, i;
3006                 char *sp;
3007
3008                 for(i = 0; i < 26; i++)
3009                         letters[i] = 0;
3010                 for(sp = cb_arg->proxy_auth; *sp; sp++)
3011                         {
3012                         int c = *sp;
3013                         if (isascii(c) && isalpha(c))
3014                                 {
3015                                 if (islower(c))
3016                                         c = toupper(c);
3017                                 letters[c - 'A'] = 1;
3018                                 }
3019                         }
3020
3021                 fprintf(stderr,
3022                         "  Initial proxy rights = ");
3023                 for(i = 0; i < 26; i++)
3024                         if (letters[i])
3025                                 {
3026                                 fprintf(stderr, "%c", i + 'A');
3027                                 found_any = 1;
3028                                 }
3029                 if (!found_any)
3030                         fprintf(stderr, "none");
3031                 fprintf(stderr, "\n");
3032
3033                 X509_STORE_CTX_set_ex_data(ctx,
3034                         get_proxy_auth_ex_data_idx(),letters);
3035                 }
3036         if (cb_arg->allow_proxy_certs)
3037                 {
3038                 X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
3039                 }
3040
3041 #ifndef OPENSSL_NO_X509_VERIFY
3042         ok = X509_verify_cert(ctx);
3043 #endif
3044
3045         if (cb_arg->proxy_auth)
3046                 {
3047                 if (ok > 0)
3048                         {
3049                         const char *cond_end = NULL;
3050
3051                         ok = process_proxy_cond(letters,
3052                                 cb_arg->proxy_cond, &cond_end);
3053
3054                         if (ok < 0)
3055                                 EXIT(3);
3056                         if (*cond_end)
3057                                 {
3058                                 fprintf(stderr, "Stopped processing condition before it's end.\n");
3059                                 ok = 0;
3060                                 }
3061                         if (!ok)
3062                                 fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n",
3063                                         cb_arg->proxy_cond);
3064                         else
3065                                 fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n",
3066                                         cb_arg->proxy_cond);
3067                         }
3068                 }
3069         return(ok);
3070         }
3071
3072 #ifndef OPENSSL_NO_RSA
3073 static RSA *rsa_tmp=NULL;
3074
3075 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
3076         {
3077         BIGNUM *bn = NULL;
3078         if (rsa_tmp == NULL)
3079                 {
3080                 bn = BN_new();
3081                 rsa_tmp = RSA_new();
3082                 if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4))
3083                         {
3084                         BIO_printf(bio_err, "Memory error...");
3085                         goto end;
3086                         }
3087                 BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
3088                 (void)BIO_flush(bio_err);
3089                 if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL))
3090                         {
3091                         BIO_printf(bio_err, "Error generating key.");
3092                         RSA_free(rsa_tmp);
3093                         rsa_tmp = NULL;
3094                         }
3095 end:
3096                 BIO_printf(bio_err,"\n");
3097                 (void)BIO_flush(bio_err);
3098                 }
3099         if(bn) BN_free(bn);
3100         return(rsa_tmp);
3101         }
3102
3103 static void free_tmp_rsa(void)
3104         {
3105         if (rsa_tmp != NULL)
3106                 {
3107                 RSA_free(rsa_tmp);
3108                 rsa_tmp = NULL;
3109                 }
3110         }
3111 #endif
3112
3113 #ifndef OPENSSL_NO_DH
3114 /* These DH parameters have been generated as follows:
3115  *    $ openssl dhparam -C -noout 512
3116  *    $ openssl dhparam -C -noout 1024
3117  *    $ openssl dhparam -C -noout -dsaparam 1024
3118  * (The third function has been renamed to avoid name conflicts.)
3119  */
3120 static DH *get_dh512()
3121         {
3122         static unsigned char dh512_p[]={
3123                 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
3124                 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
3125                 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
3126                 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
3127                 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
3128                 0x02,0xC5,0xAE,0x23,
3129                 };
3130         static unsigned char dh512_g[]={
3131                 0x02,
3132                 };
3133         DH *dh;
3134
3135         if ((dh=DH_new()) == NULL) return(NULL);
3136         dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
3137         dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
3138         if ((dh->p == NULL) || (dh->g == NULL))
3139                 { DH_free(dh); return(NULL); }
3140         return(dh);
3141         }
3142
3143 static DH *get_dh1024()
3144         {
3145         static unsigned char dh1024_p[]={
3146                 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
3147                 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
3148                 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
3149                 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
3150                 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
3151                 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
3152                 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
3153                 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
3154                 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
3155                 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
3156                 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
3157                 };
3158         static unsigned char dh1024_g[]={
3159                 0x02,
3160                 };
3161         DH *dh;
3162
3163         if ((dh=DH_new()) == NULL) return(NULL);
3164         dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3165         dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3166         if ((dh->p == NULL) || (dh->g == NULL))
3167                 { DH_free(dh); return(NULL); }
3168         return(dh);
3169         }
3170
3171 static DH *get_dh1024dsa()
3172         {
3173         static unsigned char dh1024_p[]={
3174                 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
3175                 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
3176                 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
3177                 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
3178                 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
3179                 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
3180                 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
3181                 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
3182                 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
3183                 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
3184                 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
3185                 };
3186         static unsigned char dh1024_g[]={
3187                 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
3188                 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
3189                 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
3190                 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
3191                 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
3192                 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
3193                 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
3194                 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
3195                 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
3196                 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
3197                 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
3198                 };
3199         DH *dh;
3200
3201         if ((dh=DH_new()) == NULL) return(NULL);
3202         dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
3203         dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
3204         if ((dh->p == NULL) || (dh->g == NULL))
3205                 { DH_free(dh); return(NULL); }
3206         dh->length = 160;
3207         return(dh);
3208         }
3209 #endif
3210
3211 #ifndef OPENSSL_NO_PSK
3212 /* convert the PSK key (psk_key) in ascii to binary (psk) */
3213 static int psk_key2bn(const char *pskkey, unsigned char *psk,
3214         unsigned int max_psk_len)
3215         {
3216         int ret;
3217         BIGNUM *bn = NULL;
3218
3219         ret = BN_hex2bn(&bn, pskkey);
3220         if (!ret)
3221                 {
3222                 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", pskkey); 
3223                 if (bn)
3224                         BN_free(bn);
3225                 return 0;
3226                 }
3227         if (BN_num_bytes(bn) > (int)max_psk_len)
3228                 {
3229                 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
3230                         max_psk_len, BN_num_bytes(bn));
3231                 BN_free(bn);
3232                 return 0;
3233                 }
3234         ret = BN_bn2bin(bn, psk);
3235         BN_free(bn);
3236         return ret;
3237         }
3238
3239 static unsigned int psk_client_callback(SSL *ssl, const char *hint, char *identity,
3240         unsigned int max_identity_len, unsigned char *psk,
3241         unsigned int max_psk_len)
3242         {
3243         int ret;
3244         unsigned int psk_len = 0;
3245
3246         ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
3247         if (ret < 0)
3248                 goto out_err;
3249         if (debug)
3250                 fprintf(stderr, "client: created identity '%s' len=%d\n", identity, ret);
3251         ret = psk_key2bn(psk_key, psk, max_psk_len);
3252         if (ret < 0)
3253                 goto out_err;
3254         psk_len = ret;
3255 out_err:
3256         return psk_len;
3257         }
3258
3259 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
3260         unsigned char *psk, unsigned int max_psk_len)
3261         {
3262         unsigned int psk_len=0;
3263
3264         if (strcmp(identity, "Client_identity") != 0)
3265                 {
3266                 BIO_printf(bio_err, "server: PSK error: client identity not found\n");
3267                 return 0;
3268                 }
3269         psk_len=psk_key2bn(psk_key, psk, max_psk_len);
3270         return psk_len;
3271         }
3272 #endif
3273
3274 static int do_test_cipherlist(void)
3275         {
3276         int i = 0;
3277         const SSL_METHOD *meth;
3278         const SSL_CIPHER *ci, *tci = NULL;
3279
3280 #ifndef OPENSSL_NO_SSL2
3281         fprintf(stderr, "testing SSLv2 cipher list order: ");
3282         meth = SSLv2_method();
3283         while ((ci = meth->get_cipher(i++)) != NULL)
3284                 {
3285                 if (tci != NULL)
3286                         if (ci->id >= tci->id)
3287                                 {
3288                                 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3289                                 return 0;
3290                                 }
3291                 tci = ci;
3292                 }
3293         fprintf(stderr, "ok\n");
3294 #endif
3295 #ifndef OPENSSL_NO_SSL3
3296         fprintf(stderr, "testing SSLv3 cipher list order: ");
3297         meth = SSLv3_method();
3298         tci = NULL;
3299         while ((ci = meth->get_cipher(i++)) != NULL)
3300                 {
3301                 if (tci != NULL)
3302                         if (ci->id >= tci->id)
3303                                 {
3304                                 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3305                                 return 0;
3306                                 }
3307                 tci = ci;
3308                 }
3309         fprintf(stderr, "ok\n");
3310 #endif
3311 #ifndef OPENSSL_NO_TLS1
3312         fprintf(stderr, "testing TLSv1 cipher list order: ");
3313         meth = TLSv1_method();
3314         tci = NULL;
3315         while ((ci = meth->get_cipher(i++)) != NULL)
3316                 {
3317                 if (tci != NULL)
3318                         if (ci->id >= tci->id)
3319                                 {
3320                                 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
3321                                 return 0;
3322                                 }
3323                 tci = ci;
3324                 }
3325         fprintf(stderr, "ok\n");
3326 #endif
3327
3328         return 1;
3329         }