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