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