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