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