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