Refactoring BIO: add a test, using test/ssltest
[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_load_crypto_strings();
1414             ERR_print_errors(bio_err);
1415             EXIT(1);
1416         } else
1417             fprintf(stderr, "*** IN FIPS MODE ***\n");
1418     }
1419 #endif
1420
1421     if (print_time) {
1422         if (bio_type != BIO_PAIR) {
1423             fprintf(stderr, "Using BIO pair (-bio_pair)\n");
1424             bio_type = BIO_PAIR;
1425         }
1426         if (number < 50 && !force)
1427             fprintf(stderr,
1428                     "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
1429     }
1430
1431 /*      if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
1432
1433     SSL_library_init();
1434     SSL_load_error_strings();
1435
1436 #ifndef OPENSSL_NO_COMP
1437     if (comp == COMP_ZLIB)
1438         cm = COMP_zlib();
1439     if (cm != NULL) {
1440         if (COMP_get_type(cm) != NID_undef) {
1441             if (SSL_COMP_add_compression_method(comp, cm) != 0) {
1442                 fprintf(stderr, "Failed to add compression method\n");
1443                 ERR_print_errors_fp(stderr);
1444             }
1445         } else {
1446             fprintf(stderr,
1447                     "Warning: %s compression not supported\n",
1448                     comp == COMP_ZLIB ? "zlib" : "unknown");
1449             ERR_print_errors_fp(stderr);
1450         }
1451     }
1452     ssl_comp_methods = SSL_COMP_get_compression_methods();
1453     n = sk_SSL_COMP_num(ssl_comp_methods);
1454     if (n) {
1455         int j;
1456         printf("Available compression methods:");
1457         for (j = 0; j < n; j++) {
1458             SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
1459             printf("  %s:%d", c->name, c->id);
1460         }
1461         printf("\n");
1462     }
1463 #endif
1464
1465     /*
1466      * At this point, ssl3/tls1 is only set if the protocol is available.
1467      * (Otherwise we exit early.) However the compiler doesn't know this, so
1468      * we ifdef.
1469      */
1470 #ifndef OPENSSL_NO_DTLS
1471 #ifndef OPENSSL_NO_DTLS1
1472     if (dtls1)
1473         meth = DTLSv1_method();
1474     else
1475 #endif
1476 #ifndef OPENSSL_NO_DTLS1_2
1477     if (dtls12)
1478         meth = DTLSv1_2_method();
1479     else
1480 #endif
1481     if (dtls)
1482         meth = DTLS_method();
1483     else
1484 #endif
1485 #ifndef OPENSSL_NO_SSL3
1486     if (ssl3)
1487         meth = SSLv3_method();
1488     else
1489 #endif
1490 #ifndef OPENSSL_NO_TLS1
1491     if (tls1)
1492         meth = TLSv1_method();
1493     else
1494 #endif
1495         meth = TLS_method();
1496
1497     c_ctx = SSL_CTX_new(meth);
1498     s_ctx = SSL_CTX_new(meth);
1499     if ((c_ctx == NULL) || (s_ctx == NULL)) {
1500         ERR_print_errors(bio_err);
1501         goto end;
1502     }
1503     /*
1504      * Since we will use low security ciphersuites and keys for testing set
1505      * security level to zero by default. Tests can override this by adding
1506      * "@SECLEVEL=n" to the cipher string.
1507      */
1508     SSL_CTX_set_security_level(c_ctx, 0);
1509     SSL_CTX_set_security_level(s_ctx, 0);
1510
1511     if (cipher != NULL) {
1512         if (!SSL_CTX_set_cipher_list(c_ctx, cipher)
1513            || !SSL_CTX_set_cipher_list(s_ctx, cipher)) {
1514             ERR_print_errors(bio_err);
1515             goto end;
1516         }
1517     }
1518
1519     /* Process SSL_CONF arguments */
1520     SSL_CONF_CTX_set_ssl_ctx(c_cctx, c_ctx);
1521     SSL_CONF_CTX_set_ssl_ctx(s_cctx, s_ctx);
1522
1523     for (i = 0; i < sk_OPENSSL_STRING_num(conf_args); i += 2) {
1524         int rv;
1525         arg = sk_OPENSSL_STRING_value(conf_args, i);
1526         argn = sk_OPENSSL_STRING_value(conf_args, i + 1);
1527         rv = SSL_CONF_cmd(c_cctx, arg, argn);
1528         /* If not recognised use server context */
1529         if (rv == -2)
1530             rv = SSL_CONF_cmd(s_cctx, arg, argn);
1531         if (rv <= 0) {
1532             BIO_printf(bio_err, "Error processing %s %s\n",
1533                        arg, argn ? argn : "");
1534             ERR_print_errors(bio_err);
1535             goto end;
1536         }
1537     }
1538
1539     if (!SSL_CONF_CTX_finish(s_cctx) || !SSL_CONF_CTX_finish(c_cctx)) {
1540         BIO_puts(bio_err, "Error finishing context\n");
1541         ERR_print_errors(bio_err);
1542         goto end;
1543     }
1544 #ifndef OPENSSL_NO_DH
1545     if (!no_dhe) {
1546         if (dhe1024dsa) {
1547             /*
1548              * use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks
1549              */
1550             SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
1551             dh = get_dh1024dsa();
1552         } else if (dhe512)
1553             dh = get_dh512();
1554         else
1555             dh = get_dh1024();
1556         SSL_CTX_set_tmp_dh(s_ctx, dh);
1557         DH_free(dh);
1558     }
1559 #else
1560     (void)no_dhe;
1561 #endif
1562
1563 #ifndef OPENSSL_NO_EC
1564     if (!no_ecdhe) {
1565         int nid;
1566
1567         if (named_curve != NULL) {
1568             nid = OBJ_sn2nid(named_curve);
1569             if (nid == 0) {
1570                 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1571                 goto end;
1572             }
1573         } else {
1574             nid = NID_X9_62_prime256v1;
1575         }
1576
1577         ecdh = EC_KEY_new_by_curve_name(nid);
1578         if (ecdh == NULL) {
1579             BIO_printf(bio_err, "unable to create curve\n");
1580             goto end;
1581         }
1582
1583         SSL_CTX_set_tmp_ecdh(s_ctx, ecdh);
1584         SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_ECDH_USE);
1585         EC_KEY_free(ecdh);
1586     }
1587 #else
1588     (void)no_ecdhe;
1589 #endif
1590
1591     if ((!SSL_CTX_load_verify_locations(s_ctx, CAfile, CApath)) ||
1592         (!SSL_CTX_set_default_verify_paths(s_ctx)) ||
1593         (!SSL_CTX_load_verify_locations(c_ctx, CAfile, CApath)) ||
1594         (!SSL_CTX_set_default_verify_paths(c_ctx))) {
1595         /* fprintf(stderr,"SSL_load_verify_locations\n"); */
1596         ERR_print_errors(bio_err);
1597         /* goto end; */
1598     }
1599
1600     if (client_auth) {
1601         printf("client authentication\n");
1602         SSL_CTX_set_verify(s_ctx,
1603                            SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
1604                            verify_callback);
1605         SSL_CTX_set_cert_verify_callback(s_ctx, app_verify_callback,
1606                                          &app_verify_arg);
1607     }
1608     if (server_auth) {
1609         printf("server authentication\n");
1610         SSL_CTX_set_verify(c_ctx, SSL_VERIFY_PEER, verify_callback);
1611         SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback,
1612                                          &app_verify_arg);
1613     }
1614
1615     {
1616         int session_id_context = 0;
1617         if (!SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context,
1618                                        sizeof session_id_context)) {
1619             ERR_print_errors(bio_err);
1620             goto end;
1621         }
1622     }
1623
1624     /* Use PSK only if PSK key is given */
1625     if (psk_key != NULL) {
1626         /*
1627          * no_psk is used to avoid putting psk command to openssl tool
1628          */
1629         if (no_psk) {
1630             /*
1631              * if PSK is not compiled in and psk key is given, do nothing and
1632              * exit successfully
1633              */
1634             ret = 0;
1635             goto end;
1636         }
1637 #ifndef OPENSSL_NO_PSK
1638         SSL_CTX_set_psk_client_callback(c_ctx, psk_client_callback);
1639         SSL_CTX_set_psk_server_callback(s_ctx, psk_server_callback);
1640         if (debug)
1641             BIO_printf(bio_err, "setting PSK identity hint to s_ctx\n");
1642         if (!SSL_CTX_use_psk_identity_hint(s_ctx, "ctx server identity_hint")) {
1643             BIO_printf(bio_err, "error setting PSK identity hint to s_ctx\n");
1644             ERR_print_errors(bio_err);
1645             goto end;
1646         }
1647 #endif
1648     }
1649 #ifndef OPENSSL_NO_SRP
1650     if (srp_client_arg.srplogin) {
1651         if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin)) {
1652             BIO_printf(bio_err, "Unable to set SRP username\n");
1653             goto end;
1654         }
1655         SSL_CTX_set_srp_cb_arg(c_ctx, &srp_client_arg);
1656         SSL_CTX_set_srp_client_pwd_callback(c_ctx,
1657                                             ssl_give_srp_client_pwd_cb);
1658         /*
1659          * SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);
1660          */
1661     }
1662
1663     if (srp_server_arg.expected_user != NULL) {
1664         SSL_CTX_set_verify(s_ctx, SSL_VERIFY_NONE, verify_callback);
1665         SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg);
1666         SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
1667     }
1668 #endif
1669
1670 #ifndef OPENSSL_NO_NEXTPROTONEG
1671     if (npn_client) {
1672         SSL_CTX_set_next_proto_select_cb(c_ctx, cb_client_npn, NULL);
1673     }
1674     if (npn_server) {
1675         if (npn_server_reject) {
1676             BIO_printf(bio_err,
1677                        "Can't have both -npn_server and -npn_server_reject\n");
1678             goto end;
1679         }
1680         SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_npn, NULL);
1681     }
1682     if (npn_server_reject) {
1683         SSL_CTX_set_next_protos_advertised_cb(s_ctx, cb_server_rejects_npn,
1684                                               NULL);
1685     }
1686 #endif
1687
1688     if (serverinfo_sct) {
1689         if (!SSL_CTX_add_client_custom_ext(c_ctx, SCT_EXT_TYPE,
1690                                       NULL, NULL, NULL,
1691                                       serverinfo_cli_parse_cb, NULL)) {
1692             BIO_printf(bio_err, "Error adding SCT extension\n");
1693             goto end;
1694         }
1695     }
1696     if (serverinfo_tack) {
1697         if (!SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
1698                                       NULL, NULL, NULL,
1699                                       serverinfo_cli_parse_cb, NULL)) {
1700             BIO_printf(bio_err, "Error adding TACK extension\n");
1701             goto end;
1702         }
1703     }
1704     if (serverinfo_file)
1705         if (!SSL_CTX_use_serverinfo_file(s_ctx, serverinfo_file)) {
1706             BIO_printf(bio_err, "missing serverinfo file\n");
1707             goto end;
1708         }
1709
1710     if (custom_ext) {
1711         if (!SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
1712                                       custom_ext_0_cli_add_cb,
1713                                       NULL, NULL,
1714                                       custom_ext_0_cli_parse_cb, NULL)
1715             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
1716                                       custom_ext_1_cli_add_cb,
1717                                       NULL, NULL,
1718                                       custom_ext_1_cli_parse_cb, NULL)
1719             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
1720                                       custom_ext_2_cli_add_cb,
1721                                       NULL, NULL,
1722                                       custom_ext_2_cli_parse_cb, NULL)
1723             || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
1724                                       custom_ext_3_cli_add_cb,
1725                                       NULL, NULL,
1726                                       custom_ext_3_cli_parse_cb, NULL)
1727             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
1728                                       custom_ext_0_srv_add_cb,
1729                                       NULL, NULL,
1730                                       custom_ext_0_srv_parse_cb, NULL)
1731             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
1732                                       custom_ext_1_srv_add_cb,
1733                                       NULL, NULL,
1734                                       custom_ext_1_srv_parse_cb, NULL)
1735             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
1736                                       custom_ext_2_srv_add_cb,
1737                                       NULL, NULL,
1738                                       custom_ext_2_srv_parse_cb, NULL)
1739             || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
1740                                       custom_ext_3_srv_add_cb,
1741                                       NULL, NULL,
1742                                       custom_ext_3_srv_parse_cb, NULL)) {
1743             BIO_printf(bio_err, "Error setting custom extensions\n");
1744             goto end;
1745         }
1746     }
1747
1748     if (alpn_server)
1749         SSL_CTX_set_alpn_select_cb(s_ctx, cb_server_alpn, NULL);
1750
1751     if (alpn_client) {
1752         unsigned short alpn_len;
1753         unsigned char *alpn = next_protos_parse(&alpn_len, alpn_client);
1754
1755         if (alpn == NULL) {
1756             BIO_printf(bio_err, "Error parsing -alpn_client argument\n");
1757             goto end;
1758         }
1759         /* Returns 0 on success!! */
1760         if (SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len)) {
1761             BIO_printf(bio_err, "Error setting ALPN\n");
1762             OPENSSL_free(alpn);
1763             goto end;
1764         }
1765         OPENSSL_free(alpn);
1766     }
1767
1768     c_ssl = SSL_new(c_ctx);
1769     s_ssl = SSL_new(s_ctx);
1770
1771     if (!set_protocol_version(server_min_proto, s_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
1772         goto end;
1773     if (!set_protocol_version(server_max_proto, s_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
1774         goto end;
1775     if (!set_protocol_version(client_min_proto, c_ssl, SSL_CTRL_SET_MIN_PROTO_VERSION))
1776         goto end;
1777     if (!set_protocol_version(client_max_proto, c_ssl, SSL_CTRL_SET_MAX_PROTO_VERSION))
1778         goto end;
1779
1780     BIO_printf(bio_stdout, "Doing handshakes=%d bytes=%ld\n", number, bytes);
1781     for (i = 0; i < number; i++) {
1782         if (!reuse) {
1783             if (!SSL_set_session(c_ssl, NULL)) {
1784                 BIO_printf(bio_err, "Failed to set session\n");
1785                 goto end;
1786             }
1787         }
1788         switch (bio_type) {
1789         case BIO_MEM:
1790             ret = doit(s_ssl, c_ssl, bytes);
1791             break;
1792         case BIO_PAIR:
1793             ret = doit_biopair(s_ssl, c_ssl, bytes, &s_time, &c_time);
1794             break;
1795         case BIO_IPV4:
1796             ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV4,
1797                                  bytes, &s_time, &c_time);
1798             break;
1799         case BIO_IPV6:
1800             ret = doit_localhost(s_ssl, c_ssl, BIO_FAMILY_IPV6,
1801                                  bytes, &s_time, &c_time);
1802             break;
1803         }
1804         if (ret)  break;
1805     }
1806
1807     if (should_negotiate && ret == 0 &&
1808         strcmp(should_negotiate, "fail-server") != 0 &&
1809         strcmp(should_negotiate, "fail-client") != 0) {
1810         int version = protocol_from_string(should_negotiate);
1811         if (version < 0) {
1812             BIO_printf(bio_err, "Error parsing: %s\n", should_negotiate);
1813             ret = 1;
1814             goto err;
1815         }
1816         if (SSL_version(c_ssl) != version) {
1817             BIO_printf(bio_err, "Unxpected version negotiated. "
1818                 "Expected: %s, got %s\n", should_negotiate, SSL_get_version(c_ssl));
1819             ret = 1;
1820             goto err;
1821         }
1822     }
1823
1824     if (!verbose) {
1825         print_details(c_ssl, "");
1826     }
1827     if (print_time) {
1828 #ifdef CLOCKS_PER_SEC
1829         /*
1830          * "To determine the time in seconds, the value returned by the clock
1831          * function should be divided by the value of the macro
1832          * CLOCKS_PER_SEC." -- ISO/IEC 9899
1833          */
1834         BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
1835                    "Approximate total client time: %6.2f s\n",
1836                    (double)s_time / CLOCKS_PER_SEC,
1837                    (double)c_time / CLOCKS_PER_SEC);
1838 #else
1839         BIO_printf(bio_stdout,
1840                    "Approximate total server time: %6.2f units\n"
1841                    "Approximate total client time: %6.2f units\n",
1842                    (double)s_time, (double)c_time);
1843 #endif
1844     }
1845
1846  err:
1847     SSL_free(s_ssl);
1848     SSL_free(c_ssl);
1849
1850  end:
1851     SSL_CTX_free(s_ctx);
1852     SSL_CTX_free(c_ctx);
1853     SSL_CONF_CTX_free(s_cctx);
1854     SSL_CONF_CTX_free(c_cctx);
1855     sk_OPENSSL_STRING_free(conf_args);
1856
1857     BIO_free(bio_stdout);
1858
1859 #ifndef OPENSSL_NO_ENGINE
1860     ENGINE_cleanup();
1861 #endif
1862     CONF_modules_unload(1);
1863     CRYPTO_cleanup_all_ex_data();
1864     ERR_free_strings();
1865     ERR_remove_thread_state(NULL);
1866     EVP_cleanup();
1867 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
1868     CRYPTO_mem_leaks(bio_err);
1869 #endif
1870     BIO_free(bio_err);
1871     EXIT(ret);
1872 }
1873
1874 int doit_localhost(SSL *s_ssl, SSL *c_ssl, int family, long count,
1875                    clock_t *s_time, clock_t *c_time)
1876 {
1877     long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
1878     BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
1879     BIO *acpt = NULL, *server = NULL, *client = NULL;
1880     char addr_str[40];
1881     int ret = 1;
1882     int err_in_client = 0;
1883     int err_in_server = 0;
1884
1885     acpt = BIO_new_accept("0");
1886     if (acpt == NULL)
1887         goto err;
1888     BIO_set_accept_ip_family(acpt, family);
1889     BIO_set_bind_mode(acpt, BIO_SOCK_NONBLOCK | BIO_SOCK_REUSEADDR);
1890     if (BIO_do_accept(acpt) <= 0)
1891         goto err;
1892
1893     snprintf(addr_str, sizeof(addr_str), ":%s", BIO_get_accept_port(acpt));
1894
1895     client = BIO_new_connect(addr_str);
1896     BIO_set_conn_ip_family(client, family);
1897     if (!client)
1898         goto err;
1899
1900     if (BIO_set_nbio(client, 1) <= 0)
1901         goto err;
1902     if (BIO_set_nbio(acpt, 1) <= 0)
1903         goto err;
1904
1905     {
1906         int st_connect = 0, st_accept = 0;
1907
1908         while(!st_connect || !st_accept) {
1909             if (!st_connect) {
1910                 if (BIO_do_connect(client) <= 0) {
1911                     if (!BIO_should_retry(client))
1912                         goto err;
1913                 } else {
1914                     st_connect = 1;
1915                 }
1916             }
1917             if (!st_accept) {
1918                 if (BIO_do_accept(acpt) <= 0) {
1919                     if (!BIO_should_retry(acpt))
1920                         goto err;
1921                 } else {
1922                     st_accept = 1;
1923                 }
1924             }
1925         }
1926     }
1927     /* We're not interested in accepting further connects */
1928     server = BIO_pop(acpt);
1929     BIO_free_all(acpt);
1930     acpt = NULL;
1931
1932     s_ssl_bio = BIO_new(BIO_f_ssl());
1933     if (!s_ssl_bio)
1934         goto err;
1935
1936     c_ssl_bio = BIO_new(BIO_f_ssl());
1937     if (!c_ssl_bio)
1938         goto err;
1939
1940     SSL_set_connect_state(c_ssl);
1941     SSL_set_bio(c_ssl, client, client);
1942     (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
1943
1944     SSL_set_accept_state(s_ssl);
1945     SSL_set_bio(s_ssl, server, server);
1946     (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
1947
1948     do {
1949         /*-
1950          * c_ssl_bio:          SSL filter BIO
1951          *
1952          * client:             I/O for SSL library
1953          *
1954          *
1955          * server:             I/O for SSL library
1956          *
1957          * s_ssl_bio:          SSL filter BIO
1958          */
1959
1960         /*
1961          * We have non-blocking behaviour throughout this test program, but
1962          * can be sure that there is *some* progress in each iteration; so we
1963          * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
1964          * we just try everything in each iteration
1965          */
1966
1967         {
1968             /* CLIENT */
1969
1970             char cbuf[1024 * 8];
1971             int i, r;
1972             clock_t c_clock = clock();
1973
1974             memset(cbuf, 0, sizeof(cbuf));
1975
1976             if (debug)
1977                 if (SSL_in_init(c_ssl))
1978                     printf("client waiting in SSL_connect - %s\n",
1979                            SSL_state_string_long(c_ssl));
1980
1981             if (cw_num > 0) {
1982                 /* Write to server. */
1983
1984                 if (cw_num > (long)sizeof cbuf)
1985                     i = sizeof cbuf;
1986                 else
1987                     i = (int)cw_num;
1988                 r = BIO_write(c_ssl_bio, cbuf, i);
1989                 if (r < 0) {
1990                     if (!BIO_should_retry(c_ssl_bio)) {
1991                         fprintf(stderr, "ERROR in CLIENT\n");
1992                         err_in_client = 1;
1993                         goto err;
1994                     }
1995                     /*
1996                      * BIO_should_retry(...) can just be ignored here. The
1997                      * library expects us to call BIO_write with the same
1998                      * arguments again, and that's what we will do in the
1999                      * next iteration.
2000                      */
2001                 } else if (r == 0) {
2002                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2003                     goto err;
2004                 } else {
2005                     if (debug)
2006                         printf("client wrote %d\n", r);
2007                     cw_num -= r;
2008                 }
2009             }
2010
2011             if (cr_num > 0) {
2012                 /* Read from server. */
2013
2014                 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
2015                 if (r < 0) {
2016                     if (!BIO_should_retry(c_ssl_bio)) {
2017                         fprintf(stderr, "ERROR in CLIENT\n");
2018                         err_in_client = 1;
2019                         goto err;
2020                     }
2021                     /*
2022                      * Again, "BIO_should_retry" can be ignored.
2023                      */
2024                 } else if (r == 0) {
2025                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2026                     goto err;
2027                 } else {
2028                     if (debug)
2029                         printf("client read %d\n", r);
2030                     cr_num -= r;
2031                 }
2032             }
2033
2034             /*
2035              * c_time and s_time increments will typically be very small
2036              * (depending on machine speed and clock tick intervals), but
2037              * sampling over a large number of connections should result in
2038              * fairly accurate figures.  We cannot guarantee a lot, however
2039              * -- if each connection lasts for exactly one clock tick, it
2040              * will be counted only for the client or only for the server or
2041              * even not at all.
2042              */
2043             *c_time += (clock() - c_clock);
2044         }
2045
2046         {
2047             /* SERVER */
2048
2049             char sbuf[1024 * 8];
2050             int i, r;
2051             clock_t s_clock = clock();
2052
2053             memset(sbuf, 0, sizeof(sbuf));
2054
2055             if (debug)
2056                 if (SSL_in_init(s_ssl))
2057                     printf("server waiting in SSL_accept - %s\n",
2058                            SSL_state_string_long(s_ssl));
2059
2060             if (sw_num > 0) {
2061                 /* Write to client. */
2062
2063                 if (sw_num > (long)sizeof sbuf)
2064                     i = sizeof sbuf;
2065                 else
2066                     i = (int)sw_num;
2067                 r = BIO_write(s_ssl_bio, sbuf, i);
2068                 if (r < 0) {
2069                     if (!BIO_should_retry(s_ssl_bio)) {
2070                         fprintf(stderr, "ERROR in SERVER\n");
2071                         err_in_server = 1;
2072                         goto err;
2073                     }
2074                     /* Ignore "BIO_should_retry". */
2075                 } else if (r == 0) {
2076                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2077                     goto err;
2078                 } else {
2079                     if (debug)
2080                         printf("server wrote %d\n", r);
2081                     sw_num -= r;
2082                 }
2083             }
2084
2085             if (sr_num > 0) {
2086                 /* Read from client. */
2087
2088                 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2089                 if (r < 0) {
2090                     if (!BIO_should_retry(s_ssl_bio)) {
2091                         fprintf(stderr, "ERROR in SERVER\n");
2092                         err_in_server = 1;
2093                         goto err;
2094                     }
2095                     /* blah, blah */
2096                 } else if (r == 0) {
2097                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2098                     goto err;
2099                 } else {
2100                     if (debug)
2101                         printf("server read %d\n", r);
2102                     sr_num -= r;
2103                 }
2104             }
2105
2106             *s_time += (clock() - s_clock);
2107         }
2108     }
2109     while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2110
2111     if (verbose)
2112         print_details(c_ssl, "DONE via TCP connect: ");
2113 #ifndef OPENSSL_NO_NEXTPROTONEG
2114     if (verify_npn(c_ssl, s_ssl) < 0) {
2115         ret = 1;
2116         goto end;
2117     }
2118 #endif
2119     if (verify_serverinfo() < 0) {
2120         fprintf(stderr, "Server info verify error\n");
2121         ret = 1;
2122         goto err;
2123     }
2124     if (verify_alpn(c_ssl, s_ssl) < 0) {
2125         ret = 1;
2126         goto err;
2127     }
2128
2129     if (custom_ext_error) {
2130         fprintf(stderr, "Custom extension error\n");
2131         ret = 1;
2132         goto err;
2133     }
2134
2135  end:
2136     ret = 0;
2137
2138  err:
2139     ERR_print_errors(bio_err);
2140
2141     BIO_free_all(acpt);
2142     BIO_free(server);
2143     BIO_free(client);
2144     BIO_free(s_ssl_bio);
2145     BIO_free(c_ssl_bio);
2146
2147     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2148         ret = (err_in_client != 0) ? 0 : 1;
2149     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2150         ret = (err_in_server != 0) ? 0 : 1;
2151
2152     return ret;
2153 }
2154
2155 int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
2156                  clock_t *s_time, clock_t *c_time)
2157 {
2158     long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
2159     BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
2160     BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
2161     int ret = 1;
2162     int err_in_client = 0;
2163     int err_in_server = 0;
2164
2165     size_t bufsiz = 256;        /* small buffer for testing */
2166
2167     if (!BIO_new_bio_pair(&server, bufsiz, &server_io, bufsiz))
2168         goto err;
2169     if (!BIO_new_bio_pair(&client, bufsiz, &client_io, bufsiz))
2170         goto err;
2171
2172     s_ssl_bio = BIO_new(BIO_f_ssl());
2173     if (!s_ssl_bio)
2174         goto err;
2175
2176     c_ssl_bio = BIO_new(BIO_f_ssl());
2177     if (!c_ssl_bio)
2178         goto err;
2179
2180     SSL_set_connect_state(c_ssl);
2181     SSL_set_bio(c_ssl, client, client);
2182     (void)BIO_set_ssl(c_ssl_bio, c_ssl, BIO_NOCLOSE);
2183
2184     SSL_set_accept_state(s_ssl);
2185     SSL_set_bio(s_ssl, server, server);
2186     (void)BIO_set_ssl(s_ssl_bio, s_ssl, BIO_NOCLOSE);
2187
2188     do {
2189         /*-
2190          * c_ssl_bio:          SSL filter BIO
2191          *
2192          * client:             pseudo-I/O for SSL library
2193          *
2194          * client_io:          client's SSL communication; usually to be
2195          *                     relayed over some I/O facility, but in this
2196          *                     test program, we're the server, too:
2197          *
2198          * server_io:          server's SSL communication
2199          *
2200          * server:             pseudo-I/O for SSL library
2201          *
2202          * s_ssl_bio:          SSL filter BIO
2203          *
2204          * The client and the server each employ a "BIO pair":
2205          * client + client_io, server + server_io.
2206          * BIO pairs are symmetric.  A BIO pair behaves similar
2207          * to a non-blocking socketpair (but both endpoints must
2208          * be handled by the same thread).
2209          * [Here we could connect client and server to the ends
2210          * of a single BIO pair, but then this code would be less
2211          * suitable as an example for BIO pairs in general.]
2212          *
2213          * Useful functions for querying the state of BIO pair endpoints:
2214          *
2215          * BIO_ctrl_pending(bio)              number of bytes we can read now
2216          * BIO_ctrl_get_read_request(bio)     number of bytes needed to fulfil
2217          *                                      other side's read attempt
2218          * BIO_ctrl_get_write_guarantee(bio)   number of bytes we can write now
2219          *
2220          * ..._read_request is never more than ..._write_guarantee;
2221          * it depends on the application which one you should use.
2222          */
2223
2224         /*
2225          * We have non-blocking behaviour throughout this test program, but
2226          * can be sure that there is *some* progress in each iteration; so we
2227          * don't have to worry about ..._SHOULD_READ or ..._SHOULD_WRITE --
2228          * we just try everything in each iteration
2229          */
2230
2231         {
2232             /* CLIENT */
2233
2234             char cbuf[1024 * 8];
2235             int i, r;
2236             clock_t c_clock = clock();
2237
2238             memset(cbuf, 0, sizeof(cbuf));
2239
2240             if (debug)
2241                 if (SSL_in_init(c_ssl))
2242                     printf("client waiting in SSL_connect - %s\n",
2243                            SSL_state_string_long(c_ssl));
2244
2245             if (cw_num > 0) {
2246                 /* Write to server. */
2247
2248                 if (cw_num > (long)sizeof cbuf)
2249                     i = sizeof cbuf;
2250                 else
2251                     i = (int)cw_num;
2252                 r = BIO_write(c_ssl_bio, cbuf, i);
2253                 if (r < 0) {
2254                     if (!BIO_should_retry(c_ssl_bio)) {
2255                         fprintf(stderr, "ERROR in CLIENT\n");
2256                         err_in_client = 1;
2257                         goto err;
2258                     }
2259                     /*
2260                      * BIO_should_retry(...) can just be ignored here. The
2261                      * library expects us to call BIO_write with the same
2262                      * arguments again, and that's what we will do in the
2263                      * next iteration.
2264                      */
2265                 } else if (r == 0) {
2266                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2267                     goto err;
2268                 } else {
2269                     if (debug)
2270                         printf("client wrote %d\n", r);
2271                     cw_num -= r;
2272                 }
2273             }
2274
2275             if (cr_num > 0) {
2276                 /* Read from server. */
2277
2278                 r = BIO_read(c_ssl_bio, cbuf, sizeof(cbuf));
2279                 if (r < 0) {
2280                     if (!BIO_should_retry(c_ssl_bio)) {
2281                         fprintf(stderr, "ERROR in CLIENT\n");
2282                         err_in_client = 1;
2283                         goto err;
2284                     }
2285                     /*
2286                      * Again, "BIO_should_retry" can be ignored.
2287                      */
2288                 } else if (r == 0) {
2289                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2290                     goto err;
2291                 } else {
2292                     if (debug)
2293                         printf("client read %d\n", r);
2294                     cr_num -= r;
2295                 }
2296             }
2297
2298             /*
2299              * c_time and s_time increments will typically be very small
2300              * (depending on machine speed and clock tick intervals), but
2301              * sampling over a large number of connections should result in
2302              * fairly accurate figures.  We cannot guarantee a lot, however
2303              * -- if each connection lasts for exactly one clock tick, it
2304              * will be counted only for the client or only for the server or
2305              * even not at all.
2306              */
2307             *c_time += (clock() - c_clock);
2308         }
2309
2310         {
2311             /* SERVER */
2312
2313             char sbuf[1024 * 8];
2314             int i, r;
2315             clock_t s_clock = clock();
2316
2317             memset(sbuf, 0, sizeof(sbuf));
2318
2319             if (debug)
2320                 if (SSL_in_init(s_ssl))
2321                     printf("server waiting in SSL_accept - %s\n",
2322                            SSL_state_string_long(s_ssl));
2323
2324             if (sw_num > 0) {
2325                 /* Write to client. */
2326
2327                 if (sw_num > (long)sizeof sbuf)
2328                     i = sizeof sbuf;
2329                 else
2330                     i = (int)sw_num;
2331                 r = BIO_write(s_ssl_bio, sbuf, i);
2332                 if (r < 0) {
2333                     if (!BIO_should_retry(s_ssl_bio)) {
2334                         fprintf(stderr, "ERROR in SERVER\n");
2335                         err_in_server = 1;
2336                         goto err;
2337                     }
2338                     /* Ignore "BIO_should_retry". */
2339                 } else if (r == 0) {
2340                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2341                     goto err;
2342                 } else {
2343                     if (debug)
2344                         printf("server wrote %d\n", r);
2345                     sw_num -= r;
2346                 }
2347             }
2348
2349             if (sr_num > 0) {
2350                 /* Read from client. */
2351
2352                 r = BIO_read(s_ssl_bio, sbuf, sizeof(sbuf));
2353                 if (r < 0) {
2354                     if (!BIO_should_retry(s_ssl_bio)) {
2355                         fprintf(stderr, "ERROR in SERVER\n");
2356                         err_in_server = 1;
2357                         goto err;
2358                     }
2359                     /* blah, blah */
2360                 } else if (r == 0) {
2361                     fprintf(stderr, "SSL SERVER STARTUP FAILED\n");
2362                     goto err;
2363                 } else {
2364                     if (debug)
2365                         printf("server read %d\n", r);
2366                     sr_num -= r;
2367                 }
2368             }
2369
2370             *s_time += (clock() - s_clock);
2371         }
2372
2373         {
2374             /* "I/O" BETWEEN CLIENT AND SERVER. */
2375
2376             size_t r1, r2;
2377             BIO *io1 = server_io, *io2 = client_io;
2378             /*
2379              * we use the non-copying interface for io1 and the standard
2380              * BIO_write/BIO_read interface for io2
2381              */
2382
2383             static int prev_progress = 1;
2384             int progress = 0;
2385
2386             /* io1 to io2 */
2387             do {
2388                 size_t num;
2389                 int r;
2390
2391                 r1 = BIO_ctrl_pending(io1);
2392                 r2 = BIO_ctrl_get_write_guarantee(io2);
2393
2394                 num = r1;
2395                 if (r2 < num)
2396                     num = r2;
2397                 if (num) {
2398                     char *dataptr;
2399
2400                     if (INT_MAX < num) /* yeah, right */
2401                         num = INT_MAX;
2402
2403                     r = BIO_nread(io1, &dataptr, (int)num);
2404                     assert(r > 0);
2405                     assert(r <= (int)num);
2406                     /*
2407                      * possibly r < num (non-contiguous data)
2408                      */
2409                     num = r;
2410                     r = BIO_write(io2, dataptr, (int)num);
2411                     if (r != (int)num) { /* can't happen */
2412                         fprintf(stderr, "ERROR: BIO_write could not write "
2413                                 "BIO_ctrl_get_write_guarantee() bytes");
2414                         goto err;
2415                     }
2416                     progress = 1;
2417
2418                     if (debug)
2419                         printf((io1 == client_io) ?
2420                                "C->S relaying: %d bytes\n" :
2421                                "S->C relaying: %d bytes\n", (int)num);
2422                 }
2423             }
2424             while (r1 && r2);
2425
2426             /* io2 to io1 */
2427             {
2428                 size_t num;
2429                 int r;
2430
2431                 r1 = BIO_ctrl_pending(io2);
2432                 r2 = BIO_ctrl_get_read_request(io1);
2433                 /*
2434                  * here we could use ..._get_write_guarantee instead of
2435                  * ..._get_read_request, but by using the latter we test
2436                  * restartability of the SSL implementation more thoroughly
2437                  */
2438                 num = r1;
2439                 if (r2 < num)
2440                     num = r2;
2441                 if (num) {
2442                     char *dataptr;
2443
2444                     if (INT_MAX < num)
2445                         num = INT_MAX;
2446
2447                     if (num > 1)
2448                         --num;  /* test restartability even more thoroughly */
2449
2450                     r = BIO_nwrite0(io1, &dataptr);
2451                     assert(r > 0);
2452                     if (r < (int)num)
2453                         num = r;
2454                     r = BIO_read(io2, dataptr, (int)num);
2455                     if (r != (int)num) { /* can't happen */
2456                         fprintf(stderr, "ERROR: BIO_read could not read "
2457                                 "BIO_ctrl_pending() bytes");
2458                         goto err;
2459                     }
2460                     progress = 1;
2461                     r = BIO_nwrite(io1, &dataptr, (int)num);
2462                     if (r != (int)num) { /* can't happen */
2463                         fprintf(stderr, "ERROR: BIO_nwrite() did not accept "
2464                                 "BIO_nwrite0() bytes");
2465                         goto err;
2466                     }
2467
2468                     if (debug)
2469                         printf((io2 == client_io) ?
2470                                "C->S relaying: %d bytes\n" :
2471                                "S->C relaying: %d bytes\n", (int)num);
2472                 }
2473             }                   /* no loop, BIO_ctrl_get_read_request now
2474                                  * returns 0 anyway */
2475
2476             if (!progress && !prev_progress)
2477                 if (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0) {
2478                     fprintf(stderr, "ERROR: got stuck\n");
2479                     fprintf(stderr, " ERROR.\n");
2480                     goto err;
2481                 }
2482             prev_progress = progress;
2483         }
2484     }
2485     while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
2486
2487     if (verbose)
2488         print_details(c_ssl, "DONE via BIO pair: ");
2489 #ifndef OPENSSL_NO_NEXTPROTONEG
2490     if (verify_npn(c_ssl, s_ssl) < 0) {
2491         ret = 1;
2492         goto end;
2493     }
2494 #endif
2495     if (verify_serverinfo() < 0) {
2496         fprintf(stderr, "Server info verify error\n");
2497         ret = 1;
2498         goto err;
2499     }
2500     if (verify_alpn(c_ssl, s_ssl) < 0) {
2501         ret = 1;
2502         goto err;
2503     }
2504
2505     if (custom_ext_error) {
2506         fprintf(stderr, "Custom extension error\n");
2507         ret = 1;
2508         goto err;
2509     }
2510
2511  end:
2512     ret = 0;
2513
2514  err:
2515     ERR_print_errors(bio_err);
2516
2517     BIO_free(server);
2518     BIO_free(server_io);
2519     BIO_free(client);
2520     BIO_free(client_io);
2521     BIO_free(s_ssl_bio);
2522     BIO_free(c_ssl_bio);
2523
2524     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2525         ret = (err_in_client != 0) ? 0 : 1;
2526     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2527         ret = (err_in_server != 0) ? 0 : 1;
2528
2529     return ret;
2530 }
2531
2532 #define W_READ  1
2533 #define W_WRITE 2
2534 #define C_DONE  1
2535 #define S_DONE  2
2536
2537 int doit(SSL *s_ssl, SSL *c_ssl, long count)
2538 {
2539     char *cbuf = NULL, *sbuf = NULL;
2540     long bufsiz;
2541     long cw_num = count, cr_num = count;
2542     long sw_num = count, sr_num = count;
2543     int ret = 1;
2544     BIO *c_to_s = NULL;
2545     BIO *s_to_c = NULL;
2546     BIO *c_bio = NULL;
2547     BIO *s_bio = NULL;
2548     int c_r, c_w, s_r, s_w;
2549     int i, j;
2550     int done = 0;
2551     int c_write, s_write;
2552     int do_server = 0, do_client = 0;
2553     int max_frag = 5 * 1024;
2554     int err_in_client = 0;
2555     int err_in_server = 0;
2556
2557     bufsiz = count > 40 * 1024 ? 40 * 1024 : count;
2558
2559     if ((cbuf = OPENSSL_zalloc(bufsiz)) == NULL)
2560         goto err;
2561     if ((sbuf = OPENSSL_zalloc(bufsiz)) == NULL)
2562         goto err;
2563
2564     c_to_s = BIO_new(BIO_s_mem());
2565     s_to_c = BIO_new(BIO_s_mem());
2566     if ((s_to_c == NULL) || (c_to_s == NULL)) {
2567         ERR_print_errors(bio_err);
2568         goto err;
2569     }
2570
2571     c_bio = BIO_new(BIO_f_ssl());
2572     s_bio = BIO_new(BIO_f_ssl());
2573     if ((c_bio == NULL) || (s_bio == NULL)) {
2574         ERR_print_errors(bio_err);
2575         goto err;
2576     }
2577
2578     SSL_set_connect_state(c_ssl);
2579     SSL_set_bio(c_ssl, s_to_c, c_to_s);
2580     SSL_set_max_send_fragment(c_ssl, max_frag);
2581     BIO_set_ssl(c_bio, c_ssl, BIO_NOCLOSE);
2582
2583     SSL_set_accept_state(s_ssl);
2584     SSL_set_bio(s_ssl, c_to_s, s_to_c);
2585     SSL_set_max_send_fragment(s_ssl, max_frag);
2586     BIO_set_ssl(s_bio, s_ssl, BIO_NOCLOSE);
2587
2588     c_r = 0;
2589     s_r = 1;
2590     c_w = 1;
2591     s_w = 0;
2592     c_write = 1, s_write = 0;
2593
2594     /* We can always do writes */
2595     for (;;) {
2596         do_server = 0;
2597         do_client = 0;
2598
2599         i = (int)BIO_pending(s_bio);
2600         if ((i && s_r) || s_w)
2601             do_server = 1;
2602
2603         i = (int)BIO_pending(c_bio);
2604         if ((i && c_r) || c_w)
2605             do_client = 1;
2606
2607         if (do_server && debug) {
2608             if (SSL_in_init(s_ssl))
2609                 printf("server waiting in SSL_accept - %s\n",
2610                        SSL_state_string_long(s_ssl));
2611 /*-
2612             else if (s_write)
2613                 printf("server:SSL_write()\n");
2614             else
2615                 printf("server:SSL_read()\n"); */
2616         }
2617
2618         if (do_client && debug) {
2619             if (SSL_in_init(c_ssl))
2620                 printf("client waiting in SSL_connect - %s\n",
2621                        SSL_state_string_long(c_ssl));
2622 /*-
2623             else if (c_write)
2624                 printf("client:SSL_write()\n");
2625             else
2626                 printf("client:SSL_read()\n"); */
2627         }
2628
2629         if (!do_client && !do_server) {
2630             fprintf(stdout, "ERROR IN STARTUP\n");
2631             ERR_print_errors(bio_err);
2632             goto err;
2633         }
2634         if (do_client && !(done & C_DONE)) {
2635             if (c_write) {
2636                 j = (cw_num > bufsiz) ? (int)bufsiz : (int)cw_num;
2637                 i = BIO_write(c_bio, cbuf, j);
2638                 if (i < 0) {
2639                     c_r = 0;
2640                     c_w = 0;
2641                     if (BIO_should_retry(c_bio)) {
2642                         if (BIO_should_read(c_bio))
2643                             c_r = 1;
2644                         if (BIO_should_write(c_bio))
2645                             c_w = 1;
2646                     } else {
2647                         fprintf(stderr, "ERROR in CLIENT\n");
2648                         err_in_client = 1;
2649                         ERR_print_errors(bio_err);
2650                         goto err;
2651                     }
2652                 } else if (i == 0) {
2653                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2654                     goto err;
2655                 } else {
2656                     if (debug)
2657                         printf("client wrote %d\n", i);
2658                     /* ok */
2659                     s_r = 1;
2660                     c_write = 0;
2661                     cw_num -= i;
2662                     if (max_frag > 1029)
2663                         SSL_set_max_send_fragment(c_ssl, max_frag -= 5);
2664                 }
2665             } else {
2666                 i = BIO_read(c_bio, cbuf, bufsiz);
2667                 if (i < 0) {
2668                     c_r = 0;
2669                     c_w = 0;
2670                     if (BIO_should_retry(c_bio)) {
2671                         if (BIO_should_read(c_bio))
2672                             c_r = 1;
2673                         if (BIO_should_write(c_bio))
2674                             c_w = 1;
2675                     } else {
2676                         fprintf(stderr, "ERROR in CLIENT\n");
2677                         err_in_client = 1;
2678                         ERR_print_errors(bio_err);
2679                         goto err;
2680                     }
2681                 } else if (i == 0) {
2682                     fprintf(stderr, "SSL CLIENT STARTUP FAILED\n");
2683                     goto err;
2684                 } else {
2685                     if (debug)
2686                         printf("client read %d\n", i);
2687                     cr_num -= i;
2688                     if (sw_num > 0) {
2689                         s_write = 1;
2690                         s_w = 1;
2691                     }
2692                     if (cr_num <= 0) {
2693                         s_write = 1;
2694                         s_w = 1;
2695                         done = S_DONE | C_DONE;
2696                     }
2697                 }
2698             }
2699         }
2700
2701         if (do_server && !(done & S_DONE)) {
2702             if (!s_write) {
2703                 i = BIO_read(s_bio, sbuf, bufsiz);
2704                 if (i < 0) {
2705                     s_r = 0;
2706                     s_w = 0;
2707                     if (BIO_should_retry(s_bio)) {
2708                         if (BIO_should_read(s_bio))
2709                             s_r = 1;
2710                         if (BIO_should_write(s_bio))
2711                             s_w = 1;
2712                     } else {
2713                         fprintf(stderr, "ERROR in SERVER\n");
2714                         err_in_server = 1;
2715                         ERR_print_errors(bio_err);
2716                         goto err;
2717                     }
2718                 } else if (i == 0) {
2719                     ERR_print_errors(bio_err);
2720                     fprintf(stderr,
2721                             "SSL SERVER STARTUP FAILED in SSL_read\n");
2722                     goto err;
2723                 } else {
2724                     if (debug)
2725                         printf("server read %d\n", i);
2726                     sr_num -= i;
2727                     if (cw_num > 0) {
2728                         c_write = 1;
2729                         c_w = 1;
2730                     }
2731                     if (sr_num <= 0) {
2732                         s_write = 1;
2733                         s_w = 1;
2734                         c_write = 0;
2735                     }
2736                 }
2737             } else {
2738                 j = (sw_num > bufsiz) ? (int)bufsiz : (int)sw_num;
2739                 i = BIO_write(s_bio, sbuf, j);
2740                 if (i < 0) {
2741                     s_r = 0;
2742                     s_w = 0;
2743                     if (BIO_should_retry(s_bio)) {
2744                         if (BIO_should_read(s_bio))
2745                             s_r = 1;
2746                         if (BIO_should_write(s_bio))
2747                             s_w = 1;
2748                     } else {
2749                         fprintf(stderr, "ERROR in SERVER\n");
2750                         err_in_server = 1;
2751                         ERR_print_errors(bio_err);
2752                         goto err;
2753                     }
2754                 } else if (i == 0) {
2755                     ERR_print_errors(bio_err);
2756                     fprintf(stderr,
2757                             "SSL SERVER STARTUP FAILED in SSL_write\n");
2758                     goto err;
2759                 } else {
2760                     if (debug)
2761                         printf("server wrote %d\n", i);
2762                     sw_num -= i;
2763                     s_write = 0;
2764                     c_r = 1;
2765                     if (sw_num <= 0)
2766                         done |= S_DONE;
2767                     if (max_frag > 1029)
2768                         SSL_set_max_send_fragment(s_ssl, max_frag -= 5);
2769                 }
2770             }
2771         }
2772
2773         if ((done & S_DONE) && (done & C_DONE))
2774             break;
2775     }
2776
2777     if (verbose)
2778         print_details(c_ssl, "DONE: ");
2779 #ifndef OPENSSL_NO_NEXTPROTONEG
2780     if (verify_npn(c_ssl, s_ssl) < 0) {
2781         ret = 1;
2782         goto err;
2783     }
2784 #endif
2785     if (verify_serverinfo() < 0) {
2786         fprintf(stderr, "Server info verify error\n");
2787         ret = 1;
2788         goto err;
2789     }
2790     if (custom_ext_error) {
2791         fprintf(stderr, "Custom extension error\n");
2792         ret = 1;
2793         goto err;
2794     }
2795     ret = 0;
2796  err:
2797     /*
2798      * We have to set the BIO's to NULL otherwise they will be
2799      * OPENSSL_free()ed twice.  Once when th s_ssl is SSL_free()ed and again
2800      * when c_ssl is SSL_free()ed. This is a hack required because s_ssl and
2801      * c_ssl are sharing the same BIO structure and SSL_set_bio() and
2802      * SSL_free() automatically BIO_free non NULL entries. You should not
2803      * normally do this or be required to do this
2804      */
2805     if (s_ssl != NULL) {
2806         s_ssl->rbio = NULL;
2807         s_ssl->wbio = NULL;
2808     }
2809     if (c_ssl != NULL) {
2810         c_ssl->rbio = NULL;
2811         c_ssl->wbio = NULL;
2812     }
2813
2814     BIO_free(c_to_s);
2815     BIO_free(s_to_c);
2816     BIO_free_all(c_bio);
2817     BIO_free_all(s_bio);
2818     OPENSSL_free(cbuf);
2819     OPENSSL_free(sbuf);
2820
2821     if (should_negotiate != NULL && strcmp(should_negotiate, "fail-client") == 0)
2822         ret = (err_in_client != 0) ? 0 : 1;
2823     else if (should_negotiate != NULL && strcmp(should_negotiate, "fail-server") == 0)
2824         ret = (err_in_server != 0) ? 0 : 1;
2825
2826     return (ret);
2827 }
2828
2829 static int get_proxy_auth_ex_data_idx(void)
2830 {
2831     static volatile int idx = -1;
2832     if (idx < 0) {
2833         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
2834         if (idx < 0) {
2835             idx = X509_STORE_CTX_get_ex_new_index(0,
2836                                                   "SSLtest for verify callback",
2837                                                   NULL, NULL, NULL);
2838         }
2839         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
2840     }
2841     return idx;
2842 }
2843
2844 static int verify_callback(int ok, X509_STORE_CTX *ctx)
2845 {
2846     char *s, buf[256];
2847
2848     s = X509_NAME_oneline(X509_get_subject_name(ctx->current_cert), buf,
2849                           sizeof buf);
2850     if (s != NULL) {
2851         if (ok)
2852             printf("depth=%d %s\n", ctx->error_depth, buf);
2853         else {
2854             fprintf(stderr, "depth=%d error=%d %s\n",
2855                     ctx->error_depth, ctx->error, buf);
2856         }
2857     }
2858
2859     if (ok == 0) {
2860         switch (ctx->error) {
2861         default:
2862             fprintf(stderr, "Error string: %s\n",
2863                     X509_verify_cert_error_string(ctx->error));
2864             break;
2865         case X509_V_ERR_CERT_NOT_YET_VALID:
2866         case X509_V_ERR_CERT_HAS_EXPIRED:
2867         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
2868             ok = 1;
2869         }
2870     }
2871
2872     if (ok == 1) {
2873         X509 *xs = ctx->current_cert;
2874         if (X509_get_extension_flags(xs) & EXFLAG_PROXY) {
2875             unsigned int *letters = X509_STORE_CTX_get_ex_data(ctx,
2876                                                                get_proxy_auth_ex_data_idx
2877                                                                ());
2878
2879             if (letters) {
2880                 int found_any = 0;
2881                 int i;
2882                 PROXY_CERT_INFO_EXTENSION *pci =
2883                     X509_get_ext_d2i(xs, NID_proxyCertInfo,
2884                                      NULL, NULL);
2885
2886                 switch (OBJ_obj2nid(pci->proxyPolicy->policyLanguage)) {
2887                 case NID_Independent:
2888                     /*
2889                      * Completely meaningless in this program, as there's no
2890                      * way to grant explicit rights to a specific PrC.
2891                      * Basically, using id-ppl-Independent is the perfect way
2892                      * to grant no rights at all.
2893                      */
2894                     fprintf(stderr, "  Independent proxy certificate");
2895                     for (i = 0; i < 26; i++)
2896                         letters[i] = 0;
2897                     break;
2898                 case NID_id_ppl_inheritAll:
2899                     /*
2900                      * This is basically a NOP, we simply let the current
2901                      * rights stand as they are.
2902                      */
2903                     fprintf(stderr, "  Proxy certificate inherits all");
2904                     break;
2905                 default:
2906                     s = (char *)
2907                         pci->proxyPolicy->policy->data;
2908                     i = pci->proxyPolicy->policy->length;
2909
2910                     /*
2911                      * The algorithm works as follows: it is assumed that
2912                      * previous iterations or the initial granted rights has
2913                      * already set some elements of `letters'.  What we need
2914                      * to do is to clear those that weren't granted by the
2915                      * current PrC as well.  The easiest way to do this is to
2916                      * add 1 to all the elements whose letters are given with
2917                      * the current policy. That way, all elements that are
2918                      * set by the current policy and were already set by
2919                      * earlier policies and through the original grant of
2920                      * rights will get the value 2 or higher. The last thing
2921                      * to do is to sweep through `letters' and keep the
2922                      * elements having the value 2 as set, and clear all the
2923                      * others.
2924                      */
2925
2926                     printf("  Certificate proxy rights = %*.*s", i,
2927                             i, s);
2928                     while (i-- > 0) {
2929                         int c = *s++;
2930                         if (isascii(c) && isalpha(c)) {
2931                             if (islower(c))
2932                                 c = toupper(c);
2933                             letters[c - 'A']++;
2934                         }
2935                     }
2936                     for (i = 0; i < 26; i++)
2937                         if (letters[i] < 2)
2938                             letters[i] = 0;
2939                         else
2940                             letters[i] = 1;
2941                 }
2942
2943                 found_any = 0;
2944                 printf(", resulting proxy rights = ");
2945                 for (i = 0; i < 26; i++)
2946                     if (letters[i]) {
2947                         printf("%c", i + 'A');
2948                         found_any = 1;
2949                     }
2950                 if (!found_any)
2951                     printf("none");
2952                 printf("\n");
2953
2954                 PROXY_CERT_INFO_EXTENSION_free(pci);
2955             }
2956         }
2957     }
2958
2959     return (ok);
2960 }
2961
2962 static void process_proxy_debug(int indent, const char *format, ...)
2963 {
2964     /* That's 80 > */
2965     static const char indentation[] =
2966         ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
2967         ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
2968     char my_format[256];
2969     va_list args;
2970
2971     BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s",
2972                  indent, indent, indentation, format);
2973
2974     va_start(args, format);
2975     vfprintf(stderr, my_format, args);
2976     va_end(args);
2977 }
2978
2979 /*-
2980  * Priority levels:
2981  *  0   [!]var, ()
2982  *  1   & ^
2983  *  2   |
2984  */
2985 static int process_proxy_cond_adders(unsigned int letters[26],
2986                                      const char *cond, const char **cond_end,
2987                                      int *pos, int indent);
2988 static int process_proxy_cond_val(unsigned int letters[26], const char *cond,
2989                                   const char **cond_end, int *pos, int indent)
2990 {
2991     int c;
2992     int ok = 1;
2993     int negate = 0;
2994
2995     while (isspace((int)*cond)) {
2996         cond++;
2997         (*pos)++;
2998     }
2999     c = *cond;
3000
3001     if (debug)
3002         process_proxy_debug(indent,
3003                             "Start process_proxy_cond_val at position %d: %s\n",
3004                             *pos, cond);
3005
3006     while (c == '!') {
3007         negate = !negate;
3008         cond++;
3009         (*pos)++;
3010         while (isspace((int)*cond)) {
3011             cond++;
3012             (*pos)++;
3013         }
3014         c = *cond;
3015     }
3016
3017     if (c == '(') {
3018         cond++;
3019         (*pos)++;
3020         ok = process_proxy_cond_adders(letters, cond, cond_end, pos,
3021                                        indent + 1);
3022         cond = *cond_end;
3023         if (ok < 0)
3024             goto end;
3025         while (isspace((int)*cond)) {
3026             cond++;
3027             (*pos)++;
3028         }
3029         c = *cond;
3030         if (c != ')') {
3031             fprintf(stderr,
3032                     "Weird condition character in position %d: "
3033                     "%c\n", *pos, c);
3034             ok = -1;
3035             goto end;
3036         }
3037         cond++;
3038         (*pos)++;
3039     } else if (isascii(c) && isalpha(c)) {
3040         if (islower(c))
3041             c = toupper(c);
3042         ok = letters[c - 'A'];
3043         cond++;
3044         (*pos)++;
3045     } else {
3046         fprintf(stderr,
3047                 "Weird condition character in position %d: " "%c\n", *pos, c);
3048         ok = -1;
3049         goto end;
3050     }
3051  end:
3052     *cond_end = cond;
3053     if (ok >= 0 && negate)
3054         ok = !ok;
3055
3056     if (debug)
3057         process_proxy_debug(indent,
3058                             "End process_proxy_cond_val at position %d: %s, returning %d\n",
3059                             *pos, cond, ok);
3060
3061     return ok;
3062 }
3063
3064 static int process_proxy_cond_multipliers(unsigned int letters[26],
3065                                           const char *cond,
3066                                           const char **cond_end, int *pos,
3067                                           int indent)
3068 {
3069     int ok;
3070     char c;
3071
3072     if (debug)
3073         process_proxy_debug(indent,
3074                             "Start process_proxy_cond_multipliers at position %d: %s\n",
3075                             *pos, cond);
3076
3077     ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1);
3078     cond = *cond_end;
3079     if (ok < 0)
3080         goto end;
3081
3082     while (ok >= 0) {
3083         while (isspace((int)*cond)) {
3084             cond++;
3085             (*pos)++;
3086         }
3087         c = *cond;
3088
3089         switch (c) {
3090         case '&':
3091         case '^':
3092             {
3093                 int save_ok = ok;
3094
3095                 cond++;
3096                 (*pos)++;
3097                 ok = process_proxy_cond_val(letters,
3098                                             cond, cond_end, pos, indent + 1);
3099                 cond = *cond_end;
3100                 if (ok < 0)
3101                     break;
3102
3103                 switch (c) {
3104                 case '&':
3105                     ok &= save_ok;
3106                     break;
3107                 case '^':
3108                     ok ^= save_ok;
3109                     break;
3110                 default:
3111                     fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
3112                             " STOPPING\n");
3113                     EXIT(1);
3114                 }
3115             }
3116             break;
3117         default:
3118             goto end;
3119         }
3120     }
3121  end:
3122     if (debug)
3123         process_proxy_debug(indent,
3124                             "End process_proxy_cond_multipliers at position %d: %s, returning %d\n",
3125                             *pos, cond, ok);
3126
3127     *cond_end = cond;
3128     return ok;
3129 }
3130
3131 static int process_proxy_cond_adders(unsigned int letters[26],
3132                                      const char *cond, const char **cond_end,
3133                                      int *pos, int indent)
3134 {
3135     int ok;
3136     char c;
3137
3138     if (debug)
3139         process_proxy_debug(indent,
3140                             "Start process_proxy_cond_adders at position %d: %s\n",
3141                             *pos, cond);
3142
3143     ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos,
3144                                         indent + 1);
3145     cond = *cond_end;
3146     if (ok < 0)
3147         goto end;
3148
3149     while (ok >= 0) {
3150         while (isspace((int)*cond)) {
3151             cond++;
3152             (*pos)++;
3153         }
3154         c = *cond;
3155
3156         switch (c) {
3157         case '|':
3158             {
3159                 int save_ok = ok;
3160
3161                 cond++;
3162                 (*pos)++;
3163                 ok = process_proxy_cond_multipliers(letters,
3164                                                     cond, cond_end, pos,
3165                                                     indent + 1);
3166                 cond = *cond_end;
3167                 if (ok < 0)
3168                     break;
3169
3170                 switch (c) {
3171                 case '|':
3172                     ok |= save_ok;
3173                     break;
3174                 default:
3175                     fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!"
3176                             " STOPPING\n");
3177                     EXIT(1);
3178                 }
3179             }
3180             break;
3181         default:
3182             goto end;
3183         }
3184     }
3185  end:
3186     if (debug)
3187         process_proxy_debug(indent,
3188                             "End process_proxy_cond_adders at position %d: %s, returning %d\n",
3189                             *pos, cond, ok);
3190
3191     *cond_end = cond;
3192     return ok;
3193 }
3194
3195 static int process_proxy_cond(unsigned int letters[26],
3196                               const char *cond, const char **cond_end)
3197 {
3198     int pos = 1;
3199     return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1);
3200 }
3201
3202 static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
3203 {
3204     int ok = 1;
3205     struct app_verify_arg *cb_arg = arg;
3206     unsigned int letters[26];   /* only used with proxy_auth */
3207
3208     if (cb_arg->app_verify) {
3209         char *s = NULL, buf[256];
3210
3211         printf("In app_verify_callback, allowing cert. ");
3212         printf("Arg is: %s\n", cb_arg->string);
3213         printf("Finished printing do we have a context? 0x%p a cert? 0x%p\n",
3214                 (void *)ctx, (void *)ctx->cert);
3215         if (ctx->cert)
3216             s = X509_NAME_oneline(X509_get_subject_name(ctx->cert), buf, 256);
3217         if (s != NULL) {
3218             printf("cert depth=%d %s\n", ctx->error_depth, buf);
3219         }
3220         return (1);
3221     }
3222     if (cb_arg->proxy_auth) {
3223         int found_any = 0, i;
3224         char *sp;
3225
3226         for (i = 0; i < 26; i++)
3227             letters[i] = 0;
3228         for (sp = cb_arg->proxy_auth; *sp; sp++) {
3229             int c = *sp;
3230             if (isascii(c) && isalpha(c)) {
3231                 if (islower(c))
3232                     c = toupper(c);
3233                 letters[c - 'A'] = 1;
3234             }
3235         }
3236
3237         printf("  Initial proxy rights = ");
3238         for (i = 0; i < 26; i++)
3239             if (letters[i]) {
3240                 printf("%c", i + 'A');
3241                 found_any = 1;
3242             }
3243         if (!found_any)
3244             printf("none");
3245         printf("\n");
3246
3247         X509_STORE_CTX_set_ex_data(ctx,
3248                                    get_proxy_auth_ex_data_idx(), letters);
3249     }
3250     if (cb_arg->allow_proxy_certs) {
3251         X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS);
3252     }
3253     ok = X509_verify_cert(ctx);
3254
3255     if (cb_arg->proxy_auth) {
3256         if (ok > 0) {
3257             const char *cond_end = NULL;
3258
3259             ok = process_proxy_cond(letters, cb_arg->proxy_cond, &cond_end);
3260
3261             if (ok < 0)
3262                 EXIT(3);
3263             if (*cond_end) {
3264                 fprintf(stderr,
3265                         "Stopped processing condition before it's end.\n");
3266                 ok = 0;
3267             }
3268             if (!ok)
3269                 fprintf(stderr,
3270                         "Proxy rights check with condition '%s' invalid\n",
3271                         cb_arg->proxy_cond);
3272             else
3273                 printf("Proxy rights check with condition '%s' ok\n",
3274                         cb_arg->proxy_cond);
3275         }
3276     }
3277     return (ok);
3278 }
3279
3280 #ifndef OPENSSL_NO_DH
3281 /*-
3282  * These DH parameters have been generated as follows:
3283  *    $ openssl dhparam -C -noout 512
3284  *    $ openssl dhparam -C -noout 1024
3285  *    $ openssl dhparam -C -noout -dsaparam 1024
3286  * (The third function has been renamed to avoid name conflicts.)
3287  */
3288 static DH *get_dh512()
3289 {
3290     static unsigned char dh512_p[] = {
3291         0xCB, 0xC8, 0xE1, 0x86, 0xD0, 0x1F, 0x94, 0x17, 0xA6, 0x99, 0xF0,
3292         0xC6,
3293         0x1F, 0x0D, 0xAC, 0xB6, 0x25, 0x3E, 0x06, 0x39, 0xCA, 0x72, 0x04,
3294         0xB0,
3295         0x6E, 0xDA, 0xC0, 0x61, 0xE6, 0x7A, 0x77, 0x25, 0xE8, 0x3B, 0xB9,
3296         0x5F,
3297         0x9A, 0xB6, 0xB5, 0xFE, 0x99, 0x0B, 0xA1, 0x93, 0x4E, 0x35, 0x33,
3298         0xB8,
3299         0xE1, 0xF1, 0x13, 0x4F, 0x59, 0x1A, 0xD2, 0x57, 0xC0, 0x26, 0x21,
3300         0x33,
3301         0x02, 0xC5, 0xAE, 0x23,
3302     };
3303     static unsigned char dh512_g[] = {
3304         0x02,
3305     };
3306     DH *dh;
3307
3308     if ((dh = DH_new()) == NULL)
3309         return (NULL);
3310     dh->p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
3311     dh->g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
3312     if ((dh->p == NULL) || (dh->g == NULL)) {
3313         DH_free(dh);
3314         return (NULL);
3315     }
3316     return (dh);
3317 }
3318
3319 static DH *get_dh1024()
3320 {
3321     static unsigned char dh1024_p[] = {
3322         0xF8, 0x81, 0x89, 0x7D, 0x14, 0x24, 0xC5, 0xD1, 0xE6, 0xF7, 0xBF,
3323         0x3A,
3324         0xE4, 0x90, 0xF4, 0xFC, 0x73, 0xFB, 0x34, 0xB5, 0xFA, 0x4C, 0x56,
3325         0xA2,
3326         0xEA, 0xA7, 0xE9, 0xC0, 0xC0, 0xCE, 0x89, 0xE1, 0xFA, 0x63, 0x3F,
3327         0xB0,
3328         0x6B, 0x32, 0x66, 0xF1, 0xD1, 0x7B, 0xB0, 0x00, 0x8F, 0xCA, 0x87,
3329         0xC2,
3330         0xAE, 0x98, 0x89, 0x26, 0x17, 0xC2, 0x05, 0xD2, 0xEC, 0x08, 0xD0,
3331         0x8C,
3332         0xFF, 0x17, 0x52, 0x8C, 0xC5, 0x07, 0x93, 0x03, 0xB1, 0xF6, 0x2F,
3333         0xB8,
3334         0x1C, 0x52, 0x47, 0x27, 0x1B, 0xDB, 0xD1, 0x8D, 0x9D, 0x69, 0x1D,
3335         0x52,
3336         0x4B, 0x32, 0x81, 0xAA, 0x7F, 0x00, 0xC8, 0xDC, 0xE6, 0xD9, 0xCC,
3337         0xC1,
3338         0x11, 0x2D, 0x37, 0x34, 0x6C, 0xEA, 0x02, 0x97, 0x4B, 0x0E, 0xBB,
3339         0xB1,
3340         0x71, 0x33, 0x09, 0x15, 0xFD, 0xDD, 0x23, 0x87, 0x07, 0x5E, 0x89,
3341         0xAB,
3342         0x6B, 0x7C, 0x5F, 0xEC, 0xA6, 0x24, 0xDC, 0x53,
3343     };
3344     static unsigned char dh1024_g[] = {
3345         0x02,
3346     };
3347     DH *dh;
3348
3349     if ((dh = DH_new()) == NULL)
3350         return (NULL);
3351     dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
3352     dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
3353     if ((dh->p == NULL) || (dh->g == NULL)) {
3354         DH_free(dh);
3355         return (NULL);
3356     }
3357     return (dh);
3358 }
3359
3360 static DH *get_dh1024dsa()
3361 {
3362     static unsigned char dh1024_p[] = {
3363         0xC8, 0x00, 0xF7, 0x08, 0x07, 0x89, 0x4D, 0x90, 0x53, 0xF3, 0xD5,
3364         0x00,
3365         0x21, 0x1B, 0xF7, 0x31, 0xA6, 0xA2, 0xDA, 0x23, 0x9A, 0xC7, 0x87,
3366         0x19,
3367         0x3B, 0x47, 0xB6, 0x8C, 0x04, 0x6F, 0xFF, 0xC6, 0x9B, 0xB8, 0x65,
3368         0xD2,
3369         0xC2, 0x5F, 0x31, 0x83, 0x4A, 0xA7, 0x5F, 0x2F, 0x88, 0x38, 0xB6,
3370         0x55,
3371         0xCF, 0xD9, 0x87, 0x6D, 0x6F, 0x9F, 0xDA, 0xAC, 0xA6, 0x48, 0xAF,
3372         0xFC,
3373         0x33, 0x84, 0x37, 0x5B, 0x82, 0x4A, 0x31, 0x5D, 0xE7, 0xBD, 0x52,
3374         0x97,
3375         0xA1, 0x77, 0xBF, 0x10, 0x9E, 0x37, 0xEA, 0x64, 0xFA, 0xCA, 0x28,
3376         0x8D,
3377         0x9D, 0x3B, 0xD2, 0x6E, 0x09, 0x5C, 0x68, 0xC7, 0x45, 0x90, 0xFD,
3378         0xBB,
3379         0x70, 0xC9, 0x3A, 0xBB, 0xDF, 0xD4, 0x21, 0x0F, 0xC4, 0x6A, 0x3C,
3380         0xF6,
3381         0x61, 0xCF, 0x3F, 0xD6, 0x13, 0xF1, 0x5F, 0xBC, 0xCF, 0xBC, 0x26,
3382         0x9E,
3383         0xBC, 0x0B, 0xBD, 0xAB, 0x5D, 0xC9, 0x54, 0x39,
3384     };
3385     static unsigned char dh1024_g[] = {
3386         0x3B, 0x40, 0x86, 0xE7, 0xF3, 0x6C, 0xDE, 0x67, 0x1C, 0xCC, 0x80,
3387         0x05,
3388         0x5A, 0xDF, 0xFE, 0xBD, 0x20, 0x27, 0x74, 0x6C, 0x24, 0xC9, 0x03,
3389         0xF3,
3390         0xE1, 0x8D, 0xC3, 0x7D, 0x98, 0x27, 0x40, 0x08, 0xB8, 0x8C, 0x6A,
3391         0xE9,
3392         0xBB, 0x1A, 0x3A, 0xD6, 0x86, 0x83, 0x5E, 0x72, 0x41, 0xCE, 0x85,
3393         0x3C,
3394         0xD2, 0xB3, 0xFC, 0x13, 0xCE, 0x37, 0x81, 0x9E, 0x4C, 0x1C, 0x7B,
3395         0x65,
3396         0xD3, 0xE6, 0xA6, 0x00, 0xF5, 0x5A, 0x95, 0x43, 0x5E, 0x81, 0xCF,
3397         0x60,
3398         0xA2, 0x23, 0xFC, 0x36, 0xA7, 0x5D, 0x7A, 0x4C, 0x06, 0x91, 0x6E,
3399         0xF6,
3400         0x57, 0xEE, 0x36, 0xCB, 0x06, 0xEA, 0xF5, 0x3D, 0x95, 0x49, 0xCB,
3401         0xA7,
3402         0xDD, 0x81, 0xDF, 0x80, 0x09, 0x4A, 0x97, 0x4D, 0xA8, 0x22, 0x72,
3403         0xA1,
3404         0x7F, 0xC4, 0x70, 0x56, 0x70, 0xE8, 0x20, 0x10, 0x18, 0x8F, 0x2E,
3405         0x60,
3406         0x07, 0xE7, 0x68, 0x1A, 0x82, 0x5D, 0x32, 0xA2,
3407     };
3408     DH *dh;
3409
3410     if ((dh = DH_new()) == NULL)
3411         return (NULL);
3412     dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
3413     dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
3414     if ((dh->p == NULL) || (dh->g == NULL)) {
3415         DH_free(dh);
3416         return (NULL);
3417     }
3418     dh->length = 160;
3419     return (dh);
3420 }
3421 #endif
3422
3423 #ifndef OPENSSL_NO_PSK
3424 /* convert the PSK key (psk_key) in ascii to binary (psk) */
3425 static int psk_key2bn(const char *pskkey, unsigned char *psk,
3426                       unsigned int max_psk_len)
3427 {
3428     int ret;
3429     BIGNUM *bn = NULL;
3430
3431     ret = BN_hex2bn(&bn, pskkey);
3432     if (!ret) {
3433         BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
3434                    pskkey);
3435         BN_free(bn);
3436         return 0;
3437     }
3438     if (BN_num_bytes(bn) > (int)max_psk_len) {
3439         BIO_printf(bio_err,
3440                    "psk buffer of callback is too small (%d) for key (%d)\n",
3441                    max_psk_len, BN_num_bytes(bn));
3442         BN_free(bn);
3443         return 0;
3444     }
3445     ret = BN_bn2bin(bn, psk);
3446     BN_free(bn);
3447     return ret;
3448 }
3449
3450 static unsigned int psk_client_callback(SSL *ssl, const char *hint,
3451                                         char *identity,
3452                                         unsigned int max_identity_len,
3453                                         unsigned char *psk,
3454                                         unsigned int max_psk_len)
3455 {
3456     int ret;
3457     unsigned int psk_len = 0;
3458
3459     ret = BIO_snprintf(identity, max_identity_len, "Client_identity");
3460     if (ret < 0)
3461         goto out_err;
3462     if (debug)
3463         fprintf(stderr, "client: created identity '%s' len=%d\n", identity,
3464                 ret);
3465     ret = psk_key2bn(psk_key, psk, max_psk_len);
3466     if (ret < 0)
3467         goto out_err;
3468     psk_len = ret;
3469  out_err:
3470     return psk_len;
3471 }
3472
3473 static unsigned int psk_server_callback(SSL *ssl, const char *identity,
3474                                         unsigned char *psk,
3475                                         unsigned int max_psk_len)
3476 {
3477     unsigned int psk_len = 0;
3478
3479     if (strcmp(identity, "Client_identity") != 0) {
3480         BIO_printf(bio_err, "server: PSK error: client identity not found\n");
3481         return 0;
3482     }
3483     psk_len = psk_key2bn(psk_key, psk, max_psk_len);
3484     return psk_len;
3485 }
3486 #endif
3487
3488 static int do_test_cipherlist(void)
3489 {
3490 #if !defined(OPENSSL_NO_SSL3) || !defined(OPENSSL_NO_TLS1)
3491     int i = 0;
3492     const SSL_METHOD *meth;
3493     const SSL_CIPHER *ci, *tci = NULL;
3494 #endif
3495
3496 #ifndef OPENSSL_NO_SSL3
3497     meth = SSLv3_method();
3498     tci = NULL;
3499     while ((ci = meth->get_cipher(i++)) != NULL) {
3500         if (tci != NULL)
3501             if (ci->id >= tci->id) {
3502                 fprintf(stderr, "testing SSLv3 cipher list order: ");
3503                 fprintf(stderr, "failed %x vs. %x\n", ci->id, tci->id);
3504                 return 0;
3505             }
3506         tci = ci;
3507     }
3508 #endif
3509 #ifndef OPENSSL_NO_TLS1
3510     meth = TLSv1_method();
3511     tci = NULL;
3512     while ((ci = meth->get_cipher(i++)) != NULL) {
3513         if (tci != NULL)
3514             if (ci->id >= tci->id) {
3515                 fprintf(stderr, "testing TLSv1 cipher list order: ");
3516                 fprintf(stderr, "failed %x vs. %x\n", ci->id, tci->id);
3517                 return 0;
3518             }
3519         tci = ci;
3520     }
3521 #endif
3522
3523     return 1;
3524 }